diff --git a/lib/app_state.dart b/lib/app_state.dart index 403678e4be60f2c25deac201a561aa69be2ddae4..dbce18976ce358412b53aea02cae509b641e1f8b 100644 --- a/lib/app_state.dart +++ b/lib/app_state.dart @@ -3,7 +3,7 @@ import 'dart:math'; import 'package:fk/meta.dart'; import 'package:fk/sync/components/connectivity_service.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:collection/collection.dart'; import 'package:convert/convert.dart'; diff --git a/lib/app_widget.dart b/lib/app_widget.dart index 8af2d3d9a0c1f224a1aeccb1234018f5fde47c6b..d02fa2ca2ecead3cb2b5e2ae74a08492f779f785 100644 --- a/lib/app_widget.dart +++ b/lib/app_widget.dart @@ -7,7 +7,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:fk/app_state.dart'; import 'package:fk/connections.dart'; diff --git a/lib/calibration/calibration_model.dart b/lib/calibration/calibration_model.dart index f87039e2eb846337a59bba3392cedfec00a34170..7e00971451182eddd49145e92800cef982366b8c 100644 --- a/lib/calibration/calibration_model.dart +++ b/lib/calibration/calibration_model.dart @@ -1,6 +1,6 @@ import 'package:caldor/calibration.dart'; import 'package:collection/collection.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:fk/diagnostics.dart'; import 'package:fk/gen/api.dart'; import 'package:fk/meta.dart'; diff --git a/lib/calibration/calibration_page.dart b/lib/calibration/calibration_page.dart index 94599fc1d3634ed713ab5f8d94098bc43b581c3d..d8c551524be8c7d06cd33164718227c68af3e4dc 100644 --- a/lib/calibration/calibration_page.dart +++ b/lib/calibration/calibration_page.dart @@ -1,7 +1,7 @@ import 'package:fk/models/known_stations_model.dart'; import 'package:fk/reader/screens.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:provider/provider.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:caldor/calibration.dart'; diff --git a/lib/calibration/calibration_review_widget.dart b/lib/calibration/calibration_review_widget.dart index ef9c5dae871379cbedf56c46abb7b3f642e46595..c6ba96b11cb178d2d798abcc822335ee928d5310 100644 --- a/lib/calibration/calibration_review_widget.dart +++ b/lib/calibration/calibration_review_widget.dart @@ -1,6 +1,6 @@ import 'package:fk/gen/api.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:provider/provider.dart'; import 'package:intl/intl.dart'; diff --git a/lib/calibration/standard_form.dart b/lib/calibration/standard_form.dart index 0244a7efcae95e5c66dcaa0716e19edf4de3c914..2d18b70c8acda93267a7d8f3091d8ca8ffbf2749 100644 --- a/lib/calibration/standard_form.dart +++ b/lib/calibration/standard_form.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:provider/provider.dart'; import 'package:caldor/calibration.dart'; diff --git a/lib/common_widgets.dart b/lib/common_widgets.dart index 39ae98fed8faf46680c2372bcf1d03a3872f0fb0..a74519ffe49a8c405b296ae7b68a0987f3a81c9a 100644 --- a/lib/common_widgets.dart +++ b/lib/common_widgets.dart @@ -1,7 +1,7 @@ import 'package:collection/collection.dart'; import 'package:fk/constants.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:flutter_svg/svg.dart'; Widget dismissKeyboardOnOutsideGap(Widget body) { diff --git a/lib/components/last_connected.dart b/lib/components/last_connected.dart index e4bd9b0d3f6f340f0369c3291d2f3580f453b0b2..739e5c6c8cc14593bb57b097460e41586ec86509 100644 --- a/lib/components/last_connected.dart +++ b/lib/components/last_connected.dart @@ -2,7 +2,7 @@ import 'package:fk/constants.dart'; import 'package:fk/gen/api.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:intl/intl.dart'; class LastConnected extends StatelessWidget { diff --git a/lib/components/login_required_widget.dart b/lib/components/login_required_widget.dart index 9c23538c2f48a286a3184db99927abc546d6894c..a2b901cd511ba3cb3f0750b6b17a111f6ac4f9fb 100644 --- a/lib/components/login_required_widget.dart +++ b/lib/components/login_required_widget.dart @@ -1,7 +1,7 @@ import 'package:fk/app_state.dart'; import 'package:fk/common_widgets.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import '../settings/edit_account_page.dart'; class LoginRequiredWidget extends StatelessWidget { @@ -25,7 +25,11 @@ class LoginRequiredWidget extends StatelessWidget { MaterialPageRoute( builder: (context) => EditAccountPage( original: PortalAccount( - email: "", name: "", tokens: null, active: false, validity: Validity.unchecked), + email: "", + name: "", + tokens: null, + active: false, + validity: Validity.unchecked), ), ), ); @@ -72,4 +76,4 @@ class MessageAndButton extends StatelessWidget { ], ); } -} \ No newline at end of file +} diff --git a/lib/data/export_widget.dart b/lib/data/export_widget.dart index ef27183e1a017072722ab2d120a080885bd29620..321a2bf72cc5dc649ace1dad72808ae49a6cb2ed 100644 --- a/lib/data/export_widget.dart +++ b/lib/data/export_widget.dart @@ -1,7 +1,7 @@ import 'dart:collection'; import 'dart:io'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:fk/common_widgets.dart'; import 'package:fk/data/export.dart'; import 'package:fk/diagnostics.dart'; diff --git a/lib/deploy/configure_schedule_page.dart b/lib/deploy/configure_schedule_page.dart index eeef8e89c31f66b30533652aee11cded54a9d6ed..1b1ad0bc576346936e1547386726c2e02036d48e 100644 --- a/lib/deploy/configure_schedule_page.dart +++ b/lib/deploy/configure_schedule_page.dart @@ -6,7 +6,7 @@ import 'package:fk/gen/api.dart'; import 'package:flutter/material.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:provider/provider.dart'; diff --git a/lib/deploy/deploy_page.dart b/lib/deploy/deploy_page.dart index 1e6c925f58c4b8289ee8b9e16bb7173ae32e923e..0b872ad50bf41c2c2f14a2955de80ccc5a8e927b 100644 --- a/lib/deploy/deploy_page.dart +++ b/lib/deploy/deploy_page.dart @@ -9,11 +9,14 @@ import 'package:fk/providers.dart'; import 'package:fk/unknown_station_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:provider/provider.dart'; +// Type definition for form values +typedef FormValues = Map; + class DeployStationPage extends StatelessWidget { final StationModel station; @@ -80,8 +83,8 @@ class _DeployFormState extends State { onPressed: () async { if (_formKey.currentState!.saveAndValidate()) { final messenger = ScaffoldMessenger.of(context); - final values = _formKey.currentState!.value; - final String location = values["location"]; + final values = _formKey.currentState!.value as FormValues; + final String location = values["location"] as String; final schedule = ScheduleHelpers.fromForm(values); final overlay = context.loaderOverlay; overlay.show(); @@ -117,9 +120,9 @@ class _DeployFormState extends State { } extension ScheduleHelpers on Schedule_Every { - static Schedule_Every fromForm(Map values) { - final int every = int.parse(values["scheduleEvery"]); - final UnitOfTime unit = values["scheduleUnit"]; + static Schedule_Every fromForm(FormValues values) { + final int every = int.parse(values["scheduleEvery"] as String); + final UnitOfTime unit = values["scheduleUnit"] as UnitOfTime; return ScheduleHelpers.from(every, unit); } diff --git a/lib/home_page.dart b/lib/home_page.dart index 3243d76fe42272969640c10e3ad968fb7fa4ac90..4e45266c70104576da255abd19af14a31d56acb6 100644 --- a/lib/home_page.dart +++ b/lib/home_page.dart @@ -2,7 +2,7 @@ import 'package:fk/diagnostics.dart'; import 'package:fk/preferences.dart'; import 'package:fk/settings/help_page.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:flutter_svg/svg.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 03c5c7ee6ef7431b286b7de210255403ceab765a..5188dcfc67607601f74c46a87253be6dc5845fa0 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1,30 +1,122 @@ { "fieldKit": "FieldKit", + "loadingConfiguration": "Configuración", + "loadingEnvironment": "Entorno", + "loadingLocale": "Local", "welcomeTitle": "¡Bienvenido!", "welcomeMessage": "Nuestra aplicación móvil facilita la configuración e instalación de tu estación FieldKit.", "welcomeButton": "Empezar", "skipInstructions": "Saltar instrucciones", + "errorStartingApp": "Error al inicializar la aplicación.", "stationsTab": "Estaciones", - "dataSyncTab": "Datos", + "dataSyncTab": "Sincronización de datos", "settingsTab": "Configuración", - "dataSyncTitle": "Datos", - "alertTitle": "¡Aviso!", + "helpTab": "Ayuda", + "dataSyncTitle": "Sincronización de datos", + "alertTitle": "Importante", "login": "Iniciar sesión", "dataLoginMessage": "Para subir datos necesitas iniciar sesión:", "modulesTitle": "Módulos", - "connectStation": "Conectar una estación", + "addModulesButton": "Añadir módulos", + "noModulesMessage": "Tu estación necesita módulos para completar la configuración, despliegue y captura de datos.", + "noModulesTitle": "No hay módulos conectados", + "connectStation": "Conectar estación", "noStationsDescription": "No tienes estaciones. Agrega una estación para empezar a recoger datos.", - "stationScan": "Tocar dos veces para buscar estaciones.", - "locationDenied": "¡Permiso de ubicación denegado!", + "noStationsDescription2": "No tienes estaciones. Agrega una estación para calibrar módulos.", + "noStationsWhatIsStation": "¿Qué es una estación FieldKit?", + "locationDenied": "Permiso de ubicación denegado", "mapFullScreen": "Mapa de pantalla completa", "lastReadingLabel": " (Última lectura)", + "daysHoursMinutes": "días h min", "download": "Descargar", "upload": "Subir", - "readingsAvailable": "{readings} Se puede descargar lecturas.", - "readingsAvailableAndAlreadyHave": "Hay {alreadyHave} lecturas y {readings} más están listas para descargar.", - "syncProgressReadings": "Recibidas {received} de {readings} lecturas.", + "readingsUploadable": "{readings, plural, zero{0 subidas} one{1 subida} other{{readings} subidas}}", + "@readingsUploadable": { + "placeholders": { + "readings": { + "type": "num", + "format": "decimalPattern" + } + } + }, + "readingsDownloadable": "{readings, plural, zero{0 descardas} one{1 descargada} other{{readings} descargadas}}", + "@readingsDownloadable": { + "placeholders": { + "readings": { + "type": "num", + "format": "decimalPattern" + } + } + }, + "downloadIncomplete": "Solo se ha descargado {readings} de {total}.", + "@downloadIncomplete": { + "placeholders": { + "readings": { + "type": "num", + "format": "decimalPattern" + }, + "total": { + "type": "num", + "format": "decimalPattern" + } + } + }, + "downloadProgress": "{readings} descargado...", + "@downloadProgress": { + "placeholders": { + "readings": { + "type": "num", + "format": "decimalPattern" + }, + "total": { + "type": "num", + "format": "decimalPattern" + } + } + }, + "uploadProgress": "Subiendo...", + "@uploadProgress": { + "placeholders": {} + }, + "readingsUploaded": "{readings, plural, zero{0 lecturas subidas} one{1 lectura subida} other{{readings} lecturas subidas}}", + "@readingsUploaded": { + "placeholders": { + "readings": { + "type": "num", + "format": "decimalPattern" + } + } + }, + "readingsDownloaded": "{readings, plural, zero{0 lecturas descargadas} one{1 lectura descargada} other{{readings} lecturas descargadas}}", + "@readingsDownloaded": { + "placeholders": { + "readings": { + "type": "num", + "format": "decimalPattern" + } + } + }, + "uploading": "Subiendo", + "syncUploading": "Subiendo...", + "syncDownloading": "Descargando...", + "readytoDownload": "Listo para descargar", + "readytoUpload": "Listo para subir", + "connectivityIssue": "Problema de conectividad de subida", + "authenticationIssue": "Problema de iniciar sesión de subida", + "uploadFailed": "Error al subir", + "downloadFailed": "Error al descargar", + "syncDismissOk": "OK", + "syncDownloadSuccess": "¡Descarga exitosa!", + "syncUploadSuccess": "¡Subida exitosa!", + "syncDownloadFailed": "Error: Descarga fallida. \nEspera unos segundos e inténtalo de nuevo.", + "syncUploadFailed": "Error: Error al subir. \nConéctate a internet e inténtalo de nuevo.", "syncWorking": "Procesando...", + "syncDisconnected": "Estación desconectada.", "syncElapsed": "{elapsed} pasado.", + "syncNoInternet": "No hay conexión a internet.", + "syncNoAuthentication": "No has iniciado sesión.", + "syncNoUpload": "No hay datos para subir.", + "syncNoDownload": "No hay datos para descargar.", "syncPercentageComplete": "{complete} completo.", "@syncPercentageComplete": { "placeholders": { @@ -37,14 +129,29 @@ } } }, - "syncUpgradeRequiredMessage": "Se necesita una actualización para sincronizar los datos de esta estación.", - "syncManageFirmware": "Administrar firmware", "quickTip": "Sugerencia", + "stationConnected": "Conectado", + "lastConnected": "Última conexión", + "notConnected": "No conectado", + "lastConnectedSince": "Desde {date}", + "manageFirmwareButton": "Administrar firmware", + "importantNoteTitle": "Nota importante: ", + "updateRequiredDataPage": "Se necesita una actualización para sincronizar los datos de esta estación.", + "connectStationAlert": "Para subir datos, conéctate a Internet.", + "loginStationAlert": "Para subir datos", + "loginAndConnectStationAlert": "Para subir datos, conéctate a Internet y", + "loginLink": "iniciar sesión", "deployButton": "Desplegar", "deployTitle": "Desplegar estación", "deployLocation": "Nombrar tu ubicación", + "stationDeployed": "Estación desplegada", + "noStationsAvailable": "No hay estaciones disponibles", + "connectToStation": "Por favor, conéctate a una estación para continuar", "myStationsTitle": "Mis estaciones", + "deployedAt": "Desplegado", "readyToDeploy": "Listo para desplegar", + "readyToCalibrate": "Listo para calibrar", + "calibratingBusy": "Calibración...", "busyWorking": "Ocupado...", "busyUploading": "Subiendo...", "busyDownloading": "Descargando...", @@ -52,12 +159,22 @@ "contacting": "Contactando...", "unknownStationTitle": "Estación desconocida", "backButtonTitle": "Atrás", + "bytesUsed": "{bytesUsed}b de 512MB", "calibrationStartTimer": "Iniciar temporizador", "calibrationTitle": "Calibración", "calibrateButton": "Calibrar", "calibrationDelete": "Eliminar", "calibrationBack": "Atrás", "calibrationKeepButton": "Mantener", + "calibrationSaveButton": "Guardar calibraciones", + "calibrationPoint": "Punto de calibración {step}", + "@calibrationPoint": { + "placeholders": { + "step": { + "type": "int" + } + } + }, "factory": "Fábrica", "uncalibrated": "No calibrado", "calibrated": "Calibrado", @@ -72,13 +189,23 @@ "oopsBugTitle": "Vaya, ¿un error?", "standard": "Estándar", "minSec": "min s", - "countdownInstructions": "Pulsa el botón Calibrar para grabar el valor del sensor y el valor estándar.", + "countdownInstructions": "Mientras esperas a que el valor del sensor se estabilice, introduce el valor estándar.", + "countdownInstructions2": "Pulsa el botón Calibrar para grabar el valor del sensor y el valor estándar.", "calibrationMessage": "La grabación de estos valores juntos nos permite calibrar el sensor más adelante.", "standardFieldLabel": "Estándar", "backAreYouSure": "¿Estás seguro?", "backWarning": "Navegar hacia fuera requerirá iniciar esta calibración.", "settingsTitle": "Configuración", + "readingsSchedule": "Horario de captura de datos", + "scheduleUpdated": "Horario actualizado", + "settingsAdvanced": "Configuración avanzada", + "httpSync": "Sincronización HTTP", + "httpSyncWarning": "Este es un ajuste avanzado, provisto para compatibilidad hacia atrás y situaciones de solución de problemas. Lo mejor es activar sólo si se sabes lo que hace.", + "tailStationLogs": "Registros de la estación finales", "settingsGeneral": "General", + "settingsNameHint": "Nombre de estación", + "nameConfigSuccess": "Nombre de la estación actualizado", + "errorMessage": "Error: {message}", "settingsFirmware": "Firmware", "settingsModules": "Módulos", "settingsWifi": "WiFi", @@ -90,14 +217,39 @@ "settingsLoraVerify": "Verificar", "settingsLanguage": "Idioma", "endDeployment": "Finalizar despliegue", - "languageEnglish": "English", - "languageSpanish": "Español", + "error": "Error", + "ok": "OK", + "save": "Guardar", + "submit": "Enviar", + "nameErrorDescription": "El nombre sólo puede contener letras, números, guiones bajos y espacios.", + "settingsExport": "Exportar CSV", + "exportStart": "Iniciar", + "exportShare": "Compartir", + "exportCompleted": "Completado", + "exportShareSubject": "Exportar CSV", + "exportShareText": "Compartir CSV exportado", + "exportShareUnsupported": "Compartir no está soportado en esta plataforma.", + "exportNoData": "No hay datos sincronizados, por favor sincroniza los datos.", + "exportPossible": "{readings} disponible para exportar.", + "@exportPossible": { + "placeholders": { + "readings": { + "type": "num", + "format": "decimalPattern" + } + } + }, + "onboardingNextButton": "Siguiente", + "onboardingCompleteButton": "Hecho", + "languageEnglish": "Inglés", + "languageSpanish": "Español", "eventUnknown": "Evento desconocido", "eventRestart": "Reiniciar evento", "eventLora": "Evento LoRa", "eventTime": "Tiempo", "eventCode": "Código", "eventReason": "Razón", + "noEvents": "No hay eventos", "networksTitle": "Redes WiFi", "networkAddButton": "Añadir red", "networkEditTitle": "Red WiFi", @@ -121,28 +273,39 @@ "hexStringValidationFailed": "Se esperaba una cadena hexadecimal válida.", "firmwareTitle": "Firmware", "firmwareUpgrade": "Actualizar", + "firmwareContinue": "Continuar actualización", + "firmwareCancel": "Cancelar", "firmwareSwitch": "Cambiar", "firmwareStarting": "Iniciando...", "firmwareUploading": "Subiendo...", "firmwareRestarting": "Reiniciando...", + "firmwareReconnectTimeout": "No se puede reconectar a la estación.", "firmwareCompleted": "Completado", - "firmwareFailed": "¡Fallo!", + "firmwareFailed": "Se ha producido un error inesperado. Por favor, póngate en contacto con el servicio de asistencia de FieldKit.", + "firmwareSdCardError": "Necesitas una tarjeta SD para actualizar el firmware.", "firmwareConnected": "Conectado", "firmwareNotConnected": "No conectado", - "firmwareVersion": "Versión del firmware: {firmwareVersion}", + "firmwareVersion": "Versión: {firmwareVersion}", "firmwareUpdated": "El firmware está actualizado", "firmwareNotUpdated": "El firmware no está actualizado", "firmwareUpdate": "Actualizar firmware", + "firmwareDismiss": "OK", "firmwareCheck": "Buscar nuevas versiones de firmware", - "firmwareReleased": "Versión publicada: {firmwareReleaseDate}", - "firmwareTip": "Asegúrate de estar conectado a Internet antes de comprobar si hay nuevas versiones de firmware.", + "firmwareReleased": "Publicada: {firmwareReleaseDate}", + "firmwareTip": "Durante la actualización la estación puede desconectarse mientras se reinicia. Si es así, asegúrate de volver a conectar a tu estación.", + "firmwarePrepareTitle": "Preparar para actualizar", + "firmwarePrepareTime": "Esta actualización puede durar varios minutos.", + "firmwarePrepareSd": "Necesitarás una tarjeta SD en tu estación para completar la actualización.", + "firmwarePreparePower": "Mantén tu estación conectada y cerca de tu dispositivo o smartphone.", + "firmwarePrepareConnection": "Tu estación se reiniciará y es posible que tengas que volver a conectar tu teléfono a la estación.", "settingsAccounts": "Cuentas", "accountsTitle": "Cuentas", "accountsAddButton": "Añadir una cuenta", - "accountsNoneCreatedTitle": "¡Parece que todavía no hay cuentas creadas!", + "accountsNoneCreatedTitle": "Parece que todavía no hay cuentas creadas.", "accountsNoneCreatedMessage": "Tener una cuenta FieldKit es útil para actualizar la información de tu estación en el portal en línea y de vez en cuando acceder al firmware específico del usuario. ¿Estás conectado al internet? ¡Una vez que estés, configuremos una cuenta para ti!", "accountAddTitle": "Añadir cuenta", "accountEditTitle": "Editar cuenta", + "noInternetConnection": "Conecta tu teléfono a internet para iniciar sesión.", "accountName": "Nombre", "accountEmail": "Correo electrónico", "accountPassword": "Contraseña", @@ -150,7 +313,7 @@ "accountConfirmPasswordMatch": "Las contraseñas deben coincidir.", "accountRegistrationFailed": "Se ha producido un error al registrar tu cuenta. Por favor, comprueba tu correo electrónico y contraseña.", "accountFormFail": "Email o contraseña inválidos.", - "accountSaveButton": "Guardar", + "accountSaveButton": "Iniciar sesión", "accountRegisterButton": "Registrarte", "accountRemoveButton": "Eliminar", "accountRepairButton": "Iniciar sesión", @@ -160,10 +323,15 @@ "accountUnknown": "No está seguro de esta cuenta. ¿Falla?", "accountConnectivity": "Hubo un problema al conectar con esta cuenta. Si el problema fue relacionado con la red, esto se corregirá a sí mismo.", "accountCreated": "¡Registro exitoso! Por favor revisa tu correo electrónico para obtener instrucciones de verificación antes de iniciar sesión.", + "accountUpdated": "Tu cuenta se ha actualizado correctamente.", + "unknownError": "Se ha producido un error desconocido. Inténtalo de nuevo más tarde.", + "invalidCredentialsError": "Las credenciales introducidas son incorrectas. Por favor, inténtalo de nuevo.", + "serverError": "Hubo un problema al conectar con el servidor. Por favor, comprueba tu conexión e inténtalo de nuevo.", "bayNumber": "Bahía #{bay}", "configureButton": "Configurar", "batteryLife": "Carga de la batería", - "memoryUsage": "Memoria", + "memoryUsage": "Memoria utilizada", + "confirmForgetStation": "¿Estás seguro de que quieres eliminar esta estación?", "confirmClearCalibrationTitle": "Borrar calibración", "confirmRemoveAccountTitle": "Eliminar cuenta", "confirmDelete": "¿Estás seguro?", @@ -173,11 +341,34 @@ "helpTitle": "Ayuda", "helpCheckList": "Lista de verificación previa a la instalación", "tutorialGuide": "Guía tutorial", + "offlineProductGuide": "Guía de producto (sin conexión)", + "search": "Buscar", + "enterSearchTerm": "Ingresar término de búsqueda", + "cancel": "Cancelar", + "errorLoadingPdf": "Error al cargar PDF", "appVersion": "Versión de App", + "errorLoadingVersion": "Error al cargar la versión de la aplicación", "noUpdates": "No hay actualizaciones disponibles", - "yesUpdates": "¡Pulsa para actualizar!", - "helpUploadLogs": "Enviar registros", + "yesUpdates": "Pulsa para actualizar", + "helpUploadLogs": "Enviar diagnóstico", + "helpCreateBackup": "Crear copia de seguridad del teléfono", + "reportIssue": "Reportar problema", + "reportIssueDescription": "Describe el problema que estás experimentando", + "reportIssueEmail": "Dirección de email", + "reportIssueSubmit": "Enviar", + "reportIssueSubmitted": "Problema enviado", + "reportIssueThankYou": "Gracias por tus comentarios. Revisaremos tu informe y nos pondremos en contacto contigo pronto.", + "reportIssueEmailRequired": "Por favor incluye un correo electrónico", + "reportIssueEmailInvalid": "Por favor, introduce una dirección de correo válida", + "photos": "Fotos", + "attachPhotos": "Adjuntar fotos", + "takePhoto": "Tomar foto", + "helpBackupCreated": "Copia de seguridad en el teléfono creada", + "helpBackupFailed": "Fallo en la copia de seguridad en el teléfono", + "backupShareSubject": "Copia de seguridad FieldKit", + "backupShareMessage": "Copia de seguridad de la aplicación FieldKit.", "developerBuild": "Versión de desarrollador", + "logsUploaded": "Registros subidos", "legalTitle": "Legal", "termsOfService": "Términos de servicio", "privacyPolicy": "Política de privacidad", @@ -210,7 +401,7 @@ "sensorDiagnosticsBatteryVoltage": "Batería", "sensorDiagnosticsBatteryVBus": "Batería (VBus)", "sensorDiagnosticsBatteryVs": "Batería (Vs)", - "sensorDiagnosticsBatteryMa": "Battería (mA)", + "sensorDiagnosticsBatteryMa": "Batería (mA)", "sensorDiagnosticsBatteryPower": "Batería (Potencia)", "sensorDiagnosticsSolarVBus": "Solar (VBus)", "sensorDiagnosticsSolarVs": "Solar (Vs)", @@ -236,6 +427,7 @@ "sensorDistanceDistance0": "Distancia 0", "sensorDistanceDistance1": "Distancia 1", "sensorDistanceDistance2": "Distancia 2", + "sensorDistanceCalibration": "Cal de Distancia", "sensorRandomRandom0": "Aleatorio 0", "sensorRandomRandom1": "Aleatorio 1", "sensorRandomRandom2": "Aleatorio 2", @@ -245,5 +437,32 @@ "sensorRandomRandom6": "Aleatorio 6", "sensorRandomRandom7": "Aleatorio 7", "sensorRandomRandom8": "Aleatorio 8", - "sensorRandomRandom9": "Aleatorio 9" + "sensorRandomRandom9": "Aleatorio 9", + "helpSettingsIconActive": "Icono de configuración de ayuda - activo", + "helpSettingsIconInactive": "Icono de configuración de ayuda - inactivo", + "helpSettingsIcon": "Icono de configuración de ayuda", + "accountSettingsIcon": "Icono de configuración de cuenta", + "languageSettingsIcon": "Icono de configuración de idioma", + "legalSettingsIcon": "Icono de configuración legal", + "stationDisconnectedIcon": "Icono de la estación desconectada", + "stationDisconnectedTitle": "Estación desconectada", + "troubleshootingSteps": "Pasos de solución de problemas:", + "getHelpButton": "Obtener ayuda", + "stationConnectedMessage": "Estación conectada", + "stationDisconnectedMessage": "Estación desconectada", + "pressWifiButtonAgain": "1. Pulse de nuevo el botón WiFi", + "turnOnStationWifi": "2. Enciende el punto de acceso WiFi directamente desde el menú de configuración de la estación", + "visitSupportWebsite": "3. Si todavía tienes problemas, visita ", + "assembleStation": "Ensamblar la estación", + "@assembleStation": { + "description": "Title for station assembly help section" + }, + "stationSetupInstructions": "Instrucciones de configuración de la estación", + "phModuleSetup": "Configuración del módulo pH", + "waterTempModuleSetup": "Configuración del módulo de temperatura del agua", + "conductivityModuleSetup": "Configuración del módulo de conductividad", + "doModuleSetup": "Configuración del módulo de oxígeno disuelto", + "distanceModuleSetup": "Configuración del módulo de distancia", + "weatherModuleSetup": "Configuración del módulo meteorológico", + "noModuleDescription": "Ninguna estación tiene este tipo de módulo instalado. Instala este módulo en una estación para calibrarlo." } \ No newline at end of file diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart new file mode 100644 index 0000000000000000000000000000000000000000..1100eee3b1096fed6684b04342d9741b34d2ff68 --- /dev/null +++ b/lib/l10n/app_localizations.dart @@ -0,0 +1,2353 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'app_localizations_en.dart'; +import 'app_localizations_es.dart'; + +// ignore_for_file: type=lint + +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. +/// +/// Applications need to include `AppLocalizations.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'l10n/app_localizations.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: AppLocalizations.localizationsDelegates, +/// supportedLocales: AppLocalizations.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the AppLocalizations.supportedLocales +/// property. +abstract class AppLocalizations { + AppLocalizations(String locale) + : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static AppLocalizations? of(BuildContext context) { + return Localizations.of(context, AppLocalizations); + } + + static const LocalizationsDelegate delegate = + _AppLocalizationsDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = + >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [ + Locale('en'), + Locale('es') + ]; + + /// No description provided for @fieldKit. + /// + /// In en, this message translates to: + /// **'FieldKit'** + String get fieldKit; + + /// No description provided for @loadingConfiguration. + /// + /// In en, this message translates to: + /// **'Configuration'** + String get loadingConfiguration; + + /// No description provided for @loadingEnvironment. + /// + /// In en, this message translates to: + /// **'Environment'** + String get loadingEnvironment; + + /// No description provided for @loadingLocale. + /// + /// In en, this message translates to: + /// **'Locale'** + String get loadingLocale; + + /// No description provided for @welcomeTitle. + /// + /// In en, this message translates to: + /// **'Welcome!'** + String get welcomeTitle; + + /// No description provided for @welcomeMessage. + /// + /// In en, this message translates to: + /// **'Our mobile app makes it easy to set up and deploy your FieldKit station.'** + String get welcomeMessage; + + /// No description provided for @welcomeButton. + /// + /// In en, this message translates to: + /// **'Get Started'** + String get welcomeButton; + + /// No description provided for @skipInstructions. + /// + /// In en, this message translates to: + /// **'Skip Instructions'** + String get skipInstructions; + + /// No description provided for @errorStartingApp. + /// + /// In en, this message translates to: + /// **'Error initializing app.'** + String get errorStartingApp; + + /// No description provided for @stationsTab. + /// + /// In en, this message translates to: + /// **'Stations'** + String get stationsTab; + + /// No description provided for @dataSyncTab. + /// + /// In en, this message translates to: + /// **'Data Sync'** + String get dataSyncTab; + + /// No description provided for @settingsTab. + /// + /// In en, this message translates to: + /// **'Settings'** + String get settingsTab; + + /// No description provided for @helpTab. + /// + /// In en, this message translates to: + /// **'Help'** + String get helpTab; + + /// No description provided for @dataSyncTitle. + /// + /// In en, this message translates to: + /// **'Data Sync'** + String get dataSyncTitle; + + /// No description provided for @alertTitle. + /// + /// In en, this message translates to: + /// **'Important'** + String get alertTitle; + + /// No description provided for @login. + /// + /// In en, this message translates to: + /// **'Login'** + String get login; + + /// No description provided for @dataLoginMessage. + /// + /// In en, this message translates to: + /// **'To upload data you need to login:'** + String get dataLoginMessage; + + /// No description provided for @modulesTitle. + /// + /// In en, this message translates to: + /// **'Modules'** + String get modulesTitle; + + /// No description provided for @addModulesButton. + /// + /// In en, this message translates to: + /// **'Add Modules'** + String get addModulesButton; + + /// No description provided for @noModulesMessage. + /// + /// In en, this message translates to: + /// **'Your station needs modules in order to complete setup, deploy, and capture data.'** + String get noModulesMessage; + + /// No description provided for @noModulesTitle. + /// + /// In en, this message translates to: + /// **'No Modules Attached'** + String get noModulesTitle; + + /// No description provided for @connectStation. + /// + /// In en, this message translates to: + /// **'Connect Station'** + String get connectStation; + + /// No description provided for @noStationsDescription. + /// + /// In en, this message translates to: + /// **'You have no stations. Add a station to start collecting data.'** + String get noStationsDescription; + + /// No description provided for @noStationsDescription2. + /// + /// In en, this message translates to: + /// **'You have no stations. Add a station in order to calibrate modules.'** + String get noStationsDescription2; + + /// No description provided for @noStationsWhatIsStation. + /// + /// In en, this message translates to: + /// **'What is a FieldKit Station?'** + String get noStationsWhatIsStation; + + /// No description provided for @locationDenied. + /// + /// In en, this message translates to: + /// **'Location permission denied'** + String get locationDenied; + + /// No description provided for @mapFullScreen. + /// + /// In en, this message translates to: + /// **'Full Screen Map'** + String get mapFullScreen; + + /// No description provided for @lastReadingLabel. + /// + /// In en, this message translates to: + /// **' (Last Reading)'** + String get lastReadingLabel; + + /// No description provided for @daysHoursMinutes. + /// + /// In en, this message translates to: + /// **'days hrs mins'** + String get daysHoursMinutes; + + /// No description provided for @download. + /// + /// In en, this message translates to: + /// **'Download'** + String get download; + + /// No description provided for @upload. + /// + /// In en, this message translates to: + /// **'Upload'** + String get upload; + + /// No description provided for @readingsUploadable. + /// + /// In en, this message translates to: + /// **'{readings, plural, zero{0 Uploads} one{1 Upload} other{{readings} Uploads}}'** + String readingsUploadable(num readings); + + /// No description provided for @readingsDownloadable. + /// + /// In en, this message translates to: + /// **'{readings, plural, zero{0 Downloads} one{1 Downloads} other{{readings} Downloads}}'** + String readingsDownloadable(num readings); + + /// No description provided for @downloadIncomplete. + /// + /// In en, this message translates to: + /// **'Only {readings} of {total} downloaded.'** + String downloadIncomplete(num readings, num total); + + /// No description provided for @downloadProgress. + /// + /// In en, this message translates to: + /// **'{readings} Downloaded...'** + String downloadProgress(num readings, num total); + + /// No description provided for @uploadProgress. + /// + /// In en, this message translates to: + /// **'Uploading...'** + String get uploadProgress; + + /// No description provided for @readingsUploaded. + /// + /// In en, this message translates to: + /// **'{readings, plural, zero{0 Readings Uploaded} one{1 Reading Uploaded} other{{readings} Readings Uploaded}}'** + String readingsUploaded(num readings); + + /// No description provided for @readingsDownloaded. + /// + /// In en, this message translates to: + /// **'{readings, plural, zero{0 Readings Downloaded} one{1 Reading Downloaded} other{{readings} Readings Downloaded}}'** + String readingsDownloaded(num readings); + + /// No description provided for @uploading. + /// + /// In en, this message translates to: + /// **'Uploading'** + String get uploading; + + /// No description provided for @syncUploading. + /// + /// In en, this message translates to: + /// **'Uploading...'** + String get syncUploading; + + /// No description provided for @syncDownloading. + /// + /// In en, this message translates to: + /// **'Downloaing...'** + String get syncDownloading; + + /// No description provided for @readytoDownload. + /// + /// In en, this message translates to: + /// **'Ready to download'** + String get readytoDownload; + + /// No description provided for @readytoUpload. + /// + /// In en, this message translates to: + /// **'Ready to upload'** + String get readytoUpload; + + /// No description provided for @connectivityIssue. + /// + /// In en, this message translates to: + /// **'Upload Connectivity Issue Occuring'** + String get connectivityIssue; + + /// No description provided for @authenticationIssue. + /// + /// In en, this message translates to: + /// **'Upload Login Issue Occuring'** + String get authenticationIssue; + + /// No description provided for @uploadFailed. + /// + /// In en, this message translates to: + /// **'Upload Failed'** + String get uploadFailed; + + /// No description provided for @downloadFailed. + /// + /// In en, this message translates to: + /// **'Download Failed'** + String get downloadFailed; + + /// No description provided for @syncDismissOk. + /// + /// In en, this message translates to: + /// **'OK'** + String get syncDismissOk; + + /// No description provided for @syncDownloadSuccess. + /// + /// In en, this message translates to: + /// **'Download successful!'** + String get syncDownloadSuccess; + + /// No description provided for @syncUploadSuccess. + /// + /// In en, this message translates to: + /// **'Upload successful!'** + String get syncUploadSuccess; + + /// No description provided for @syncDownloadFailed. + /// + /// In en, this message translates to: + /// **'Error: Download Failed. \nWait a few seconds and try again.'** + String get syncDownloadFailed; + + /// No description provided for @syncUploadFailed. + /// + /// In en, this message translates to: + /// **'Error: Upload Failed. \nConnect to the internet and try again.'** + String get syncUploadFailed; + + /// No description provided for @syncWorking. + /// + /// In en, this message translates to: + /// **'Working...'** + String get syncWorking; + + /// No description provided for @syncDisconnected. + /// + /// In en, this message translates to: + /// **'Station disconnected.'** + String get syncDisconnected; + + /// No description provided for @syncElapsed. + /// + /// In en, this message translates to: + /// **'{elapsed} elapsed.'** + String syncElapsed(Object elapsed); + + /// No description provided for @syncNoInternet. + /// + /// In en, this message translates to: + /// **'No internet connection.'** + String get syncNoInternet; + + /// No description provided for @syncNoAuthentication. + /// + /// In en, this message translates to: + /// **'You aren\'t logged in.'** + String get syncNoAuthentication; + + /// No description provided for @syncNoUpload. + /// + /// In en, this message translates to: + /// **'No data to upload.'** + String get syncNoUpload; + + /// No description provided for @syncNoDownload. + /// + /// In en, this message translates to: + /// **'No data to download.'** + String get syncNoDownload; + + /// No description provided for @syncPercentageComplete. + /// + /// In en, this message translates to: + /// **'{complete} complete.'** + String syncPercentageComplete(double complete); + + /// No description provided for @quickTip. + /// + /// In en, this message translates to: + /// **'Quick Tip'** + String get quickTip; + + /// No description provided for @stationConnected. + /// + /// In en, this message translates to: + /// **'Connected'** + String get stationConnected; + + /// No description provided for @lastConnected. + /// + /// In en, this message translates to: + /// **'Last Connected'** + String get lastConnected; + + /// No description provided for @notConnected. + /// + /// In en, this message translates to: + /// **'Not Connected'** + String get notConnected; + + /// No description provided for @lastConnectedSince. + /// + /// In en, this message translates to: + /// **'Since {date}'** + String lastConnectedSince(Object date); + + /// No description provided for @manageFirmwareButton. + /// + /// In en, this message translates to: + /// **'Manage Firmware'** + String get manageFirmwareButton; + + /// No description provided for @importantNoteTitle. + /// + /// In en, this message translates to: + /// **'Important Note: '** + String get importantNoteTitle; + + /// No description provided for @updateRequiredDataPage. + /// + /// In en, this message translates to: + /// **'An update is required to sync data from this station.'** + String get updateRequiredDataPage; + + /// No description provided for @connectStationAlert. + /// + /// In en, this message translates to: + /// **'To upload data, connect to the internet.'** + String get connectStationAlert; + + /// No description provided for @loginStationAlert. + /// + /// In en, this message translates to: + /// **'To upload data,'** + String get loginStationAlert; + + /// No description provided for @loginAndConnectStationAlert. + /// + /// In en, this message translates to: + /// **'To upload data, connect to the internet and'** + String get loginAndConnectStationAlert; + + /// No description provided for @loginLink. + /// + /// In en, this message translates to: + /// **'login'** + String get loginLink; + + /// No description provided for @deployButton. + /// + /// In en, this message translates to: + /// **'Deploy'** + String get deployButton; + + /// No description provided for @deployTitle. + /// + /// In en, this message translates to: + /// **'Deploy Station'** + String get deployTitle; + + /// No description provided for @deployLocation. + /// + /// In en, this message translates to: + /// **'Name your location'** + String get deployLocation; + + /// No description provided for @stationDeployed. + /// + /// In en, this message translates to: + /// **'Station Deployed'** + String get stationDeployed; + + /// No description provided for @noStationsAvailable. + /// + /// In en, this message translates to: + /// **'No stations available'** + String get noStationsAvailable; + + /// No description provided for @connectToStation. + /// + /// In en, this message translates to: + /// **'Please connect to a station to continue'** + String get connectToStation; + + /// No description provided for @myStationsTitle. + /// + /// In en, this message translates to: + /// **'My Stations'** + String get myStationsTitle; + + /// No description provided for @deployedAt. + /// + /// In en, this message translates to: + /// **'Deployed'** + String get deployedAt; + + /// No description provided for @readyToDeploy. + /// + /// In en, this message translates to: + /// **'Ready to Deploy'** + String get readyToDeploy; + + /// No description provided for @readyToCalibrate. + /// + /// In en, this message translates to: + /// **'Ready to Calibrate'** + String get readyToCalibrate; + + /// No description provided for @calibratingBusy. + /// + /// In en, this message translates to: + /// **'Calibrating...'** + String get calibratingBusy; + + /// No description provided for @busyWorking. + /// + /// In en, this message translates to: + /// **'Busy...'** + String get busyWorking; + + /// No description provided for @busyUploading. + /// + /// In en, this message translates to: + /// **'Uploading...'** + String get busyUploading; + + /// No description provided for @busyDownloading. + /// + /// In en, this message translates to: + /// **'Downloading...'** + String get busyDownloading; + + /// No description provided for @busyUpgrading. + /// + /// In en, this message translates to: + /// **'Upgrading...'** + String get busyUpgrading; + + /// No description provided for @contacting. + /// + /// In en, this message translates to: + /// **'Contacting...'** + String get contacting; + + /// No description provided for @unknownStationTitle. + /// + /// In en, this message translates to: + /// **'Unknown Station'** + String get unknownStationTitle; + + /// No description provided for @backButtonTitle. + /// + /// In en, this message translates to: + /// **'Back'** + String get backButtonTitle; + + /// No description provided for @bytesUsed. + /// + /// In en, this message translates to: + /// **'{bytesUsed}b of 512MB'** + String bytesUsed(Object bytesUsed); + + /// No description provided for @calibrationStartTimer. + /// + /// In en, this message translates to: + /// **'Start Timer'** + String get calibrationStartTimer; + + /// No description provided for @calibrationTitle. + /// + /// In en, this message translates to: + /// **'Calibration'** + String get calibrationTitle; + + /// No description provided for @calibrateButton. + /// + /// In en, this message translates to: + /// **'Calibrate'** + String get calibrateButton; + + /// No description provided for @calibrationDelete. + /// + /// In en, this message translates to: + /// **'Delete'** + String get calibrationDelete; + + /// No description provided for @calibrationBack. + /// + /// In en, this message translates to: + /// **'Back'** + String get calibrationBack; + + /// No description provided for @calibrationKeepButton. + /// + /// In en, this message translates to: + /// **'Keep'** + String get calibrationKeepButton; + + /// No description provided for @calibrationSaveButton. + /// + /// In en, this message translates to: + /// **'Save Calibrations'** + String get calibrationSaveButton; + + /// No description provided for @calibrationPoint. + /// + /// In en, this message translates to: + /// **'Calibration Point {step}'** + String calibrationPoint(int step); + + /// No description provided for @factory. + /// + /// In en, this message translates to: + /// **'Factory'** + String get factory; + + /// No description provided for @uncalibrated. + /// + /// In en, this message translates to: + /// **'Uncalibrated'** + String get uncalibrated; + + /// No description provided for @calibrated. + /// + /// In en, this message translates to: + /// **'Calibrated'** + String get calibrated; + + /// No description provided for @voltage. + /// + /// In en, this message translates to: + /// **'Voltage'** + String get voltage; + + /// No description provided for @standardTitle. + /// + /// In en, this message translates to: + /// **'Standard'** + String get standardTitle; + + /// No description provided for @waitingOnTimer. + /// + /// In en, this message translates to: + /// **'Waiting on Timer'** + String get waitingOnTimer; + + /// No description provided for @waitingOnReading. + /// + /// In en, this message translates to: + /// **'Waiting for Fresh Reading'** + String get waitingOnReading; + + /// No description provided for @waitingOnForm. + /// + /// In en, this message translates to: + /// **'Values Required'** + String get waitingOnForm; + + /// No description provided for @standardValue. + /// + /// In en, this message translates to: + /// **'{value} Standard Value ({uom})'** + String standardValue(Object uom, Object value); + + /// No description provided for @standardValue2. + /// + /// In en, this message translates to: + /// **' Standard Value ({uom})'** + String standardValue2(Object uom); + + /// No description provided for @sensorValue. + /// + /// In en, this message translates to: + /// **'Sensor Value:'** + String get sensorValue; + + /// No description provided for @oopsBugTitle. + /// + /// In en, this message translates to: + /// **'Oops, bug?'** + String get oopsBugTitle; + + /// No description provided for @standard. + /// + /// In en, this message translates to: + /// **'Standard'** + String get standard; + + /// No description provided for @minSec. + /// + /// In en, this message translates to: + /// **'min sec'** + String get minSec; + + /// No description provided for @countdownInstructions. + /// + /// In en, this message translates to: + /// **'As you wait for the sensor value to stabilize, enter the standard value.'** + String get countdownInstructions; + + /// No description provided for @countdownInstructions2. + /// + /// In en, this message translates to: + /// **'Tap the Calibrate button to record the sensor value and the standard value.'** + String get countdownInstructions2; + + /// No description provided for @calibrationMessage. + /// + /// In en, this message translates to: + /// **'Recording these values together allows us to later calibrate the sensor.'** + String get calibrationMessage; + + /// No description provided for @standardFieldLabel. + /// + /// In en, this message translates to: + /// **'Standard'** + String get standardFieldLabel; + + /// No description provided for @backAreYouSure. + /// + /// In en, this message translates to: + /// **'Are you sure?'** + String get backAreYouSure; + + /// No description provided for @backWarning. + /// + /// In en, this message translates to: + /// **'Navigating away will require you start this calibration over.'** + String get backWarning; + + /// No description provided for @settingsTitle. + /// + /// In en, this message translates to: + /// **'Settings'** + String get settingsTitle; + + /// No description provided for @readingsSchedule. + /// + /// In en, this message translates to: + /// **'Data Capture Schedule'** + String get readingsSchedule; + + /// No description provided for @scheduleUpdated. + /// + /// In en, this message translates to: + /// **'Schedule Updated'** + String get scheduleUpdated; + + /// No description provided for @settingsAdvanced. + /// + /// In en, this message translates to: + /// **'Advanced Settings'** + String get settingsAdvanced; + + /// No description provided for @httpSync. + /// + /// In en, this message translates to: + /// **'HTTP Sync'** + String get httpSync; + + /// No description provided for @httpSyncWarning. + /// + /// In en, this message translates to: + /// **'This is an advanced setting, provided for backwards compatibility and troubleshooting situations. It is best to only enable if you are aware of what it does.'** + String get httpSyncWarning; + + /// No description provided for @tailStationLogs. + /// + /// In en, this message translates to: + /// **'Tail Station Logs'** + String get tailStationLogs; + + /// No description provided for @settingsGeneral. + /// + /// In en, this message translates to: + /// **'General'** + String get settingsGeneral; + + /// No description provided for @settingsNameHint. + /// + /// In en, this message translates to: + /// **'Station Name'** + String get settingsNameHint; + + /// No description provided for @nameConfigSuccess. + /// + /// In en, this message translates to: + /// **'Station Name Updated.'** + String get nameConfigSuccess; + + /// No description provided for @errorMessage. + /// + /// In en, this message translates to: + /// **'Error: {message}'** + String errorMessage(Object message); + + /// No description provided for @settingsFirmware. + /// + /// In en, this message translates to: + /// **'Firmware'** + String get settingsFirmware; + + /// No description provided for @settingsModules. + /// + /// In en, this message translates to: + /// **'Modules'** + String get settingsModules; + + /// No description provided for @settingsWifi. + /// + /// In en, this message translates to: + /// **'WiFi'** + String get settingsWifi; + + /// No description provided for @settingsLora. + /// + /// In en, this message translates to: + /// **'LoRa'** + String get settingsLora; + + /// No description provided for @settingsAutomaticUpload. + /// + /// In en, this message translates to: + /// **'Automatic Upload Settings'** + String get settingsAutomaticUpload; + + /// No description provided for @forgetStation. + /// + /// In en, this message translates to: + /// **'Forget Station'** + String get forgetStation; + + /// No description provided for @settingsEvents. + /// + /// In en, this message translates to: + /// **'Events'** + String get settingsEvents; + + /// No description provided for @settingsLoraEdit. + /// + /// In en, this message translates to: + /// **'Edit'** + String get settingsLoraEdit; + + /// No description provided for @settingsLoraVerify. + /// + /// In en, this message translates to: + /// **'Verify'** + String get settingsLoraVerify; + + /// No description provided for @settingsLanguage. + /// + /// In en, this message translates to: + /// **'Language'** + String get settingsLanguage; + + /// No description provided for @endDeployment. + /// + /// In en, this message translates to: + /// **'End Deployment'** + String get endDeployment; + + /// No description provided for @error. + /// + /// In en, this message translates to: + /// **'Error'** + String get error; + + /// No description provided for @ok. + /// + /// In en, this message translates to: + /// **'OK'** + String get ok; + + /// No description provided for @save. + /// + /// In en, this message translates to: + /// **'Save'** + String get save; + + /// No description provided for @submit. + /// + /// In en, this message translates to: + /// **'Submit'** + String get submit; + + /// No description provided for @nameErrorDescription. + /// + /// In en, this message translates to: + /// **'Name can only contain letters, numbers, underscores, and spaces.'** + String get nameErrorDescription; + + /// No description provided for @settingsExport. + /// + /// In en, this message translates to: + /// **'Export CSV'** + String get settingsExport; + + /// No description provided for @exportStart. + /// + /// In en, this message translates to: + /// **'Start'** + String get exportStart; + + /// No description provided for @exportShare. + /// + /// In en, this message translates to: + /// **'Share'** + String get exportShare; + + /// No description provided for @exportCompleted. + /// + /// In en, this message translates to: + /// **'Completed'** + String get exportCompleted; + + /// No description provided for @exportShareSubject. + /// + /// In en, this message translates to: + /// **'Export CSV'** + String get exportShareSubject; + + /// No description provided for @exportShareText. + /// + /// In en, this message translates to: + /// **'Share exported CSV'** + String get exportShareText; + + /// No description provided for @exportShareUnsupported. + /// + /// In en, this message translates to: + /// **'Sharing not supported on this platform.'** + String get exportShareUnsupported; + + /// No description provided for @exportNoData. + /// + /// In en, this message translates to: + /// **'No data synced, please sync data.'** + String get exportNoData; + + /// No description provided for @exportPossible. + /// + /// In en, this message translates to: + /// **'{readings} available to export.'** + String exportPossible(num readings); + + /// No description provided for @onboardingNextButton. + /// + /// In en, this message translates to: + /// **'Next'** + String get onboardingNextButton; + + /// No description provided for @onboardingCompleteButton. + /// + /// In en, this message translates to: + /// **'Done'** + String get onboardingCompleteButton; + + /// No description provided for @languageEnglish. + /// + /// In en, this message translates to: + /// **'English'** + String get languageEnglish; + + /// No description provided for @languageSpanish. + /// + /// In en, this message translates to: + /// **'Español'** + String get languageSpanish; + + /// No description provided for @eventUnknown. + /// + /// In en, this message translates to: + /// **'Unknown Event'** + String get eventUnknown; + + /// No description provided for @eventRestart. + /// + /// In en, this message translates to: + /// **'Restart Event'** + String get eventRestart; + + /// No description provided for @eventLora. + /// + /// In en, this message translates to: + /// **'LoRa Event'** + String get eventLora; + + /// No description provided for @eventTime. + /// + /// In en, this message translates to: + /// **'Time'** + String get eventTime; + + /// No description provided for @eventCode. + /// + /// In en, this message translates to: + /// **'Code'** + String get eventCode; + + /// No description provided for @eventReason. + /// + /// In en, this message translates to: + /// **'Reason'** + String get eventReason; + + /// No description provided for @noEvents. + /// + /// In en, this message translates to: + /// **'No Events'** + String get noEvents; + + /// No description provided for @networksTitle. + /// + /// In en, this message translates to: + /// **'WiFi Networks'** + String get networksTitle; + + /// No description provided for @networkAddButton. + /// + /// In en, this message translates to: + /// **'Add Network'** + String get networkAddButton; + + /// No description provided for @networkEditTitle. + /// + /// In en, this message translates to: + /// **'WiFi Network'** + String get networkEditTitle; + + /// No description provided for @networkSaveButton. + /// + /// In en, this message translates to: + /// **'Save'** + String get networkSaveButton; + + /// No description provided for @networkAutomaticUploadEnable. + /// + /// In en, this message translates to: + /// **'Enable'** + String get networkAutomaticUploadEnable; + + /// No description provided for @networkAutomaticUploadDisable. + /// + /// In en, this message translates to: + /// **'Disable'** + String get networkAutomaticUploadDisable; + + /// No description provided for @networkRemoveButton. + /// + /// In en, this message translates to: + /// **'Remove'** + String get networkRemoveButton; + + /// No description provided for @networkNoMoreSlots. + /// + /// In en, this message translates to: + /// **'Unfortunately, there are only two WiFi network slots available.'** + String get networkNoMoreSlots; + + /// No description provided for @wifiSsid. + /// + /// In en, this message translates to: + /// **'SSID'** + String get wifiSsid; + + /// No description provided for @wifiPassword. + /// + /// In en, this message translates to: + /// **'Password'** + String get wifiPassword; + + /// No description provided for @confirmRemoveNetwork. + /// + /// In en, this message translates to: + /// **'Remove Network'** + String get confirmRemoveNetwork; + + /// No description provided for @loraBand. + /// + /// In en, this message translates to: + /// **'Band'** + String get loraBand; + + /// No description provided for @loraAppKey. + /// + /// In en, this message translates to: + /// **'App Key'** + String get loraAppKey; + + /// No description provided for @loraJoinEui. + /// + /// In en, this message translates to: + /// **'Join EUI'** + String get loraJoinEui; + + /// No description provided for @loraDeviceEui. + /// + /// In en, this message translates to: + /// **'Device EUI'** + String get loraDeviceEui; + + /// No description provided for @loraDeviceAddress. + /// + /// In en, this message translates to: + /// **'Device Address'** + String get loraDeviceAddress; + + /// No description provided for @loraNetworkKey. + /// + /// In en, this message translates to: + /// **'Network Key'** + String get loraNetworkKey; + + /// No description provided for @loraSessionKey. + /// + /// In en, this message translates to: + /// **'Session Key'** + String get loraSessionKey; + + /// No description provided for @loraNoModule. + /// + /// In en, this message translates to: + /// **'No LoRa module detected.'** + String get loraNoModule; + + /// No description provided for @loraConfigurationTitle. + /// + /// In en, this message translates to: + /// **'LoRa Configuration'** + String get loraConfigurationTitle; + + /// No description provided for @hexStringValidationFailed. + /// + /// In en, this message translates to: + /// **'Expected a valid hex string.'** + String get hexStringValidationFailed; + + /// No description provided for @firmwareTitle. + /// + /// In en, this message translates to: + /// **'Firmware'** + String get firmwareTitle; + + /// No description provided for @firmwareUpgrade. + /// + /// In en, this message translates to: + /// **'Upgrade'** + String get firmwareUpgrade; + + /// No description provided for @firmwareContinue. + /// + /// In en, this message translates to: + /// **'Continue Update'** + String get firmwareContinue; + + /// No description provided for @firmwareCancel. + /// + /// In en, this message translates to: + /// **'Cancel'** + String get firmwareCancel; + + /// No description provided for @firmwareSwitch. + /// + /// In en, this message translates to: + /// **'Switch'** + String get firmwareSwitch; + + /// No description provided for @firmwareStarting. + /// + /// In en, this message translates to: + /// **'Starting...'** + String get firmwareStarting; + + /// No description provided for @firmwareUploading. + /// + /// In en, this message translates to: + /// **'Uploading...'** + String get firmwareUploading; + + /// No description provided for @firmwareRestarting. + /// + /// In en, this message translates to: + /// **'Restarting...'** + String get firmwareRestarting; + + /// No description provided for @firmwareReconnectTimeout. + /// + /// In en, this message translates to: + /// **'Unable to reconnect to station.'** + String get firmwareReconnectTimeout; + + /// No description provided for @firmwareCompleted. + /// + /// In en, this message translates to: + /// **'Completed'** + String get firmwareCompleted; + + /// No description provided for @firmwareFailed. + /// + /// In en, this message translates to: + /// **'An unexpected error occured. Please contact support.'** + String get firmwareFailed; + + /// No description provided for @firmwareSdCardError. + /// + /// In en, this message translates to: + /// **'You need an SD card to upgrade firmware.'** + String get firmwareSdCardError; + + /// No description provided for @firmwareConnected. + /// + /// In en, this message translates to: + /// **'Connected'** + String get firmwareConnected; + + /// No description provided for @firmwareNotConnected. + /// + /// In en, this message translates to: + /// **'Not Connected'** + String get firmwareNotConnected; + + /// No description provided for @firmwareVersion. + /// + /// In en, this message translates to: + /// **'Version: {firmwareVersion}'** + String firmwareVersion(Object firmwareVersion); + + /// No description provided for @firmwareUpdated. + /// + /// In en, this message translates to: + /// **'Firmware is Up to Date'** + String get firmwareUpdated; + + /// No description provided for @firmwareNotUpdated. + /// + /// In en, this message translates to: + /// **'Firmware is Not Up to Date'** + String get firmwareNotUpdated; + + /// No description provided for @firmwareUpdate. + /// + /// In en, this message translates to: + /// **'Update Firmware'** + String get firmwareUpdate; + + /// No description provided for @firmwareDismiss. + /// + /// In en, this message translates to: + /// **'OK'** + String get firmwareDismiss; + + /// No description provided for @firmwareCheck. + /// + /// In en, this message translates to: + /// **'Check for New Firmware'** + String get firmwareCheck; + + /// No description provided for @firmwareReleased. + /// + /// In en, this message translates to: + /// **'Released: {firmwareReleaseDate}'** + String firmwareReleased(Object firmwareReleaseDate); + + /// No description provided for @firmwareTip. + /// + /// In en, this message translates to: + /// **'During the upgrade your station may disconnect while restarting. If so, be sure to reconnect to your station.'** + String get firmwareTip; + + /// No description provided for @firmwarePrepareTitle. + /// + /// In en, this message translates to: + /// **'Prepare For Update'** + String get firmwarePrepareTitle; + + /// No description provided for @firmwarePrepareTime. + /// + /// In en, this message translates to: + /// **'This update may take several minutes.'** + String get firmwarePrepareTime; + + /// No description provided for @firmwarePrepareSd. + /// + /// In en, this message translates to: + /// **'You will need an SD card in your station to complete the update.'** + String get firmwarePrepareSd; + + /// No description provided for @firmwarePreparePower. + /// + /// In en, this message translates to: + /// **'Keep your station plugged in and close to your device or smart phone.'** + String get firmwarePreparePower; + + /// No description provided for @firmwarePrepareConnection. + /// + /// In en, this message translates to: + /// **'Your station will restart and you might have to reconnect to the station.'** + String get firmwarePrepareConnection; + + /// No description provided for @settingsAccounts. + /// + /// In en, this message translates to: + /// **'Accounts'** + String get settingsAccounts; + + /// No description provided for @accountsTitle. + /// + /// In en, this message translates to: + /// **'Accounts'** + String get accountsTitle; + + /// No description provided for @accountsAddButton. + /// + /// In en, this message translates to: + /// **'Add an Account'** + String get accountsAddButton; + + /// No description provided for @accountsNoneCreatedTitle. + /// + /// In en, this message translates to: + /// **'Looks like there are no accounts created yet'** + String get accountsNoneCreatedTitle; + + /// No description provided for @accountsNoneCreatedMessage. + /// + /// In en, this message translates to: + /// **'Accounts are useful for updating your station information on the online portal and occasionally accessing user-specific firmware. Are you connected to the internet? Once you are, let\'s set up an account!'** + String get accountsNoneCreatedMessage; + + /// No description provided for @accountAddTitle. + /// + /// In en, this message translates to: + /// **'Add Account'** + String get accountAddTitle; + + /// No description provided for @accountEditTitle. + /// + /// In en, this message translates to: + /// **'Edit Account'** + String get accountEditTitle; + + /// No description provided for @noInternetConnection. + /// + /// In en, this message translates to: + /// **'Connect your phone to the internet to login.'** + String get noInternetConnection; + + /// No description provided for @accountName. + /// + /// In en, this message translates to: + /// **'Name'** + String get accountName; + + /// No description provided for @accountEmail. + /// + /// In en, this message translates to: + /// **'Email'** + String get accountEmail; + + /// No description provided for @accountPassword. + /// + /// In en, this message translates to: + /// **'Password'** + String get accountPassword; + + /// No description provided for @accountConfirmPassword. + /// + /// In en, this message translates to: + /// **'Confirm Password'** + String get accountConfirmPassword; + + /// No description provided for @accountConfirmPasswordMatch. + /// + /// In en, this message translates to: + /// **'Passwords must match.'** + String get accountConfirmPasswordMatch; + + /// No description provided for @accountRegistrationFailed. + /// + /// In en, this message translates to: + /// **'An error occured registering your account. Please double check your email and password.'** + String get accountRegistrationFailed; + + /// No description provided for @accountFormFail. + /// + /// In en, this message translates to: + /// **'Invalid email or password.'** + String get accountFormFail; + + /// No description provided for @accountSaveButton. + /// + /// In en, this message translates to: + /// **'Login'** + String get accountSaveButton; + + /// No description provided for @accountRegisterButton. + /// + /// In en, this message translates to: + /// **'Register'** + String get accountRegisterButton; + + /// No description provided for @accountRemoveButton. + /// + /// In en, this message translates to: + /// **'Remove'** + String get accountRemoveButton; + + /// No description provided for @accountRepairButton. + /// + /// In en, this message translates to: + /// **'Login'** + String get accountRepairButton; + + /// No description provided for @accountRegisterLabel. + /// + /// In en, this message translates to: + /// **'Create an account'** + String get accountRegisterLabel; + + /// No description provided for @accountDefault. + /// + /// In en, this message translates to: + /// **'This is your default account.'** + String get accountDefault; + + /// No description provided for @accountInvalid. + /// + /// In en, this message translates to: + /// **'Something is wrong with this account.'** + String get accountInvalid; + + /// No description provided for @accountUnknown. + /// + /// In en, this message translates to: + /// **'Odd, not sure about this account. Bug?'** + String get accountUnknown; + + /// No description provided for @accountConnectivity. + /// + /// In en, this message translates to: + /// **'There was an issue connecting with this account. If the issue was network related this will correct itself.'** + String get accountConnectivity; + + /// No description provided for @accountCreated. + /// + /// In en, this message translates to: + /// **'Registration successful! Please check your email for verification instructions prior to logging in.'** + String get accountCreated; + + /// No description provided for @accountUpdated. + /// + /// In en, this message translates to: + /// **'Your account has been successfully updated.'** + String get accountUpdated; + + /// No description provided for @unknownError. + /// + /// In en, this message translates to: + /// **'An unknown error occurred. Please try again later.'** + String get unknownError; + + /// No description provided for @invalidCredentialsError. + /// + /// In en, this message translates to: + /// **'The credentials you entered are incorrect. Please try again.'** + String get invalidCredentialsError; + + /// No description provided for @serverError. + /// + /// In en, this message translates to: + /// **'There was a problem connecting to the server. Please check your connection and try again.'** + String get serverError; + + /// No description provided for @bayNumber. + /// + /// In en, this message translates to: + /// **'Bay #{bay}'** + String bayNumber(Object bay); + + /// No description provided for @configureButton. + /// + /// In en, this message translates to: + /// **'Configure'** + String get configureButton; + + /// No description provided for @batteryLife. + /// + /// In en, this message translates to: + /// **'Battery Life'** + String get batteryLife; + + /// No description provided for @memoryUsage. + /// + /// In en, this message translates to: + /// **'Memory Used'** + String get memoryUsage; + + /// No description provided for @confirmForgetStation. + /// + /// In en, this message translates to: + /// **'Are you sure you want to remove this station.'** + String get confirmForgetStation; + + /// No description provided for @confirmClearCalibrationTitle. + /// + /// In en, this message translates to: + /// **'Clear Calibration'** + String get confirmClearCalibrationTitle; + + /// No description provided for @confirmRemoveAccountTitle. + /// + /// In en, this message translates to: + /// **'Remove Account'** + String get confirmRemoveAccountTitle; + + /// No description provided for @confirmDelete. + /// + /// In en, this message translates to: + /// **'Are you sure?'** + String get confirmDelete; + + /// No description provided for @confirmYes. + /// + /// In en, this message translates to: + /// **'Yes'** + String get confirmYes; + + /// No description provided for @confirmCancel. + /// + /// In en, this message translates to: + /// **'Cancel'** + String get confirmCancel; + + /// No description provided for @onboardingTitle. + /// + /// In en, this message translates to: + /// **'Onboarding Instructions'** + String get onboardingTitle; + + /// No description provided for @helpTitle. + /// + /// In en, this message translates to: + /// **'Help'** + String get helpTitle; + + /// No description provided for @helpCheckList. + /// + /// In en, this message translates to: + /// **'Pre-deployment Checklist'** + String get helpCheckList; + + /// No description provided for @tutorialGuide. + /// + /// In en, this message translates to: + /// **'Tutorial Guide'** + String get tutorialGuide; + + /// No description provided for @offlineProductGuide. + /// + /// In en, this message translates to: + /// **'Offline Product Guide'** + String get offlineProductGuide; + + /// No description provided for @search. + /// + /// In en, this message translates to: + /// **'Search'** + String get search; + + /// No description provided for @enterSearchTerm. + /// + /// In en, this message translates to: + /// **'Enter Search Term'** + String get enterSearchTerm; + + /// No description provided for @cancel. + /// + /// In en, this message translates to: + /// **'Cancel'** + String get cancel; + + /// No description provided for @errorLoadingPdf. + /// + /// In en, this message translates to: + /// **'Error loading PDF'** + String get errorLoadingPdf; + + /// No description provided for @appVersion. + /// + /// In en, this message translates to: + /// **'App Version'** + String get appVersion; + + /// No description provided for @errorLoadingVersion. + /// + /// In en, this message translates to: + /// **'Error Loading App Version'** + String get errorLoadingVersion; + + /// No description provided for @noUpdates. + /// + /// In en, this message translates to: + /// **'No updates available'** + String get noUpdates; + + /// No description provided for @yesUpdates. + /// + /// In en, this message translates to: + /// **'Tap for updates'** + String get yesUpdates; + + /// No description provided for @helpUploadLogs. + /// + /// In en, this message translates to: + /// **'Send Diagnostics'** + String get helpUploadLogs; + + /// No description provided for @helpCreateBackup. + /// + /// In en, this message translates to: + /// **'Create Phone Backup'** + String get helpCreateBackup; + + /// No description provided for @helpBackupCreated. + /// + /// In en, this message translates to: + /// **'Phone Backup Created'** + String get helpBackupCreated; + + /// No description provided for @helpBackupFailed. + /// + /// In en, this message translates to: + /// **'Phone Backup Failed'** + String get helpBackupFailed; + + /// No description provided for @backupShareSubject. + /// + /// In en, this message translates to: + /// **'FieldKit Backup'** + String get backupShareSubject; + + /// No description provided for @backupShareMessage. + /// + /// In en, this message translates to: + /// **'FieldKit application backup.'** + String get backupShareMessage; + + /// No description provided for @developerBuild. + /// + /// In en, this message translates to: + /// **'Developer Build'** + String get developerBuild; + + /// No description provided for @logsUploaded. + /// + /// In en, this message translates to: + /// **'Logs Uploaded'** + String get logsUploaded; + + /// No description provided for @legalTitle. + /// + /// In en, this message translates to: + /// **'Legal'** + String get legalTitle; + + /// No description provided for @termsOfService. + /// + /// In en, this message translates to: + /// **'Terms of Service'** + String get termsOfService; + + /// No description provided for @privacyPolicy. + /// + /// In en, this message translates to: + /// **'Privacy Policy'** + String get privacyPolicy; + + /// No description provided for @licenses. + /// + /// In en, this message translates to: + /// **'Licenses'** + String get licenses; + + /// No description provided for @modulesWaterTemp. + /// + /// In en, this message translates to: + /// **'Water Temperature Module'** + String get modulesWaterTemp; + + /// No description provided for @modulesWaterPh. + /// + /// In en, this message translates to: + /// **'pH Module'** + String get modulesWaterPh; + + /// No description provided for @modulesWaterOrp. + /// + /// In en, this message translates to: + /// **'ORP Module'** + String get modulesWaterOrp; + + /// No description provided for @modulesWaterDo. + /// + /// In en, this message translates to: + /// **'Dissolved Oxygen Module'** + String get modulesWaterDo; + + /// No description provided for @modulesWaterEc. + /// + /// In en, this message translates to: + /// **'Conductivity Module'** + String get modulesWaterEc; + + /// No description provided for @modulesWaterDepth. + /// + /// In en, this message translates to: + /// **'Water Depth Module'** + String get modulesWaterDepth; + + /// No description provided for @modulesWeather. + /// + /// In en, this message translates to: + /// **'Weather Module'** + String get modulesWeather; + + /// No description provided for @modulesDiagnostics. + /// + /// In en, this message translates to: + /// **'Diagnostics Module'** + String get modulesDiagnostics; + + /// No description provided for @modulesRandom. + /// + /// In en, this message translates to: + /// **'Random Module'** + String get modulesRandom; + + /// No description provided for @modulesDistance. + /// + /// In en, this message translates to: + /// **'Distance Module'** + String get modulesDistance; + + /// No description provided for @modulesUnknown. + /// + /// In en, this message translates to: + /// **'Unknown Module'** + String get modulesUnknown; + + /// No description provided for @sensorWaterTemperature. + /// + /// In en, this message translates to: + /// **'Water Temperature'** + String get sensorWaterTemperature; + + /// No description provided for @sensorWaterPh. + /// + /// In en, this message translates to: + /// **'pH'** + String get sensorWaterPh; + + /// No description provided for @sensorWaterEc. + /// + /// In en, this message translates to: + /// **'Conductivity'** + String get sensorWaterEc; + + /// No description provided for @sensorWaterDo. + /// + /// In en, this message translates to: + /// **'Dissolved Oxygen'** + String get sensorWaterDo; + + /// No description provided for @sensorWaterDoPressure. + /// + /// In en, this message translates to: + /// **'Air Oxygen'** + String get sensorWaterDoPressure; + + /// No description provided for @sensorWaterDoTemperature. + /// + /// In en, this message translates to: + /// **'Air Temperature'** + String get sensorWaterDoTemperature; + + /// No description provided for @sensorWaterOrp. + /// + /// In en, this message translates to: + /// **'ORP'** + String get sensorWaterOrp; + + /// No description provided for @sensorWaterDepthPressure. + /// + /// In en, this message translates to: + /// **'Water Depth (Pressure)'** + String get sensorWaterDepthPressure; + + /// No description provided for @sensorWaterDepthTemperature. + /// + /// In en, this message translates to: + /// **'Water Temperature'** + String get sensorWaterDepthTemperature; + + /// No description provided for @sensorDiagnosticsTemperature. + /// + /// In en, this message translates to: + /// **'Internal Temperature'** + String get sensorDiagnosticsTemperature; + + /// No description provided for @sensorDiagnosticsUptime. + /// + /// In en, this message translates to: + /// **'Uptime'** + String get sensorDiagnosticsUptime; + + /// No description provided for @sensorDiagnosticsMemory. + /// + /// In en, this message translates to: + /// **'Memory'** + String get sensorDiagnosticsMemory; + + /// No description provided for @sensorDiagnosticsFreeMemory. + /// + /// In en, this message translates to: + /// **'Free Memory'** + String get sensorDiagnosticsFreeMemory; + + /// No description provided for @sensorDiagnosticsBatteryCharge. + /// + /// In en, this message translates to: + /// **'Battery'** + String get sensorDiagnosticsBatteryCharge; + + /// No description provided for @sensorDiagnosticsBatteryVoltage. + /// + /// In en, this message translates to: + /// **'Battery'** + String get sensorDiagnosticsBatteryVoltage; + + /// No description provided for @sensorDiagnosticsBatteryVBus. + /// + /// In en, this message translates to: + /// **'Battery (VBus)'** + String get sensorDiagnosticsBatteryVBus; + + /// No description provided for @sensorDiagnosticsBatteryVs. + /// + /// In en, this message translates to: + /// **'Battery (Vs)'** + String get sensorDiagnosticsBatteryVs; + + /// No description provided for @sensorDiagnosticsBatteryMa. + /// + /// In en, this message translates to: + /// **'Battery (mA)'** + String get sensorDiagnosticsBatteryMa; + + /// No description provided for @sensorDiagnosticsBatteryPower. + /// + /// In en, this message translates to: + /// **'Battery (Power)'** + String get sensorDiagnosticsBatteryPower; + + /// No description provided for @sensorDiagnosticsSolarVBus. + /// + /// In en, this message translates to: + /// **'Solar (VBus)'** + String get sensorDiagnosticsSolarVBus; + + /// No description provided for @sensorDiagnosticsSolarVs. + /// + /// In en, this message translates to: + /// **'Solar (Vs)'** + String get sensorDiagnosticsSolarVs; + + /// No description provided for @sensorDiagnosticsSolarMa. + /// + /// In en, this message translates to: + /// **'Solar (mA)'** + String get sensorDiagnosticsSolarMa; + + /// No description provided for @sensorDiagnosticsSolarPower. + /// + /// In en, this message translates to: + /// **'Solar (Power)'** + String get sensorDiagnosticsSolarPower; + + /// No description provided for @sensorWeatherRain. + /// + /// In en, this message translates to: + /// **'Rain'** + String get sensorWeatherRain; + + /// No description provided for @sensorWeatherWindSpeed. + /// + /// In en, this message translates to: + /// **'Wind Speed'** + String get sensorWeatherWindSpeed; + + /// No description provided for @sensorWeatherWindDirection. + /// + /// In en, this message translates to: + /// **'Wind Direction'** + String get sensorWeatherWindDirection; + + /// No description provided for @sensorWeatherHumidity. + /// + /// In en, this message translates to: + /// **'Humidity'** + String get sensorWeatherHumidity; + + /// No description provided for @sensorWeatherTemperature1. + /// + /// In en, this message translates to: + /// **'Temperature 1'** + String get sensorWeatherTemperature1; + + /// No description provided for @sensorWeatherTemperature2. + /// + /// In en, this message translates to: + /// **'Temperature 2'** + String get sensorWeatherTemperature2; + + /// No description provided for @sensorWeatherPressure. + /// + /// In en, this message translates to: + /// **'Pressure'** + String get sensorWeatherPressure; + + /// No description provided for @sensorWeatherWindDir. + /// + /// In en, this message translates to: + /// **'Wind Direction'** + String get sensorWeatherWindDir; + + /// No description provided for @sensorWeatherWindDirMv. + /// + /// In en, this message translates to: + /// **'Wind Direction Raw ADC'** + String get sensorWeatherWindDirMv; + + /// No description provided for @sensorWeatherWindHrMaxSpeed. + /// + /// In en, this message translates to: + /// **'Wind Max Speed (1 hour)'** + String get sensorWeatherWindHrMaxSpeed; + + /// No description provided for @sensorWeatherWindHrMaxDir. + /// + /// In en, this message translates to: + /// **'Wind Max Direction (1 hour)'** + String get sensorWeatherWindHrMaxDir; + + /// No description provided for @sensorWeatherWind10mMaxSpeed. + /// + /// In en, this message translates to: + /// **'Wind Max Speed (10 min)'** + String get sensorWeatherWind10mMaxSpeed; + + /// No description provided for @sensorWeatherWind10mMaxDir. + /// + /// In en, this message translates to: + /// **'Wind Max Direction (10 min)'** + String get sensorWeatherWind10mMaxDir; + + /// No description provided for @sensorWeatherWind2mAvgSpeed. + /// + /// In en, this message translates to: + /// **'Wind Average Speed (2 min)'** + String get sensorWeatherWind2mAvgSpeed; + + /// No description provided for @sensorWeatherWind2mAvgDir. + /// + /// In en, this message translates to: + /// **'Wind Average Direction (2 min)'** + String get sensorWeatherWind2mAvgDir; + + /// No description provided for @sensorWeatherRainThisHour. + /// + /// In en, this message translates to: + /// **'Rain This Hour'** + String get sensorWeatherRainThisHour; + + /// No description provided for @sensorWeatherRainPrevHour. + /// + /// In en, this message translates to: + /// **'Rain Previous Hour'** + String get sensorWeatherRainPrevHour; + + /// No description provided for @sensorDistanceDistance0. + /// + /// In en, this message translates to: + /// **'Distance 0'** + String get sensorDistanceDistance0; + + /// No description provided for @sensorDistanceDistance1. + /// + /// In en, this message translates to: + /// **'Distance 1'** + String get sensorDistanceDistance1; + + /// No description provided for @sensorDistanceDistance2. + /// + /// In en, this message translates to: + /// **'Distance 2'** + String get sensorDistanceDistance2; + + /// No description provided for @sensorDistanceCalibration. + /// + /// In en, this message translates to: + /// **'Distance Cal'** + String get sensorDistanceCalibration; + + /// No description provided for @sensorRandomRandom0. + /// + /// In en, this message translates to: + /// **'Random 0'** + String get sensorRandomRandom0; + + /// No description provided for @sensorRandomRandom1. + /// + /// In en, this message translates to: + /// **'Random 1'** + String get sensorRandomRandom1; + + /// No description provided for @sensorRandomRandom2. + /// + /// In en, this message translates to: + /// **'Random 2'** + String get sensorRandomRandom2; + + /// No description provided for @sensorRandomRandom3. + /// + /// In en, this message translates to: + /// **'Random 3'** + String get sensorRandomRandom3; + + /// No description provided for @sensorRandomRandom4. + /// + /// In en, this message translates to: + /// **'Random 4'** + String get sensorRandomRandom4; + + /// No description provided for @sensorRandomRandom5. + /// + /// In en, this message translates to: + /// **'Random 5'** + String get sensorRandomRandom5; + + /// No description provided for @sensorRandomRandom6. + /// + /// In en, this message translates to: + /// **'Random 6'** + String get sensorRandomRandom6; + + /// No description provided for @sensorRandomRandom7. + /// + /// In en, this message translates to: + /// **'Random 7'** + String get sensorRandomRandom7; + + /// No description provided for @sensorRandomRandom8. + /// + /// In en, this message translates to: + /// **'Random 8'** + String get sensorRandomRandom8; + + /// No description provided for @sensorRandomRandom9. + /// + /// In en, this message translates to: + /// **'Random 9'** + String get sensorRandomRandom9; + + /// No description provided for @helpSettingsIconActive. + /// + /// In en, this message translates to: + /// **'Help Settings Icon - active'** + String get helpSettingsIconActive; + + /// No description provided for @helpSettingsIconInactive. + /// + /// In en, this message translates to: + /// **'Help Settings Icon - inactive'** + String get helpSettingsIconInactive; + + /// No description provided for @helpSettingsIcon. + /// + /// In en, this message translates to: + /// **'Help Settings Icon'** + String get helpSettingsIcon; + + /// No description provided for @accountSettingsIcon. + /// + /// In en, this message translates to: + /// **'Account Settings Icon'** + String get accountSettingsIcon; + + /// No description provided for @languageSettingsIcon. + /// + /// In en, this message translates to: + /// **'Language Settings Icon'** + String get languageSettingsIcon; + + /// No description provided for @legalSettingsIcon. + /// + /// In en, this message translates to: + /// **'Legal Settings Icon'** + String get legalSettingsIcon; + + /// No description provided for @stationDisconnectedIcon. + /// + /// In en, this message translates to: + /// **'Station Disconnected Icon'** + String get stationDisconnectedIcon; + + /// No description provided for @stationDisconnectedTitle. + /// + /// In en, this message translates to: + /// **'Station Disconnected'** + String get stationDisconnectedTitle; + + /// No description provided for @troubleshootingSteps. + /// + /// In en, this message translates to: + /// **'Troubleshooting Steps:'** + String get troubleshootingSteps; + + /// No description provided for @getHelpButton. + /// + /// In en, this message translates to: + /// **'Get Help'** + String get getHelpButton; + + /// No description provided for @stationConnectedMessage. + /// + /// In en, this message translates to: + /// **'Station Connected'** + String get stationConnectedMessage; + + /// No description provided for @stationDisconnectedMessage. + /// + /// In en, this message translates to: + /// **'Station Disconnected'** + String get stationDisconnectedMessage; + + /// No description provided for @pressWifiButtonAgain. + /// + /// In en, this message translates to: + /// **'1. Press the WiFi button again'** + String get pressWifiButtonAgain; + + /// No description provided for @turnOnStationWifi. + /// + /// In en, this message translates to: + /// **'2. Turn on the station\'s WiFi access point directly from the station settings menu'** + String get turnOnStationWifi; + + /// No description provided for @visitSupportWebsite. + /// + /// In en, this message translates to: + /// **'3. If you\'re still having issues, visit '** + String get visitSupportWebsite; + + /// No description provided for @unDeployStation. + /// + /// In en, this message translates to: + /// **'Undeploy Station'** + String get unDeployStation; + + /// No description provided for @unDeployConfirmation. + /// + /// In en, this message translates to: + /// **'Are you sure you want to undeploy this station? This will clear its deployment configuration.'** + String get unDeployConfirmation; + + /// No description provided for @unDeploySuccess. + /// + /// In en, this message translates to: + /// **'Station has been undeployed successfully'** + String get unDeploySuccess; + + /// Title for station assembly help section + /// + /// In en, this message translates to: + /// **'Assemble Station'** + String get assembleStation; + + /// No description provided for @stationSetupInstructions. + /// + /// In en, this message translates to: + /// **'Station Setup Instructions'** + String get stationSetupInstructions; + + /// No description provided for @phModuleSetup. + /// + /// In en, this message translates to: + /// **'pH Module Setup'** + String get phModuleSetup; + + /// No description provided for @waterTempModuleSetup. + /// + /// In en, this message translates to: + /// **'Water Temperature Module Setup'** + String get waterTempModuleSetup; + + /// No description provided for @conductivityModuleSetup. + /// + /// In en, this message translates to: + /// **'Conductivity Module Setup'** + String get conductivityModuleSetup; + + /// No description provided for @doModuleSetup. + /// + /// In en, this message translates to: + /// **'Dissolved Oxygen Module Setup'** + String get doModuleSetup; + + /// No description provided for @distanceModuleSetup. + /// + /// In en, this message translates to: + /// **'Distance Module Setup'** + String get distanceModuleSetup; + + /// No description provided for @weatherModuleSetup. + /// + /// In en, this message translates to: + /// **'Weather Module Setup'** + String get weatherModuleSetup; + + /// No description provided for @noModuleDescription. + /// + /// In en, this message translates to: + /// **'No station has this type of module installed. Install this module on a station to calibrate it.'** + String get noModuleDescription; +} + +class _AppLocalizationsDelegate + extends LocalizationsDelegate { + const _AppLocalizationsDelegate(); + + @override + Future load(Locale locale) { + return SynchronousFuture(lookupAppLocalizations(locale)); + } + + @override + bool isSupported(Locale locale) => + ['en', 'es'].contains(locale.languageCode); + + @override + bool shouldReload(_AppLocalizationsDelegate old) => false; +} + +AppLocalizations lookupAppLocalizations(Locale locale) { + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'en': + return AppLocalizationsEn(); + case 'es': + return AppLocalizationsEs(); + } + + throw FlutterError( + 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.'); +} diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart new file mode 100644 index 0000000000000000000000000000000000000000..cbb846939d3e554aab504908e2ad25608dfaff57 --- /dev/null +++ b/lib/l10n/app_localizations_en.dart @@ -0,0 +1,1257 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for English (`en`). +class AppLocalizationsEn extends AppLocalizations { + AppLocalizationsEn([String locale = 'en']) : super(locale); + + @override + String get fieldKit => 'FieldKit'; + + @override + String get loadingConfiguration => 'Configuration'; + + @override + String get loadingEnvironment => 'Environment'; + + @override + String get loadingLocale => 'Locale'; + + @override + String get welcomeTitle => 'Welcome!'; + + @override + String get welcomeMessage => + 'Our mobile app makes it easy to set up and deploy your FieldKit station.'; + + @override + String get welcomeButton => 'Get Started'; + + @override + String get skipInstructions => 'Skip Instructions'; + + @override + String get errorStartingApp => 'Error initializing app.'; + + @override + String get stationsTab => 'Stations'; + + @override + String get dataSyncTab => 'Data Sync'; + + @override + String get settingsTab => 'Settings'; + + @override + String get helpTab => 'Help'; + + @override + String get dataSyncTitle => 'Data Sync'; + + @override + String get alertTitle => 'Important'; + + @override + String get login => 'Login'; + + @override + String get dataLoginMessage => 'To upload data you need to login:'; + + @override + String get modulesTitle => 'Modules'; + + @override + String get addModulesButton => 'Add Modules'; + + @override + String get noModulesMessage => + 'Your station needs modules in order to complete setup, deploy, and capture data.'; + + @override + String get noModulesTitle => 'No Modules Attached'; + + @override + String get connectStation => 'Connect Station'; + + @override + String get noStationsDescription => + 'You have no stations. Add a station to start collecting data.'; + + @override + String get noStationsDescription2 => + 'You have no stations. Add a station in order to calibrate modules.'; + + @override + String get noStationsWhatIsStation => 'What is a FieldKit Station?'; + + @override + String get locationDenied => 'Location permission denied'; + + @override + String get mapFullScreen => 'Full Screen Map'; + + @override + String get lastReadingLabel => ' (Last Reading)'; + + @override + String get daysHoursMinutes => 'days hrs mins'; + + @override + String get download => 'Download'; + + @override + String get upload => 'Upload'; + + @override + String readingsUploadable(num readings) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + + String _temp0 = intl.Intl.pluralLogic( + readings, + locale: localeName, + other: '$readingsString Uploads', + one: '1 Upload', + zero: '0 Uploads', + ); + return '$_temp0'; + } + + @override + String readingsDownloadable(num readings) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + + String _temp0 = intl.Intl.pluralLogic( + readings, + locale: localeName, + other: '$readingsString Downloads', + one: '1 Downloads', + zero: '0 Downloads', + ); + return '$_temp0'; + } + + @override + String downloadIncomplete(num readings, num total) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + final intl.NumberFormat totalNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String totalString = totalNumberFormat.format(total); + + return 'Only $readingsString of $totalString downloaded.'; + } + + @override + String downloadProgress(num readings, num total) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + final intl.NumberFormat totalNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String totalString = totalNumberFormat.format(total); + + return '$readingsString Downloaded...'; + } + + @override + String get uploadProgress => 'Uploading...'; + + @override + String readingsUploaded(num readings) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + + String _temp0 = intl.Intl.pluralLogic( + readings, + locale: localeName, + other: '$readingsString Readings Uploaded', + one: '1 Reading Uploaded', + zero: '0 Readings Uploaded', + ); + return '$_temp0'; + } + + @override + String readingsDownloaded(num readings) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + + String _temp0 = intl.Intl.pluralLogic( + readings, + locale: localeName, + other: '$readingsString Readings Downloaded', + one: '1 Reading Downloaded', + zero: '0 Readings Downloaded', + ); + return '$_temp0'; + } + + @override + String get uploading => 'Uploading'; + + @override + String get syncUploading => 'Uploading...'; + + @override + String get syncDownloading => 'Downloaing...'; + + @override + String get readytoDownload => 'Ready to download'; + + @override + String get readytoUpload => 'Ready to upload'; + + @override + String get connectivityIssue => 'Upload Connectivity Issue Occuring'; + + @override + String get authenticationIssue => 'Upload Login Issue Occuring'; + + @override + String get uploadFailed => 'Upload Failed'; + + @override + String get downloadFailed => 'Download Failed'; + + @override + String get syncDismissOk => 'OK'; + + @override + String get syncDownloadSuccess => 'Download successful!'; + + @override + String get syncUploadSuccess => 'Upload successful!'; + + @override + String get syncDownloadFailed => + 'Error: Download Failed. \nWait a few seconds and try again.'; + + @override + String get syncUploadFailed => + 'Error: Upload Failed. \nConnect to the internet and try again.'; + + @override + String get syncWorking => 'Working...'; + + @override + String get syncDisconnected => 'Station disconnected.'; + + @override + String syncElapsed(Object elapsed) { + return '$elapsed elapsed.'; + } + + @override + String get syncNoInternet => 'No internet connection.'; + + @override + String get syncNoAuthentication => 'You aren\'t logged in.'; + + @override + String get syncNoUpload => 'No data to upload.'; + + @override + String get syncNoDownload => 'No data to download.'; + + @override + String syncPercentageComplete(double complete) { + final intl.NumberFormat completeNumberFormat = + intl.NumberFormat.decimalPercentPattern( + locale: localeName, decimalDigits: 2); + final String completeString = completeNumberFormat.format(complete); + + return '$completeString complete.'; + } + + @override + String get quickTip => 'Quick Tip'; + + @override + String get stationConnected => 'Connected'; + + @override + String get lastConnected => 'Last Connected'; + + @override + String get notConnected => 'Not Connected'; + + @override + String lastConnectedSince(Object date) { + return 'Since $date'; + } + + @override + String get manageFirmwareButton => 'Manage Firmware'; + + @override + String get importantNoteTitle => 'Important Note: '; + + @override + String get updateRequiredDataPage => + 'An update is required to sync data from this station.'; + + @override + String get connectStationAlert => 'To upload data, connect to the internet.'; + + @override + String get loginStationAlert => 'To upload data,'; + + @override + String get loginAndConnectStationAlert => + 'To upload data, connect to the internet and'; + + @override + String get loginLink => 'login'; + + @override + String get deployButton => 'Deploy'; + + @override + String get deployTitle => 'Deploy Station'; + + @override + String get deployLocation => 'Name your location'; + + @override + String get stationDeployed => 'Station Deployed'; + + @override + String get noStationsAvailable => 'No stations available'; + + @override + String get connectToStation => 'Please connect to a station to continue'; + + @override + String get myStationsTitle => 'My Stations'; + + @override + String get deployedAt => 'Deployed'; + + @override + String get readyToDeploy => 'Ready to Deploy'; + + @override + String get readyToCalibrate => 'Ready to Calibrate'; + + @override + String get calibratingBusy => 'Calibrating...'; + + @override + String get busyWorking => 'Busy...'; + + @override + String get busyUploading => 'Uploading...'; + + @override + String get busyDownloading => 'Downloading...'; + + @override + String get busyUpgrading => 'Upgrading...'; + + @override + String get contacting => 'Contacting...'; + + @override + String get unknownStationTitle => 'Unknown Station'; + + @override + String get backButtonTitle => 'Back'; + + @override + String bytesUsed(Object bytesUsed) { + return '${bytesUsed}b of 512MB'; + } + + @override + String get calibrationStartTimer => 'Start Timer'; + + @override + String get calibrationTitle => 'Calibration'; + + @override + String get calibrateButton => 'Calibrate'; + + @override + String get calibrationDelete => 'Delete'; + + @override + String get calibrationBack => 'Back'; + + @override + String get calibrationKeepButton => 'Keep'; + + @override + String get calibrationSaveButton => 'Save Calibrations'; + + @override + String calibrationPoint(int step) { + return 'Calibration Point $step'; + } + + @override + String get factory => 'Factory'; + + @override + String get uncalibrated => 'Uncalibrated'; + + @override + String get calibrated => 'Calibrated'; + + @override + String get voltage => 'Voltage'; + + @override + String get standardTitle => 'Standard'; + + @override + String get waitingOnTimer => 'Waiting on Timer'; + + @override + String get waitingOnReading => 'Waiting for Fresh Reading'; + + @override + String get waitingOnForm => 'Values Required'; + + @override + String standardValue(Object uom, Object value) { + return '$value Standard Value ($uom)'; + } + + @override + String standardValue2(Object uom) { + return ' Standard Value ($uom)'; + } + + @override + String get sensorValue => 'Sensor Value:'; + + @override + String get oopsBugTitle => 'Oops, bug?'; + + @override + String get standard => 'Standard'; + + @override + String get minSec => 'min sec'; + + @override + String get countdownInstructions => + 'As you wait for the sensor value to stabilize, enter the standard value.'; + + @override + String get countdownInstructions2 => + 'Tap the Calibrate button to record the sensor value and the standard value.'; + + @override + String get calibrationMessage => + 'Recording these values together allows us to later calibrate the sensor.'; + + @override + String get standardFieldLabel => 'Standard'; + + @override + String get backAreYouSure => 'Are you sure?'; + + @override + String get backWarning => + 'Navigating away will require you start this calibration over.'; + + @override + String get settingsTitle => 'Settings'; + + @override + String get readingsSchedule => 'Data Capture Schedule'; + + @override + String get scheduleUpdated => 'Schedule Updated'; + + @override + String get settingsAdvanced => 'Advanced Settings'; + + @override + String get httpSync => 'HTTP Sync'; + + @override + String get httpSyncWarning => + 'This is an advanced setting, provided for backwards compatibility and troubleshooting situations. It is best to only enable if you are aware of what it does.'; + + @override + String get tailStationLogs => 'Tail Station Logs'; + + @override + String get settingsGeneral => 'General'; + + @override + String get settingsNameHint => 'Station Name'; + + @override + String get nameConfigSuccess => 'Station Name Updated.'; + + @override + String errorMessage(Object message) { + return 'Error: $message'; + } + + @override + String get settingsFirmware => 'Firmware'; + + @override + String get settingsModules => 'Modules'; + + @override + String get settingsWifi => 'WiFi'; + + @override + String get settingsLora => 'LoRa'; + + @override + String get settingsAutomaticUpload => 'Automatic Upload Settings'; + + @override + String get forgetStation => 'Forget Station'; + + @override + String get settingsEvents => 'Events'; + + @override + String get settingsLoraEdit => 'Edit'; + + @override + String get settingsLoraVerify => 'Verify'; + + @override + String get settingsLanguage => 'Language'; + + @override + String get endDeployment => 'End Deployment'; + + @override + String get error => 'Error'; + + @override + String get ok => 'OK'; + + @override + String get save => 'Save'; + + @override + String get submit => 'Submit'; + + @override + String get nameErrorDescription => + 'Name can only contain letters, numbers, underscores, and spaces.'; + + @override + String get settingsExport => 'Export CSV'; + + @override + String get exportStart => 'Start'; + + @override + String get exportShare => 'Share'; + + @override + String get exportCompleted => 'Completed'; + + @override + String get exportShareSubject => 'Export CSV'; + + @override + String get exportShareText => 'Share exported CSV'; + + @override + String get exportShareUnsupported => + 'Sharing not supported on this platform.'; + + @override + String get exportNoData => 'No data synced, please sync data.'; + + @override + String exportPossible(num readings) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + + return '$readingsString available to export.'; + } + + @override + String get onboardingNextButton => 'Next'; + + @override + String get onboardingCompleteButton => 'Done'; + + @override + String get languageEnglish => 'English'; + + @override + String get languageSpanish => 'Español'; + + @override + String get eventUnknown => 'Unknown Event'; + + @override + String get eventRestart => 'Restart Event'; + + @override + String get eventLora => 'LoRa Event'; + + @override + String get eventTime => 'Time'; + + @override + String get eventCode => 'Code'; + + @override + String get eventReason => 'Reason'; + + @override + String get noEvents => 'No Events'; + + @override + String get networksTitle => 'WiFi Networks'; + + @override + String get networkAddButton => 'Add Network'; + + @override + String get networkEditTitle => 'WiFi Network'; + + @override + String get networkSaveButton => 'Save'; + + @override + String get networkAutomaticUploadEnable => 'Enable'; + + @override + String get networkAutomaticUploadDisable => 'Disable'; + + @override + String get networkRemoveButton => 'Remove'; + + @override + String get networkNoMoreSlots => + 'Unfortunately, there are only two WiFi network slots available.'; + + @override + String get wifiSsid => 'SSID'; + + @override + String get wifiPassword => 'Password'; + + @override + String get confirmRemoveNetwork => 'Remove Network'; + + @override + String get loraBand => 'Band'; + + @override + String get loraAppKey => 'App Key'; + + @override + String get loraJoinEui => 'Join EUI'; + + @override + String get loraDeviceEui => 'Device EUI'; + + @override + String get loraDeviceAddress => 'Device Address'; + + @override + String get loraNetworkKey => 'Network Key'; + + @override + String get loraSessionKey => 'Session Key'; + + @override + String get loraNoModule => 'No LoRa module detected.'; + + @override + String get loraConfigurationTitle => 'LoRa Configuration'; + + @override + String get hexStringValidationFailed => 'Expected a valid hex string.'; + + @override + String get firmwareTitle => 'Firmware'; + + @override + String get firmwareUpgrade => 'Upgrade'; + + @override + String get firmwareContinue => 'Continue Update'; + + @override + String get firmwareCancel => 'Cancel'; + + @override + String get firmwareSwitch => 'Switch'; + + @override + String get firmwareStarting => 'Starting...'; + + @override + String get firmwareUploading => 'Uploading...'; + + @override + String get firmwareRestarting => 'Restarting...'; + + @override + String get firmwareReconnectTimeout => 'Unable to reconnect to station.'; + + @override + String get firmwareCompleted => 'Completed'; + + @override + String get firmwareFailed => + 'An unexpected error occured. Please contact support.'; + + @override + String get firmwareSdCardError => 'You need an SD card to upgrade firmware.'; + + @override + String get firmwareConnected => 'Connected'; + + @override + String get firmwareNotConnected => 'Not Connected'; + + @override + String firmwareVersion(Object firmwareVersion) { + return 'Version: $firmwareVersion'; + } + + @override + String get firmwareUpdated => 'Firmware is Up to Date'; + + @override + String get firmwareNotUpdated => 'Firmware is Not Up to Date'; + + @override + String get firmwareUpdate => 'Update Firmware'; + + @override + String get firmwareDismiss => 'OK'; + + @override + String get firmwareCheck => 'Check for New Firmware'; + + @override + String firmwareReleased(Object firmwareReleaseDate) { + return 'Released: $firmwareReleaseDate'; + } + + @override + String get firmwareTip => + 'During the upgrade your station may disconnect while restarting. If so, be sure to reconnect to your station.'; + + @override + String get firmwarePrepareTitle => 'Prepare For Update'; + + @override + String get firmwarePrepareTime => 'This update may take several minutes.'; + + @override + String get firmwarePrepareSd => + 'You will need an SD card in your station to complete the update.'; + + @override + String get firmwarePreparePower => + 'Keep your station plugged in and close to your device or smart phone.'; + + @override + String get firmwarePrepareConnection => + 'Your station will restart and you might have to reconnect to the station.'; + + @override + String get settingsAccounts => 'Accounts'; + + @override + String get accountsTitle => 'Accounts'; + + @override + String get accountsAddButton => 'Add an Account'; + + @override + String get accountsNoneCreatedTitle => + 'Looks like there are no accounts created yet'; + + @override + String get accountsNoneCreatedMessage => + 'Accounts are useful for updating your station information on the online portal and occasionally accessing user-specific firmware. Are you connected to the internet? Once you are, let\'s set up an account!'; + + @override + String get accountAddTitle => 'Add Account'; + + @override + String get accountEditTitle => 'Edit Account'; + + @override + String get noInternetConnection => + 'Connect your phone to the internet to login.'; + + @override + String get accountName => 'Name'; + + @override + String get accountEmail => 'Email'; + + @override + String get accountPassword => 'Password'; + + @override + String get accountConfirmPassword => 'Confirm Password'; + + @override + String get accountConfirmPasswordMatch => 'Passwords must match.'; + + @override + String get accountRegistrationFailed => + 'An error occured registering your account. Please double check your email and password.'; + + @override + String get accountFormFail => 'Invalid email or password.'; + + @override + String get accountSaveButton => 'Login'; + + @override + String get accountRegisterButton => 'Register'; + + @override + String get accountRemoveButton => 'Remove'; + + @override + String get accountRepairButton => 'Login'; + + @override + String get accountRegisterLabel => 'Create an account'; + + @override + String get accountDefault => 'This is your default account.'; + + @override + String get accountInvalid => 'Something is wrong with this account.'; + + @override + String get accountUnknown => 'Odd, not sure about this account. Bug?'; + + @override + String get accountConnectivity => + 'There was an issue connecting with this account. If the issue was network related this will correct itself.'; + + @override + String get accountCreated => + 'Registration successful! Please check your email for verification instructions prior to logging in.'; + + @override + String get accountUpdated => 'Your account has been successfully updated.'; + + @override + String get unknownError => + 'An unknown error occurred. Please try again later.'; + + @override + String get invalidCredentialsError => + 'The credentials you entered are incorrect. Please try again.'; + + @override + String get serverError => + 'There was a problem connecting to the server. Please check your connection and try again.'; + + @override + String bayNumber(Object bay) { + return 'Bay #$bay'; + } + + @override + String get configureButton => 'Configure'; + + @override + String get batteryLife => 'Battery Life'; + + @override + String get memoryUsage => 'Memory Used'; + + @override + String get confirmForgetStation => + 'Are you sure you want to remove this station.'; + + @override + String get confirmClearCalibrationTitle => 'Clear Calibration'; + + @override + String get confirmRemoveAccountTitle => 'Remove Account'; + + @override + String get confirmDelete => 'Are you sure?'; + + @override + String get confirmYes => 'Yes'; + + @override + String get confirmCancel => 'Cancel'; + + @override + String get onboardingTitle => 'Onboarding Instructions'; + + @override + String get helpTitle => 'Help'; + + @override + String get helpCheckList => 'Pre-deployment Checklist'; + + @override + String get tutorialGuide => 'Tutorial Guide'; + + @override + String get offlineProductGuide => 'Offline Product Guide'; + + @override + String get search => 'Search'; + + @override + String get enterSearchTerm => 'Enter Search Term'; + + @override + String get cancel => 'Cancel'; + + @override + String get errorLoadingPdf => 'Error loading PDF'; + + @override + String get appVersion => 'App Version'; + + @override + String get errorLoadingVersion => 'Error Loading App Version'; + + @override + String get noUpdates => 'No updates available'; + + @override + String get yesUpdates => 'Tap for updates'; + + @override + String get helpUploadLogs => 'Send Diagnostics'; + + @override + String get helpCreateBackup => 'Create Phone Backup'; + + @override + String get helpBackupCreated => 'Phone Backup Created'; + + @override + String get helpBackupFailed => 'Phone Backup Failed'; + + @override + String get backupShareSubject => 'FieldKit Backup'; + + @override + String get backupShareMessage => 'FieldKit application backup.'; + + @override + String get developerBuild => 'Developer Build'; + + @override + String get logsUploaded => 'Logs Uploaded'; + + @override + String get legalTitle => 'Legal'; + + @override + String get termsOfService => 'Terms of Service'; + + @override + String get privacyPolicy => 'Privacy Policy'; + + @override + String get licenses => 'Licenses'; + + @override + String get modulesWaterTemp => 'Water Temperature Module'; + + @override + String get modulesWaterPh => 'pH Module'; + + @override + String get modulesWaterOrp => 'ORP Module'; + + @override + String get modulesWaterDo => 'Dissolved Oxygen Module'; + + @override + String get modulesWaterEc => 'Conductivity Module'; + + @override + String get modulesWaterDepth => 'Water Depth Module'; + + @override + String get modulesWeather => 'Weather Module'; + + @override + String get modulesDiagnostics => 'Diagnostics Module'; + + @override + String get modulesRandom => 'Random Module'; + + @override + String get modulesDistance => 'Distance Module'; + + @override + String get modulesUnknown => 'Unknown Module'; + + @override + String get sensorWaterTemperature => 'Water Temperature'; + + @override + String get sensorWaterPh => 'pH'; + + @override + String get sensorWaterEc => 'Conductivity'; + + @override + String get sensorWaterDo => 'Dissolved Oxygen'; + + @override + String get sensorWaterDoPressure => 'Air Oxygen'; + + @override + String get sensorWaterDoTemperature => 'Air Temperature'; + + @override + String get sensorWaterOrp => 'ORP'; + + @override + String get sensorWaterDepthPressure => 'Water Depth (Pressure)'; + + @override + String get sensorWaterDepthTemperature => 'Water Temperature'; + + @override + String get sensorDiagnosticsTemperature => 'Internal Temperature'; + + @override + String get sensorDiagnosticsUptime => 'Uptime'; + + @override + String get sensorDiagnosticsMemory => 'Memory'; + + @override + String get sensorDiagnosticsFreeMemory => 'Free Memory'; + + @override + String get sensorDiagnosticsBatteryCharge => 'Battery'; + + @override + String get sensorDiagnosticsBatteryVoltage => 'Battery'; + + @override + String get sensorDiagnosticsBatteryVBus => 'Battery (VBus)'; + + @override + String get sensorDiagnosticsBatteryVs => 'Battery (Vs)'; + + @override + String get sensorDiagnosticsBatteryMa => 'Battery (mA)'; + + @override + String get sensorDiagnosticsBatteryPower => 'Battery (Power)'; + + @override + String get sensorDiagnosticsSolarVBus => 'Solar (VBus)'; + + @override + String get sensorDiagnosticsSolarVs => 'Solar (Vs)'; + + @override + String get sensorDiagnosticsSolarMa => 'Solar (mA)'; + + @override + String get sensorDiagnosticsSolarPower => 'Solar (Power)'; + + @override + String get sensorWeatherRain => 'Rain'; + + @override + String get sensorWeatherWindSpeed => 'Wind Speed'; + + @override + String get sensorWeatherWindDirection => 'Wind Direction'; + + @override + String get sensorWeatherHumidity => 'Humidity'; + + @override + String get sensorWeatherTemperature1 => 'Temperature 1'; + + @override + String get sensorWeatherTemperature2 => 'Temperature 2'; + + @override + String get sensorWeatherPressure => 'Pressure'; + + @override + String get sensorWeatherWindDir => 'Wind Direction'; + + @override + String get sensorWeatherWindDirMv => 'Wind Direction Raw ADC'; + + @override + String get sensorWeatherWindHrMaxSpeed => 'Wind Max Speed (1 hour)'; + + @override + String get sensorWeatherWindHrMaxDir => 'Wind Max Direction (1 hour)'; + + @override + String get sensorWeatherWind10mMaxSpeed => 'Wind Max Speed (10 min)'; + + @override + String get sensorWeatherWind10mMaxDir => 'Wind Max Direction (10 min)'; + + @override + String get sensorWeatherWind2mAvgSpeed => 'Wind Average Speed (2 min)'; + + @override + String get sensorWeatherWind2mAvgDir => 'Wind Average Direction (2 min)'; + + @override + String get sensorWeatherRainThisHour => 'Rain This Hour'; + + @override + String get sensorWeatherRainPrevHour => 'Rain Previous Hour'; + + @override + String get sensorDistanceDistance0 => 'Distance 0'; + + @override + String get sensorDistanceDistance1 => 'Distance 1'; + + @override + String get sensorDistanceDistance2 => 'Distance 2'; + + @override + String get sensorDistanceCalibration => 'Distance Cal'; + + @override + String get sensorRandomRandom0 => 'Random 0'; + + @override + String get sensorRandomRandom1 => 'Random 1'; + + @override + String get sensorRandomRandom2 => 'Random 2'; + + @override + String get sensorRandomRandom3 => 'Random 3'; + + @override + String get sensorRandomRandom4 => 'Random 4'; + + @override + String get sensorRandomRandom5 => 'Random 5'; + + @override + String get sensorRandomRandom6 => 'Random 6'; + + @override + String get sensorRandomRandom7 => 'Random 7'; + + @override + String get sensorRandomRandom8 => 'Random 8'; + + @override + String get sensorRandomRandom9 => 'Random 9'; + + @override + String get helpSettingsIconActive => 'Help Settings Icon - active'; + + @override + String get helpSettingsIconInactive => 'Help Settings Icon - inactive'; + + @override + String get helpSettingsIcon => 'Help Settings Icon'; + + @override + String get accountSettingsIcon => 'Account Settings Icon'; + + @override + String get languageSettingsIcon => 'Language Settings Icon'; + + @override + String get legalSettingsIcon => 'Legal Settings Icon'; + + @override + String get stationDisconnectedIcon => 'Station Disconnected Icon'; + + @override + String get stationDisconnectedTitle => 'Station Disconnected'; + + @override + String get troubleshootingSteps => 'Troubleshooting Steps:'; + + @override + String get getHelpButton => 'Get Help'; + + @override + String get stationConnectedMessage => 'Station Connected'; + + @override + String get stationDisconnectedMessage => 'Station Disconnected'; + + @override + String get pressWifiButtonAgain => '1. Press the WiFi button again'; + + @override + String get turnOnStationWifi => + '2. Turn on the station\'s WiFi access point directly from the station settings menu'; + + @override + String get visitSupportWebsite => '3. If you\'re still having issues, visit '; + + @override + String get unDeployStation => 'Undeploy Station'; + + @override + String get unDeployConfirmation => + 'Are you sure you want to undeploy this station? This will clear its deployment configuration.'; + + @override + String get unDeploySuccess => 'Station has been undeployed successfully'; + + @override + String get assembleStation => 'Assemble Station'; + + @override + String get stationSetupInstructions => 'Station Setup Instructions'; + + @override + String get phModuleSetup => 'pH Module Setup'; + + @override + String get waterTempModuleSetup => 'Water Temperature Module Setup'; + + @override + String get conductivityModuleSetup => 'Conductivity Module Setup'; + + @override + String get doModuleSetup => 'Dissolved Oxygen Module Setup'; + + @override + String get distanceModuleSetup => 'Distance Module Setup'; + + @override + String get weatherModuleSetup => 'Weather Module Setup'; + + @override + String get noModuleDescription => + 'No station has this type of module installed. Install this module on a station to calibrate it.'; +} diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart new file mode 100644 index 0000000000000000000000000000000000000000..5b3d839442b888749b74e23674ba7e5705be0e78 --- /dev/null +++ b/lib/l10n/app_localizations_es.dart @@ -0,0 +1,1276 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Spanish Castilian (`es`). +class AppLocalizationsEs extends AppLocalizations { + AppLocalizationsEs([String locale = 'es']) : super(locale); + + @override + String get fieldKit => 'FieldKit'; + + @override + String get loadingConfiguration => 'Configuración'; + + @override + String get loadingEnvironment => 'Entorno'; + + @override + String get loadingLocale => 'Local'; + + @override + String get welcomeTitle => '¡Bienvenido!'; + + @override + String get welcomeMessage => + 'Nuestra aplicación móvil facilita la configuración e instalación de tu estación FieldKit.'; + + @override + String get welcomeButton => 'Empezar'; + + @override + String get skipInstructions => 'Saltar instrucciones'; + + @override + String get errorStartingApp => 'Error al inicializar la aplicación.'; + + @override + String get stationsTab => 'Estaciones'; + + @override + String get dataSyncTab => 'Sincronización de datos'; + + @override + String get settingsTab => 'Configuración'; + + @override + String get helpTab => 'Ayuda'; + + @override + String get dataSyncTitle => 'Sincronización de datos'; + + @override + String get alertTitle => 'Importante'; + + @override + String get login => 'Iniciar sesión'; + + @override + String get dataLoginMessage => 'Para subir datos necesitas iniciar sesión:'; + + @override + String get modulesTitle => 'Módulos'; + + @override + String get addModulesButton => 'Añadir módulos'; + + @override + String get noModulesMessage => + 'Tu estación necesita módulos para completar la configuración, despliegue y captura de datos.'; + + @override + String get noModulesTitle => 'No hay módulos conectados'; + + @override + String get connectStation => 'Conectar estación'; + + @override + String get noStationsDescription => + 'No tienes estaciones. Agrega una estación para empezar a recoger datos.'; + + @override + String get noStationsDescription2 => + 'No tienes estaciones. Agrega una estación para calibrar módulos.'; + + @override + String get noStationsWhatIsStation => '¿Qué es una estación FieldKit?'; + + @override + String get locationDenied => 'Permiso de ubicación denegado'; + + @override + String get mapFullScreen => 'Mapa de pantalla completa'; + + @override + String get lastReadingLabel => ' (Última lectura)'; + + @override + String get daysHoursMinutes => 'días h min'; + + @override + String get download => 'Descargar'; + + @override + String get upload => 'Subir'; + + @override + String readingsUploadable(num readings) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + + String _temp0 = intl.Intl.pluralLogic( + readings, + locale: localeName, + other: '$readingsString subidas', + one: '1 subida', + zero: '0 subidas', + ); + return '$_temp0'; + } + + @override + String readingsDownloadable(num readings) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + + String _temp0 = intl.Intl.pluralLogic( + readings, + locale: localeName, + other: '$readingsString descargadas', + one: '1 descargada', + zero: '0 descardas', + ); + return '$_temp0'; + } + + @override + String downloadIncomplete(num readings, num total) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + final intl.NumberFormat totalNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String totalString = totalNumberFormat.format(total); + + return 'Solo se ha descargado $readingsString de $totalString.'; + } + + @override + String downloadProgress(num readings, num total) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + final intl.NumberFormat totalNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String totalString = totalNumberFormat.format(total); + + return '$readingsString descargado...'; + } + + @override + String get uploadProgress => 'Subiendo...'; + + @override + String readingsUploaded(num readings) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + + String _temp0 = intl.Intl.pluralLogic( + readings, + locale: localeName, + other: '$readingsString lecturas subidas', + one: '1 lectura subida', + zero: '0 lecturas subidas', + ); + return '$_temp0'; + } + + @override + String readingsDownloaded(num readings) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + + String _temp0 = intl.Intl.pluralLogic( + readings, + locale: localeName, + other: '$readingsString lecturas descargadas', + one: '1 lectura descargada', + zero: '0 lecturas descargadas', + ); + return '$_temp0'; + } + + @override + String get uploading => 'Subiendo'; + + @override + String get syncUploading => 'Subiendo...'; + + @override + String get syncDownloading => 'Descargando...'; + + @override + String get readytoDownload => 'Listo para descargar'; + + @override + String get readytoUpload => 'Listo para subir'; + + @override + String get connectivityIssue => 'Problema de conectividad de subida'; + + @override + String get authenticationIssue => 'Problema de iniciar sesión de subida'; + + @override + String get uploadFailed => 'Error al subir'; + + @override + String get downloadFailed => 'Error al descargar'; + + @override + String get syncDismissOk => 'OK'; + + @override + String get syncDownloadSuccess => '¡Descarga exitosa!'; + + @override + String get syncUploadSuccess => '¡Subida exitosa!'; + + @override + String get syncDownloadFailed => + 'Error: Descarga fallida. \nEspera unos segundos e inténtalo de nuevo.'; + + @override + String get syncUploadFailed => + 'Error: Error al subir. \nConéctate a internet e inténtalo de nuevo.'; + + @override + String get syncWorking => 'Procesando...'; + + @override + String get syncDisconnected => 'Estación desconectada.'; + + @override + String syncElapsed(Object elapsed) { + return '$elapsed pasado.'; + } + + @override + String get syncNoInternet => 'No hay conexión a internet.'; + + @override + String get syncNoAuthentication => 'No has iniciado sesión.'; + + @override + String get syncNoUpload => 'No hay datos para subir.'; + + @override + String get syncNoDownload => 'No hay datos para descargar.'; + + @override + String syncPercentageComplete(double complete) { + final intl.NumberFormat completeNumberFormat = + intl.NumberFormat.decimalPercentPattern( + locale: localeName, decimalDigits: 2); + final String completeString = completeNumberFormat.format(complete); + + return '$completeString completo.'; + } + + @override + String get quickTip => 'Sugerencia'; + + @override + String get stationConnected => 'Conectado'; + + @override + String get lastConnected => 'Última conexión'; + + @override + String get notConnected => 'No conectado'; + + @override + String lastConnectedSince(Object date) { + return 'Desde $date'; + } + + @override + String get manageFirmwareButton => 'Administrar firmware'; + + @override + String get importantNoteTitle => 'Nota importante: '; + + @override + String get updateRequiredDataPage => + 'Se necesita una actualización para sincronizar los datos de esta estación.'; + + @override + String get connectStationAlert => 'Para subir datos, conéctate a Internet.'; + + @override + String get loginStationAlert => 'Para subir datos'; + + @override + String get loginAndConnectStationAlert => + 'Para subir datos, conéctate a Internet y'; + + @override + String get loginLink => 'iniciar sesión'; + + @override + String get deployButton => 'Desplegar'; + + @override + String get deployTitle => 'Desplegar estación'; + + @override + String get deployLocation => 'Nombrar tu ubicación'; + + @override + String get stationDeployed => 'Estación desplegada'; + + @override + String get noStationsAvailable => 'No hay estaciones disponibles'; + + @override + String get connectToStation => + 'Por favor, conéctate a una estación para continuar'; + + @override + String get myStationsTitle => 'Mis estaciones'; + + @override + String get deployedAt => 'Desplegado'; + + @override + String get readyToDeploy => 'Listo para desplegar'; + + @override + String get readyToCalibrate => 'Listo para calibrar'; + + @override + String get calibratingBusy => 'Calibración...'; + + @override + String get busyWorking => 'Ocupado...'; + + @override + String get busyUploading => 'Subiendo...'; + + @override + String get busyDownloading => 'Descargando...'; + + @override + String get busyUpgrading => 'Actualizando...'; + + @override + String get contacting => 'Contactando...'; + + @override + String get unknownStationTitle => 'Estación desconocida'; + + @override + String get backButtonTitle => 'Atrás'; + + @override + String bytesUsed(Object bytesUsed) { + return '${bytesUsed}b de 512MB'; + } + + @override + String get calibrationStartTimer => 'Iniciar temporizador'; + + @override + String get calibrationTitle => 'Calibración'; + + @override + String get calibrateButton => 'Calibrar'; + + @override + String get calibrationDelete => 'Eliminar'; + + @override + String get calibrationBack => 'Atrás'; + + @override + String get calibrationKeepButton => 'Mantener'; + + @override + String get calibrationSaveButton => 'Guardar calibraciones'; + + @override + String calibrationPoint(int step) { + return 'Punto de calibración $step'; + } + + @override + String get factory => 'Fábrica'; + + @override + String get uncalibrated => 'No calibrado'; + + @override + String get calibrated => 'Calibrado'; + + @override + String get voltage => 'Voltaje'; + + @override + String get standardTitle => 'Estándar'; + + @override + String get waitingOnTimer => 'Esperando en el temporizador'; + + @override + String get waitingOnReading => 'Esperando a una lectura nueva'; + + @override + String get waitingOnForm => 'Valores requeridos'; + + @override + String standardValue(Object uom, Object value) { + return 'Valor estándar $value ($uom)'; + } + + @override + String standardValue2(Object uom) { + return 'Valor estándar ($uom)'; + } + + @override + String get sensorValue => 'Valor del sensor:'; + + @override + String get oopsBugTitle => 'Vaya, ¿un error?'; + + @override + String get standard => 'Estándar'; + + @override + String get minSec => 'min s'; + + @override + String get countdownInstructions => + 'Mientras esperas a que el valor del sensor se estabilice, introduce el valor estándar.'; + + @override + String get countdownInstructions2 => + 'Pulsa el botón Calibrar para grabar el valor del sensor y el valor estándar.'; + + @override + String get calibrationMessage => + 'La grabación de estos valores juntos nos permite calibrar el sensor más adelante.'; + + @override + String get standardFieldLabel => 'Estándar'; + + @override + String get backAreYouSure => '¿Estás seguro?'; + + @override + String get backWarning => + 'Navegar hacia fuera requerirá iniciar esta calibración.'; + + @override + String get settingsTitle => 'Configuración'; + + @override + String get readingsSchedule => 'Horario de captura de datos'; + + @override + String get scheduleUpdated => 'Horario actualizado'; + + @override + String get settingsAdvanced => 'Configuración avanzada'; + + @override + String get httpSync => 'Sincronización HTTP'; + + @override + String get httpSyncWarning => + 'Este es un ajuste avanzado, provisto para compatibilidad hacia atrás y situaciones de solución de problemas. Lo mejor es activar sólo si se sabes lo que hace.'; + + @override + String get tailStationLogs => 'Registros de la estación finales'; + + @override + String get settingsGeneral => 'General'; + + @override + String get settingsNameHint => 'Nombre de estación'; + + @override + String get nameConfigSuccess => 'Nombre de la estación actualizado'; + + @override + String errorMessage(Object message) { + return 'Error: $message'; + } + + @override + String get settingsFirmware => 'Firmware'; + + @override + String get settingsModules => 'Módulos'; + + @override + String get settingsWifi => 'WiFi'; + + @override + String get settingsLora => 'LoRa'; + + @override + String get settingsAutomaticUpload => 'Configuración de subida automática'; + + @override + String get forgetStation => 'Olvidar estación'; + + @override + String get settingsEvents => 'Eventos'; + + @override + String get settingsLoraEdit => 'Modificar'; + + @override + String get settingsLoraVerify => 'Verificar'; + + @override + String get settingsLanguage => 'Idioma'; + + @override + String get endDeployment => 'Finalizar despliegue'; + + @override + String get error => 'Error'; + + @override + String get ok => 'OK'; + + @override + String get save => 'Guardar'; + + @override + String get submit => 'Enviar'; + + @override + String get nameErrorDescription => + 'El nombre sólo puede contener letras, números, guiones bajos y espacios.'; + + @override + String get settingsExport => 'Exportar CSV'; + + @override + String get exportStart => 'Iniciar'; + + @override + String get exportShare => 'Compartir'; + + @override + String get exportCompleted => 'Completado'; + + @override + String get exportShareSubject => 'Exportar CSV'; + + @override + String get exportShareText => 'Compartir CSV exportado'; + + @override + String get exportShareUnsupported => + 'Compartir no está soportado en esta plataforma.'; + + @override + String get exportNoData => + 'No hay datos sincronizados, por favor sincroniza los datos.'; + + @override + String exportPossible(num readings) { + final intl.NumberFormat readingsNumberFormat = + intl.NumberFormat.decimalPattern(localeName); + final String readingsString = readingsNumberFormat.format(readings); + + return '$readingsString disponible para exportar.'; + } + + @override + String get onboardingNextButton => 'Siguiente'; + + @override + String get onboardingCompleteButton => 'Hecho'; + + @override + String get languageEnglish => 'Inglés'; + + @override + String get languageSpanish => 'Español'; + + @override + String get eventUnknown => 'Evento desconocido'; + + @override + String get eventRestart => 'Reiniciar evento'; + + @override + String get eventLora => 'Evento LoRa'; + + @override + String get eventTime => 'Tiempo'; + + @override + String get eventCode => 'Código'; + + @override + String get eventReason => 'Razón'; + + @override + String get noEvents => 'No hay eventos'; + + @override + String get networksTitle => 'Redes WiFi'; + + @override + String get networkAddButton => 'Añadir red'; + + @override + String get networkEditTitle => 'Red WiFi'; + + @override + String get networkSaveButton => 'Guardar'; + + @override + String get networkAutomaticUploadEnable => 'Activar'; + + @override + String get networkAutomaticUploadDisable => 'Desactivar'; + + @override + String get networkRemoveButton => 'Eliminar'; + + @override + String get networkNoMoreSlots => + 'Desafortunadamente, sólo hay dos posiciones de red WiFi disponibles.'; + + @override + String get wifiSsid => 'SSID'; + + @override + String get wifiPassword => 'Contraseña'; + + @override + String get confirmRemoveNetwork => 'Eliminar red'; + + @override + String get loraBand => 'Frecuencia'; + + @override + String get loraAppKey => 'Clave de App'; + + @override + String get loraJoinEui => 'Únete a EUI'; + + @override + String get loraDeviceEui => 'EUI de dispositivo'; + + @override + String get loraDeviceAddress => 'Dirección del dispositivo'; + + @override + String get loraNetworkKey => 'Clave de red'; + + @override + String get loraSessionKey => 'Clave de sesión'; + + @override + String get loraNoModule => 'No se ha detectado ningún módulo LoRa.'; + + @override + String get loraConfigurationTitle => 'Configuración de LoRa'; + + @override + String get hexStringValidationFailed => + 'Se esperaba una cadena hexadecimal válida.'; + + @override + String get firmwareTitle => 'Firmware'; + + @override + String get firmwareUpgrade => 'Actualizar'; + + @override + String get firmwareContinue => 'Continuar actualización'; + + @override + String get firmwareCancel => 'Cancelar'; + + @override + String get firmwareSwitch => 'Cambiar'; + + @override + String get firmwareStarting => 'Iniciando...'; + + @override + String get firmwareUploading => 'Subiendo...'; + + @override + String get firmwareRestarting => 'Reiniciando...'; + + @override + String get firmwareReconnectTimeout => + 'No se puede reconectar a la estación.'; + + @override + String get firmwareCompleted => 'Completado'; + + @override + String get firmwareFailed => + 'Se ha producido un error inesperado. Por favor, póngate en contacto con el servicio de asistencia de FieldKit.'; + + @override + String get firmwareSdCardError => + 'Necesitas una tarjeta SD para actualizar el firmware.'; + + @override + String get firmwareConnected => 'Conectado'; + + @override + String get firmwareNotConnected => 'No conectado'; + + @override + String firmwareVersion(Object firmwareVersion) { + return 'Versión: $firmwareVersion'; + } + + @override + String get firmwareUpdated => 'El firmware está actualizado'; + + @override + String get firmwareNotUpdated => 'El firmware no está actualizado'; + + @override + String get firmwareUpdate => 'Actualizar firmware'; + + @override + String get firmwareDismiss => 'OK'; + + @override + String get firmwareCheck => 'Buscar nuevas versiones de firmware'; + + @override + String firmwareReleased(Object firmwareReleaseDate) { + return 'Publicada: $firmwareReleaseDate'; + } + + @override + String get firmwareTip => + 'Durante la actualización la estación puede desconectarse mientras se reinicia. Si es así, asegúrate de volver a conectar a tu estación.'; + + @override + String get firmwarePrepareTitle => 'Preparar para actualizar'; + + @override + String get firmwarePrepareTime => + 'Esta actualización puede durar varios minutos.'; + + @override + String get firmwarePrepareSd => + 'Necesitarás una tarjeta SD en tu estación para completar la actualización.'; + + @override + String get firmwarePreparePower => + 'Mantén tu estación conectada y cerca de tu dispositivo o smartphone.'; + + @override + String get firmwarePrepareConnection => + 'Tu estación se reiniciará y es posible que tengas que volver a conectar tu teléfono a la estación.'; + + @override + String get settingsAccounts => 'Cuentas'; + + @override + String get accountsTitle => 'Cuentas'; + + @override + String get accountsAddButton => 'Añadir una cuenta'; + + @override + String get accountsNoneCreatedTitle => + 'Parece que todavía no hay cuentas creadas.'; + + @override + String get accountsNoneCreatedMessage => + 'Tener una cuenta FieldKit es útil para actualizar la información de tu estación en el portal en línea y de vez en cuando acceder al firmware específico del usuario. ¿Estás conectado al internet? ¡Una vez que estés, configuremos una cuenta para ti!'; + + @override + String get accountAddTitle => 'Añadir cuenta'; + + @override + String get accountEditTitle => 'Editar cuenta'; + + @override + String get noInternetConnection => + 'Conecta tu teléfono a internet para iniciar sesión.'; + + @override + String get accountName => 'Nombre'; + + @override + String get accountEmail => 'Correo electrónico'; + + @override + String get accountPassword => 'Contraseña'; + + @override + String get accountConfirmPassword => 'Confirmar contraseña'; + + @override + String get accountConfirmPasswordMatch => 'Las contraseñas deben coincidir.'; + + @override + String get accountRegistrationFailed => + 'Se ha producido un error al registrar tu cuenta. Por favor, comprueba tu correo electrónico y contraseña.'; + + @override + String get accountFormFail => 'Email o contraseña inválidos.'; + + @override + String get accountSaveButton => 'Iniciar sesión'; + + @override + String get accountRegisterButton => 'Registrarte'; + + @override + String get accountRemoveButton => 'Eliminar'; + + @override + String get accountRepairButton => 'Iniciar sesión'; + + @override + String get accountRegisterLabel => 'Crear una cuenta'; + + @override + String get accountDefault => 'Esta es tu cuenta predeterminada.'; + + @override + String get accountInvalid => 'Algo va mal con esta cuenta.'; + + @override + String get accountUnknown => 'No está seguro de esta cuenta. ¿Falla?'; + + @override + String get accountConnectivity => + 'Hubo un problema al conectar con esta cuenta. Si el problema fue relacionado con la red, esto se corregirá a sí mismo.'; + + @override + String get accountCreated => + '¡Registro exitoso! Por favor revisa tu correo electrónico para obtener instrucciones de verificación antes de iniciar sesión.'; + + @override + String get accountUpdated => 'Tu cuenta se ha actualizado correctamente.'; + + @override + String get unknownError => + 'Se ha producido un error desconocido. Inténtalo de nuevo más tarde.'; + + @override + String get invalidCredentialsError => + 'Las credenciales introducidas son incorrectas. Por favor, inténtalo de nuevo.'; + + @override + String get serverError => + 'Hubo un problema al conectar con el servidor. Por favor, comprueba tu conexión e inténtalo de nuevo.'; + + @override + String bayNumber(Object bay) { + return 'Bahía #$bay'; + } + + @override + String get configureButton => 'Configurar'; + + @override + String get batteryLife => 'Carga de la batería'; + + @override + String get memoryUsage => 'Memoria utilizada'; + + @override + String get confirmForgetStation => + '¿Estás seguro de que quieres eliminar esta estación?'; + + @override + String get confirmClearCalibrationTitle => 'Borrar calibración'; + + @override + String get confirmRemoveAccountTitle => 'Eliminar cuenta'; + + @override + String get confirmDelete => '¿Estás seguro?'; + + @override + String get confirmYes => 'Sí'; + + @override + String get confirmCancel => 'Cancelar'; + + @override + String get onboardingTitle => 'Instrucciones de incorporación'; + + @override + String get helpTitle => 'Ayuda'; + + @override + String get helpCheckList => 'Lista de verificación previa a la instalación'; + + @override + String get tutorialGuide => 'Guía tutorial'; + + @override + String get offlineProductGuide => 'Guía de producto (sin conexión)'; + + @override + String get search => 'Buscar'; + + @override + String get enterSearchTerm => 'Ingresar término de búsqueda'; + + @override + String get cancel => 'Cancelar'; + + @override + String get errorLoadingPdf => 'Error al cargar PDF'; + + @override + String get appVersion => 'Versión de App'; + + @override + String get errorLoadingVersion => + 'Error al cargar la versión de la aplicación'; + + @override + String get noUpdates => 'No hay actualizaciones disponibles'; + + @override + String get yesUpdates => 'Pulsa para actualizar'; + + @override + String get helpUploadLogs => 'Enviar diagnóstico'; + + @override + String get helpCreateBackup => 'Crear copia de seguridad del teléfono'; + + @override + String get helpBackupCreated => 'Copia de seguridad en el teléfono creada'; + + @override + String get helpBackupFailed => + 'Fallo en la copia de seguridad en el teléfono'; + + @override + String get backupShareSubject => 'Copia de seguridad FieldKit'; + + @override + String get backupShareMessage => + 'Copia de seguridad de la aplicación FieldKit.'; + + @override + String get developerBuild => 'Versión de desarrollador'; + + @override + String get logsUploaded => 'Registros subidos'; + + @override + String get legalTitle => 'Legal'; + + @override + String get termsOfService => 'Términos de servicio'; + + @override + String get privacyPolicy => 'Política de privacidad'; + + @override + String get licenses => 'Licencias'; + + @override + String get modulesWaterTemp => 'Módulo de temperatura del agua'; + + @override + String get modulesWaterPh => 'Módulo de pH'; + + @override + String get modulesWaterOrp => 'Módulo de ORP'; + + @override + String get modulesWaterDo => 'Módulo de oxígeno disuelto'; + + @override + String get modulesWaterEc => 'Módulo de conductividad'; + + @override + String get modulesWaterDepth => 'Módulo de profundidad de agua'; + + @override + String get modulesWeather => 'Módulo meteorológico'; + + @override + String get modulesDiagnostics => 'Módulo de diagnóstico'; + + @override + String get modulesRandom => 'Módulo aleatorio'; + + @override + String get modulesDistance => 'Módulo de distancia'; + + @override + String get modulesUnknown => 'Módulo desconocido'; + + @override + String get sensorWaterTemperature => 'Temperatura del agua'; + + @override + String get sensorWaterPh => 'pH'; + + @override + String get sensorWaterEc => 'Conductividad'; + + @override + String get sensorWaterDo => 'Oxígeno disuelto'; + + @override + String get sensorWaterDoPressure => 'Oxígeno del aire'; + + @override + String get sensorWaterDoTemperature => 'Temperatura del aire'; + + @override + String get sensorWaterOrp => 'Potencial de reducción (ORP)'; + + @override + String get sensorWaterDepthPressure => 'Profundidad del agua (presión)'; + + @override + String get sensorWaterDepthTemperature => 'Temperatura del agua'; + + @override + String get sensorDiagnosticsTemperature => 'Temperatura interna'; + + @override + String get sensorDiagnosticsUptime => 'Periodo de uso'; + + @override + String get sensorDiagnosticsMemory => 'Memoria'; + + @override + String get sensorDiagnosticsFreeMemory => 'Memoria libre'; + + @override + String get sensorDiagnosticsBatteryCharge => 'Batería'; + + @override + String get sensorDiagnosticsBatteryVoltage => 'Batería'; + + @override + String get sensorDiagnosticsBatteryVBus => 'Batería (VBus)'; + + @override + String get sensorDiagnosticsBatteryVs => 'Batería (Vs)'; + + @override + String get sensorDiagnosticsBatteryMa => 'Batería (mA)'; + + @override + String get sensorDiagnosticsBatteryPower => 'Batería (Potencia)'; + + @override + String get sensorDiagnosticsSolarVBus => 'Solar (VBus)'; + + @override + String get sensorDiagnosticsSolarVs => 'Solar (Vs)'; + + @override + String get sensorDiagnosticsSolarMa => 'Solar (mA)'; + + @override + String get sensorDiagnosticsSolarPower => 'Solar (Potencia)'; + + @override + String get sensorWeatherRain => 'Lluvia'; + + @override + String get sensorWeatherWindSpeed => 'Velocidad del viento'; + + @override + String get sensorWeatherWindDirection => 'Dirección del viento'; + + @override + String get sensorWeatherHumidity => 'Humedad'; + + @override + String get sensorWeatherTemperature1 => 'Temperatura 1'; + + @override + String get sensorWeatherTemperature2 => 'Temperatura 2'; + + @override + String get sensorWeatherPressure => 'Presión'; + + @override + String get sensorWeatherWindDir => 'Dirección del viento'; + + @override + String get sensorWeatherWindDirMv => 'Dirección viento ADC crudo'; + + @override + String get sensorWeatherWindHrMaxSpeed => + 'Velocidad máxima del viento (1 hora)'; + + @override + String get sensorWeatherWindHrMaxDir => + 'Dirección máxima del viento (1 hora)'; + + @override + String get sensorWeatherWind10mMaxSpeed => + 'Velocidad máxima del viento (10 min)'; + + @override + String get sensorWeatherWind10mMaxDir => + 'Dirección máxima del viento (10 min)'; + + @override + String get sensorWeatherWind2mAvgSpeed => + 'Velocidad media del viento (2 min)'; + + @override + String get sensorWeatherWind2mAvgDir => 'Dirección media del viento (2 min)'; + + @override + String get sensorWeatherRainThisHour => 'Lluvia esta hora'; + + @override + String get sensorWeatherRainPrevHour => 'Lluvia en la hora anterior'; + + @override + String get sensorDistanceDistance0 => 'Distancia 0'; + + @override + String get sensorDistanceDistance1 => 'Distancia 1'; + + @override + String get sensorDistanceDistance2 => 'Distancia 2'; + + @override + String get sensorDistanceCalibration => 'Cal de Distancia'; + + @override + String get sensorRandomRandom0 => 'Aleatorio 0'; + + @override + String get sensorRandomRandom1 => 'Aleatorio 1'; + + @override + String get sensorRandomRandom2 => 'Aleatorio 2'; + + @override + String get sensorRandomRandom3 => 'Aleatorio 3'; + + @override + String get sensorRandomRandom4 => 'Aleatorio 4'; + + @override + String get sensorRandomRandom5 => 'Aleatorio 5'; + + @override + String get sensorRandomRandom6 => 'Aleatorio 6'; + + @override + String get sensorRandomRandom7 => 'Aleatorio 7'; + + @override + String get sensorRandomRandom8 => 'Aleatorio 8'; + + @override + String get sensorRandomRandom9 => 'Aleatorio 9'; + + @override + String get helpSettingsIconActive => + 'Icono de configuración de ayuda - activo'; + + @override + String get helpSettingsIconInactive => + 'Icono de configuración de ayuda - inactivo'; + + @override + String get helpSettingsIcon => 'Icono de configuración de ayuda'; + + @override + String get accountSettingsIcon => 'Icono de configuración de cuenta'; + + @override + String get languageSettingsIcon => 'Icono de configuración de idioma'; + + @override + String get legalSettingsIcon => 'Icono de configuración legal'; + + @override + String get stationDisconnectedIcon => 'Icono de la estación desconectada'; + + @override + String get stationDisconnectedTitle => 'Estación desconectada'; + + @override + String get troubleshootingSteps => 'Pasos de solución de problemas:'; + + @override + String get getHelpButton => 'Obtener ayuda'; + + @override + String get stationConnectedMessage => 'Estación conectada'; + + @override + String get stationDisconnectedMessage => 'Estación desconectada'; + + @override + String get pressWifiButtonAgain => '1. Pulse de nuevo el botón WiFi'; + + @override + String get turnOnStationWifi => + '2. Enciende el punto de acceso WiFi directamente desde el menú de configuración de la estación'; + + @override + String get visitSupportWebsite => '3. Si todavía tienes problemas, visita '; + + @override + String get unDeployStation => 'Undeploy Station'; + + @override + String get unDeployConfirmation => + 'Are you sure you want to undeploy this station? This will clear its deployment configuration.'; + + @override + String get unDeploySuccess => 'Station has been undeployed successfully'; + + @override + String get assembleStation => 'Ensamblar la estación'; + + @override + String get stationSetupInstructions => + 'Instrucciones de configuración de la estación'; + + @override + String get phModuleSetup => 'Configuración del módulo pH'; + + @override + String get waterTempModuleSetup => + 'Configuración del módulo de temperatura del agua'; + + @override + String get conductivityModuleSetup => + 'Configuración del módulo de conductividad'; + + @override + String get doModuleSetup => 'Configuración del módulo de oxígeno disuelto'; + + @override + String get distanceModuleSetup => 'Configuración del módulo de distancia'; + + @override + String get weatherModuleSetup => 'Configuración del módulo meteorológico'; + + @override + String get noModuleDescription => + 'Ninguna estación tiene este tipo de módulo instalado. Instala este módulo en una estación para calibrarlo.'; +} diff --git a/lib/map_widget.dart b/lib/map_widget.dart index 17a2b72d0d527cfd040811ca0e4ec72cf4b69d71..435800f43d5668d3d6aca1cc15302908e8bf27df 100644 --- a/lib/map_widget.dart +++ b/lib/map_widget.dart @@ -6,7 +6,7 @@ import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map_location_marker/flutter_map_location_marker.dart'; import 'package:latlong2/latlong.dart'; import 'package:location/location.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; // Define default coordinates double conservifyLat = 34.0312492; diff --git a/lib/meta.dart b/lib/meta.dart index b0ddb2506c4cdaaf7d36ea0474be31bc4df99332..5dc8f123db3373593fe44cffa6d84d95366944ec 100644 --- a/lib/meta.dart +++ b/lib/meta.dart @@ -1,6 +1,6 @@ import 'package:caldor/calibration.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'diagnostics.dart'; import 'gen/api.dart'; diff --git a/lib/my_stations_page.dart b/lib/my_stations_page.dart index 12ceb5c52604dbb07168b5dc66fa11ede753737d..e16bd6540845e944fb67e6ca4bb20c1e9296b09f 100644 --- a/lib/my_stations_page.dart +++ b/lib/my_stations_page.dart @@ -1,6 +1,6 @@ import 'package:fk/models/known_stations_model.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:provider/provider.dart'; import 'package:intl/intl.dart'; diff --git a/lib/no_stations_widget.dart b/lib/no_stations_widget.dart index 9ef6c681b95de7476ab4e2b3ae74238ea12cf889..4da636eff8893993152724a71fa57e55955092be 100644 --- a/lib/no_stations_widget.dart +++ b/lib/no_stations_widget.dart @@ -2,7 +2,7 @@ import 'package:fk/constants.dart'; import 'package:fk/reader/screens.dart'; import 'package:flows/flows.dart' as flows; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:url_launcher/link.dart'; import 'package:open_settings_plus/open_settings_plus.dart'; diff --git a/lib/settings/accounts_list_widget.dart b/lib/settings/accounts_list_widget.dart index 025219fcd45bde596715b238d9111c71b5ac2d5a..c97eca1f282cf8d9ffabeb8d542ad308f9c9049a 100644 --- a/lib/settings/accounts_list_widget.dart +++ b/lib/settings/accounts_list_widget.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:fk/common_widgets.dart'; import '../app_state.dart'; diff --git a/lib/settings/accounts_page.dart b/lib/settings/accounts_page.dart index 80b79e15e6249061d67705e7c01e32c1de512571..01016f4408577d0d9ef664e76e1f5f0d29510baa 100644 --- a/lib/settings/accounts_page.dart +++ b/lib/settings/accounts_page.dart @@ -1,7 +1,7 @@ import 'package:fk/common_widgets.dart'; import 'package:fk/settings/accounts_list_widget.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:provider/provider.dart'; import '../app_state.dart'; diff --git a/lib/settings/advanced_settings.dart b/lib/settings/advanced_settings.dart index 4fe590e1c898964e236c7714bcf97fb9541b5732..6d610494d201d1b9db06d293986b240e9dc657e2 100644 --- a/lib/settings/advanced_settings.dart +++ b/lib/settings/advanced_settings.dart @@ -1,6 +1,6 @@ import 'package:fk/preferences.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; class AdvancedSettingsPage extends StatelessWidget { const AdvancedSettingsPage({super.key}); diff --git a/lib/settings/edit_account_page.dart b/lib/settings/edit_account_page.dart index 512190d4627b7206aeeb392690d586b7650f8fba..a75dd294d41fe1fca0d75f3d695324823aed0133 100644 --- a/lib/settings/edit_account_page.dart +++ b/lib/settings/edit_account_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:fk/common_widgets.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_svg/svg.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; @@ -60,7 +60,8 @@ class _EditAccountPageState extends State { bool tncAccept = true; final error = await accounts.registerAccount(email, password, name, tncAccept); - if (error == null) { // Note, registerAccount returns null on success + if (error == null) { + // Note, registerAccount returns null on success navigator.pop(); messenger.showSnackBar(SnackBar( content: Text(localizations.accountCreated), @@ -70,7 +71,8 @@ class _EditAccountPageState extends State { } } else { final error = await accounts.addOrUpdate(email, password); - if (error == null) { // Note, addOrUpdate returns null on success + if (error == null) { + // Note, addOrUpdate returns null on success navigator.pop(); messenger.showSnackBar(SnackBar( content: Text(localizations.accountUpdated), diff --git a/lib/settings/help_page.dart b/lib/settings/help_page.dart index 0f302aadda89f76bd6c64403e641aeaac96c60e9..b3dc505e68aa1cad76c6897c747742cfe8fd5a2e 100644 --- a/lib/settings/help_page.dart +++ b/lib/settings/help_page.dart @@ -2,7 +2,7 @@ import 'package:fk/diagnostics.dart'; import 'package:fk/models/known_stations_model.dart'; import 'package:fk/reader/screens.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:share_plus/share_plus.dart'; diff --git a/lib/settings/language_page.dart b/lib/settings/language_page.dart index 943f59d1e577db8bd0fff66f9d7e8ed6ea009342..d192579dec39f22994e021045493e591162d132d 100644 --- a/lib/settings/language_page.dart +++ b/lib/settings/language_page.dart @@ -1,6 +1,6 @@ import 'package:fk/app_widget.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; class LanguagePage extends StatelessWidget { const LanguagePage({super.key}); @@ -43,9 +43,9 @@ class SelectLocaleWidget extends StatelessWidget { title: Text(label), controlAffinity: ListTileControlAffinity.leading, onChanged: (selectedLocale) { - if (selectedLocale != null) { - OurApp.setLocale(context, selectedLocale); - } + if (selectedLocale != null) { + OurApp.setLocale(context, selectedLocale); + } }, value: locale, groupValue: active, diff --git a/lib/settings/legal_page.dart b/lib/settings/legal_page.dart index 493597c4ce4ccd0123efd7a36db94597cef5afb0..088bfff5feb8f9f18f4e74f42c887bed7d2dc759 100644 --- a/lib/settings/legal_page.dart +++ b/lib/settings/legal_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:url_launcher/link.dart'; diff --git a/lib/settings/pdf_viewer.dart b/lib/settings/pdf_viewer.dart index eced7c6e0c14b87b3b60afacbdced183be8f8d35..42d19c52cc46ccf1487e4ebc054557c8d2f0a74e 100644 --- a/lib/settings/pdf_viewer.dart +++ b/lib/settings/pdf_viewer.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:pdfrx/pdfrx.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; class PdfViewerPage extends StatefulWidget { const PdfViewerPage({super.key}); @@ -14,7 +14,6 @@ class PdfViewerPageState extends State { // create a PdfTextSearcher and add a listener to update the GUI on search result changes late final textSearcher = PdfTextSearcher(controller); - @override void dispose() { // dispose the PdfTextSearcher @@ -42,8 +41,7 @@ class PdfViewerPageState extends State { content: TextField( autofocus: true, decoration: InputDecoration( - hintText: - localizations.enterSearchTerm, + hintText: localizations.enterSearchTerm, ), onChanged: (value) { input = value; @@ -51,13 +49,11 @@ class PdfViewerPageState extends State { ), actions: [ TextButton( - onPressed: () => - Navigator.of(context).pop(null), + onPressed: () => Navigator.of(context).pop(null), child: Text(localizations.cancel), ), TextButton( - onPressed: () => - Navigator.of(context).pop(input), + onPressed: () => Navigator.of(context).pop(input), child: Text(localizations.search), ), ], diff --git a/lib/settings/settings_page.dart b/lib/settings/settings_page.dart index a9d76b66dee9a05485dedc4339c971a7b69f1790..f21808745309f11920cf3ec10d39fca451371401 100644 --- a/lib/settings/settings_page.dart +++ b/lib/settings/settings_page.dart @@ -1,6 +1,6 @@ import 'package:fk/settings/advanced_settings.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'language_page.dart'; diff --git a/lib/station_disconnected_help.dart b/lib/station_disconnected_help.dart index 311694b72a534fdaefe816c1af01abac26ac4697..b25ff90cb0d680ddcba04def5adbc4a1e9e4ac57 100644 --- a/lib/station_disconnected_help.dart +++ b/lib/station_disconnected_help.dart @@ -1,6 +1,6 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:flutter_svg/svg.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/station_notifications.dart b/lib/station_notifications.dart index 14daf42a1bbc22794deac6acc700805381265943..97ced22454139b82706444dfc8adae6daa4fc11b 100644 --- a/lib/station_notifications.dart +++ b/lib/station_notifications.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'dart:async'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; class StationNotifications { final ScaffoldMessengerState? scaffoldMessengerState; diff --git a/lib/sync/components/data_status_widget.dart b/lib/sync/components/data_status_widget.dart index 853200cc71cccc61682a471966baa9e40ba1ead8..f24dd47c57604f1ff4cd4b4c73434d681a520b63 100644 --- a/lib/sync/components/data_status_widget.dart +++ b/lib/sync/components/data_status_widget.dart @@ -1,7 +1,7 @@ import 'package:fk/models/known_stations_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import '../../view_station/firmware_page.dart'; class FirmwareUpdateWidget extends StatelessWidget { diff --git a/lib/sync/components/login_required_widget.dart b/lib/sync/components/login_required_widget.dart index 3f0fa872bb103bf143fabe49888cd6dc28670224..d9800e402ae5f6d841835aacb12ec3a59f423eeb 100644 --- a/lib/sync/components/login_required_widget.dart +++ b/lib/sync/components/login_required_widget.dart @@ -1,7 +1,7 @@ import 'package:fk/app_state.dart'; import 'package:fk/common_widgets.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import '../../../settings/edit_account_page.dart'; class LoginRequiredWidget extends StatelessWidget { @@ -25,7 +25,11 @@ class LoginRequiredWidget extends StatelessWidget { MaterialPageRoute( builder: (context) => EditAccountPage( original: PortalAccount( - email: "", name: "", tokens: null, active: false, validity: Validity.unchecked), + email: "", + name: "", + tokens: null, + active: false, + validity: Validity.unchecked), ), ), ); @@ -36,4 +40,3 @@ class LoginRequiredWidget extends StatelessWidget { ); } } - diff --git a/lib/sync/components/no_stations_help_widget.dart b/lib/sync/components/no_stations_help_widget.dart index 5fad64df1e283b8e98096e9367b32e906e45f25a..d7e99c56ecf56c0c0f424530505f5ceadc4345b0 100644 --- a/lib/sync/components/no_stations_help_widget.dart +++ b/lib/sync/components/no_stations_help_widget.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; class NoStationsHelpWidget extends StatelessWidget { final bool showImage; diff --git a/lib/sync/components/upload_alert_banner.dart b/lib/sync/components/upload_alert_banner.dart index 1c9024a8bc28e84c7b758f030670cbda6d956543..18c44c3afd88183ebe8f3d1907cad25099a0a9fc 100644 --- a/lib/sync/components/upload_alert_banner.dart +++ b/lib/sync/components/upload_alert_banner.dart @@ -3,7 +3,7 @@ import 'package:fk/settings/edit_account_page.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; class UploadAlertBanner extends StatelessWidget { final bool login; diff --git a/lib/sync/data_sync_page.dart b/lib/sync/data_sync_page.dart index a5ae57afeee21473898af1523607bce037dcb5b6..013608239cbde6fc9ecc7431cb78d409ec981ebb 100644 --- a/lib/sync/data_sync_page.dart +++ b/lib/sync/data_sync_page.dart @@ -12,7 +12,7 @@ import 'package:fk/no_stations_widget.dart'; import 'package:fk/common_widgets.dart'; import 'package:fk/components/last_connected.dart'; import 'package:simple_circular_progress_bar/simple_circular_progress_bar.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:wakelock_plus/wakelock_plus.dart'; // Enum to define acknowledgment statuses for syncing diff --git a/lib/unknown_station_page.dart b/lib/unknown_station_page.dart index 55328eb5695ef5b5d5ac516cd6814bda80278f64..bca457c2d6a47920f4cd27f9a617baad2ff7e3b6 100644 --- a/lib/unknown_station_page.dart +++ b/lib/unknown_station_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'common_widgets.dart'; diff --git a/lib/view_station/configure_lora.dart b/lib/view_station/configure_lora.dart index 8a4f8bc5871f4878a2e94a19d9820baa44c4d7cc..8c22e878623202249c84757f0a54a7c4f86a17ea 100644 --- a/lib/view_station/configure_lora.dart +++ b/lib/view_station/configure_lora.dart @@ -7,7 +7,7 @@ import 'package:loader_overlay/loader_overlay.dart'; import 'package:fk/diagnostics.dart'; import 'package:fk/common_widgets.dart'; import 'package:fk/gen/api.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import '../app_state.dart'; import 'lora_network_form.dart'; diff --git a/lib/view_station/configure_station.dart b/lib/view_station/configure_station.dart index ce11115476be4b60f807dcdd24687d5c2b2e0f98..b2bc7a8306c7fb4238d2cd51fbba281839607223 100644 --- a/lib/view_station/configure_station.dart +++ b/lib/view_station/configure_station.dart @@ -7,7 +7,7 @@ import 'package:fk/providers.dart'; import 'package:fk/view_station/station_modules_page.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import '../gen/api.dart'; import '../unknown_station_page.dart'; diff --git a/lib/view_station/configure_wifi_networks.dart b/lib/view_station/configure_wifi_networks.dart index fce915d27cb313103c35746982d4754d237c1021..00df4db3cdc90006b37ff49e05e31293fd5a216f 100644 --- a/lib/view_station/configure_wifi_networks.dart +++ b/lib/view_station/configure_wifi_networks.dart @@ -2,7 +2,7 @@ import 'package:fk/models/known_stations_model.dart'; import 'package:flutter/material.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import '../app_state.dart'; import '../common_widgets.dart'; diff --git a/lib/view_station/configure_wifi_upload.dart b/lib/view_station/configure_wifi_upload.dart index 409b39a57f08a41f045395ad222fcadba7bb0074..f2216776eb9eed8e46c75189f11ccd832b2455a0 100644 --- a/lib/view_station/configure_wifi_upload.dart +++ b/lib/view_station/configure_wifi_upload.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import '../app_state.dart'; import '../common_widgets.dart'; diff --git a/lib/view_station/firmware_page.dart b/lib/view_station/firmware_page.dart index 9bd948c22586c6863a9675f83cc642c98e42815b..28c371e3a9573c21b3b13804e27fcc07ca94aab2 100644 --- a/lib/view_station/firmware_page.dart +++ b/lib/view_station/firmware_page.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import '../app_state.dart'; import '../common_widgets.dart'; import '../gen/api.dart'; @@ -104,7 +104,8 @@ class StationFirmwarePage extends StatelessWidget { BuildContext context, AppLocalizations localizations) { final firmwareVersion = config.firmware.label; final firmwareReleaseDate = _formatFirmwareReleaseDate( - DateTime.fromMillisecondsSinceEpoch(config.firmware.time.toInt() * 1000)); + DateTime.fromMillisecondsSinceEpoch( + config.firmware.time.toInt() * 1000)); return Card( shadowColor: Colors.white, child: Container( diff --git a/lib/view_station/lora_network_form.dart b/lib/view_station/lora_network_form.dart index 68a9fc752aabc7a8fceddf3bd6eb95129a39b104..ba48e1b3c42e9a789cbb720c466fd081e0c32217 100644 --- a/lib/view_station/lora_network_form.dart +++ b/lib/view_station/lora_network_form.dart @@ -7,7 +7,7 @@ import 'package:fk/gen/api.dart'; import 'package:flutter/material.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; class LoraNetworkForm extends StatefulWidget { final LoraTransmissionConfig config; diff --git a/lib/view_station/module_widgets.dart b/lib/view_station/module_widgets.dart index 888eec397af77dffeb2ba8f7d75e48f4abb7e00e..65c0a928fb5f99c195345e27d393f9551b9c33fc 100644 --- a/lib/view_station/module_widgets.dart +++ b/lib/view_station/module_widgets.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:provider/provider.dart'; import 'package:flows/flows.dart'; import 'package:fk/common_widgets.dart'; diff --git a/lib/view_station/no_modules.dart b/lib/view_station/no_modules.dart index c5841d5129ad0c9f4d873d31e2f04b800c1755b0..a6e52fa3603e658f681d09d3a1844a4996a505c0 100644 --- a/lib/view_station/no_modules.dart +++ b/lib/view_station/no_modules.dart @@ -2,7 +2,7 @@ import 'package:fk/models/known_stations_model.dart'; import 'package:fk/diagnostics.dart'; import 'package:fk/view_station/view_station_page.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:fk/reader/screens.dart'; class NoModulesWidget extends StatelessWidget { diff --git a/lib/view_station/sensor_widgets.dart b/lib/view_station/sensor_widgets.dart index 87a866d15e6984d002fdffe4e1cfef5e8d454181..a7b911e60f69c71ac1c3461e69ceef97ae532790 100644 --- a/lib/view_station/sensor_widgets.dart +++ b/lib/view_station/sensor_widgets.dart @@ -1,6 +1,6 @@ import 'package:intl/intl.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import '../gen/api.dart'; import '../meta.dart'; diff --git a/lib/view_station/station_events.dart b/lib/view_station/station_events.dart index d8158610829babfc82cfd2eb3e0da764c5f6b87f..15ceca8d456ade6f13040fc4eb20ba31b32f0224 100644 --- a/lib/view_station/station_events.dart +++ b/lib/view_station/station_events.dart @@ -1,7 +1,7 @@ import 'package:fk/common_widgets.dart'; import 'package:fk/diagnostics.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; diff --git a/lib/view_station/station_modules_page.dart b/lib/view_station/station_modules_page.dart index a5e98eaa3408c7f70c137ccfa0f588c341a6c963..c63da7ed600ddd58024dfe2ca5f635479fcb95db 100644 --- a/lib/view_station/station_modules_page.dart +++ b/lib/view_station/station_modules_page.dart @@ -3,7 +3,7 @@ import 'package:fk/gen/api.dart'; import 'package:fk/models/known_stations_model.dart'; import 'package:fk/view_station/module_widgets.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; class StationModulesPage extends StatelessWidget { final StationModel station; diff --git a/lib/view_station/view_station_page.dart b/lib/view_station/view_station_page.dart index 53ad9b46e3b1173acfe2deb8b57413605b6d869b..e19894fc54c951ebd03efa9f1d6ff79ffefecd21 100644 --- a/lib/view_station/view_station_page.dart +++ b/lib/view_station/view_station_page.dart @@ -5,7 +5,7 @@ import 'package:fk/models/known_stations_model.dart'; import 'package:fk/providers.dart'; import 'package:fk/view_station/module_widgets.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:fk/components/last_connected.dart'; import 'package:flutter_svg/svg.dart'; import 'package:intl/intl.dart'; @@ -63,7 +63,7 @@ class _ViewStationPageState extends State { ? PreferredSize( preferredSize: Size.zero, child: Text( - "${AppLocalizations.of(context)!.deployedAt} ${DateFormat.yMd().format(DateTime.fromMillisecondsSinceEpoch(widget.station.ephemeral!.deployment!.startTime!.toInt() * 1000))}", + "${AppLocalizations.of(context)!.deployedAt} ${DateFormat.yMd().format(DateTime.fromMillisecondsSinceEpoch(widget.station.ephemeral!.deployment!.startTime.toInt() * 1000))}", ), ) : moduleConfigurations.areAllModulesCalibrated( @@ -296,7 +296,7 @@ class HighLevelsDetails extends StatelessWidget { ?.startTime == null ? station - .ephemeral?.deployment?.startTime! + .ephemeral?.deployment?.startTime .toInt() : null, size: size.toDouble(), diff --git a/lib/view_station/wifi_network_form.dart b/lib/view_station/wifi_network_form.dart index 865ad7a80026d49f0e1c18b8569e01e593b75a72..24cfdc9130855e22a90c8a310c96026f3698641b 100644 --- a/lib/view_station/wifi_network_form.dart +++ b/lib/view_station/wifi_network_form.dart @@ -2,7 +2,7 @@ import 'package:fk/app_state.dart'; import 'package:flutter/material.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import '../common_widgets.dart'; diff --git a/lib/welcome.dart b/lib/welcome.dart index e58182e836f9089604e4383584d03527ff1e5a6f..681b0177be707e958834ec347cb5466828bd69ce 100644 --- a/lib/welcome.dart +++ b/lib/welcome.dart @@ -2,7 +2,7 @@ import 'package:fk/common_widgets.dart'; import 'package:fk/reader/screens.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; class WelcomeScreen extends StatelessWidget { final VoidCallback onDone; diff --git a/pubspec.yaml b/pubspec.yaml index 12d4bd15adb61779f3e4820f97ca08091dee58d6..9e494a2fa3b6ed4a03d1ca29f1297f6d98779950 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,10 +47,10 @@ dependencies: provider: ^6.0.4 uuid: ^4.3.3 meta: ^1.10.0 - intl: ^0.19.0 + intl: ^0.20.2 markdown: ^7.1.0 flutter_secure_storage: ^9.2.4 - flutter_form_builder: ^9.0.0 + flutter_form_builder: ^10.1.0 form_builder_validators: ^11.0.0 path_provider: ^2.0.15 flutter_markdown: ^0.7.3 diff --git a/resources/flows/flows_en.json b/resources/flows/flows_en.json index 145ed54e628584e78dcb62f77d49a97bbf7ef847..1115cb000eceef2c6c71836576918986393cfe4b 100644 --- a/resources/flows/flows_en.json +++ b/resources/flows/flows_en.json @@ -69,7 +69,7 @@ "forward": "Next", "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/2.%20Separate%20the%20Upper%20and%20Lower%20Boards/", "header": { "title": "Assemble Station", "subtitle": "" @@ -102,7 +102,7 @@ "forward": "Next", "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/3.%20Attach%20Module%20Base/", "header": { "title": "Assemble Station", "subtitle": "" @@ -131,7 +131,7 @@ "forward": "Next", "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/6.%20Attach%20Module%20Boards/", "header": { "title": "Assemble Station", "subtitle": "" @@ -160,7 +160,7 @@ "forward": "Next", "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/4.%20Secure%20Inside%20Case/", "header": { "title": "Assemble Station", "subtitle": "" @@ -193,7 +193,7 @@ "forward": "Next", "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/7.%20Attach%20Battery/", "header": { "title": "Assemble Station", "subtitle": "" @@ -222,7 +222,7 @@ "forward": "Next", "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/8.%20Attach%20Button/", "header": { "title": "Assemble Station", "subtitle": "" @@ -251,14 +251,14 @@ "forward": "Next", "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/63%20Assemble%20Cable%20Plate/", "header": { "title": "Assemble Station", "subtitle": "" }, "simple": [ { - "body": "# Assemble Cable Plate\nAdd the cables and inserts into the glands. Screw them into the Cable Plate.\n\n## Note: Cable Plate assembly depends on your sensor and power configuration, and can be pretty involved. For detailed instructions, see [the product guide.](https://fieldkit.org/Product-Guide/Set-Up-Station/#Assemble-Cable-Plate)", + "body": "# Assemble Cable Plate\nAdd the cables and inserts into the glands. Screw them into the Cable Plate.\n\n## Note: Cable Plate assembly depends on your sensor and power configuration, and can be pretty involved. For detailed instructions, see [the product guide.](https://productguide.fieldkit.org/product-guide/set-up-station/#assemble-cable-plate)", "images": [ { "url": "/uploads/TI_21_1c7cdf7182.png", @@ -284,7 +284,7 @@ "forward": "Next", "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/9.%20Plug%20in%20Micro-USB%20Cable%20to%20Charge%20Station/", "header": { "title": "Assemble Station", "subtitle": "" @@ -310,10 +310,10 @@ "id": "10", "name": "onboarding.14", "locale": "en_US", - "forward": "Complete Station Assembly", - "skip": "", + "forward": "See Product Guide", + "skip": "Complete Station Assembly", "guide_title": "View Product Guide for setup instructions", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station/", + "guide_url": "fieldkit/search/Screw%20in%20Cable%20Plate/", "header": { "title": "Assemble Station", "subtitle": "" @@ -342,7 +342,7 @@ "forward": "Next", "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/10.%20Switch%20On%20to%20Connect/", "header": { "title": "Assemble Station", "subtitle": "" @@ -371,7 +371,7 @@ "forward": "Next", "skip": "Skip this step", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/3.%20Connect%20Rain%20Gauge/", "header": { "title": "Set Up", "subtitle": "Weather" @@ -400,7 +400,7 @@ "forward": "Next", "skip": "Skip this step", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/4.%20Connect%20Wind%20Vane%20and%20Anemometer/", "header": { "title": "Set Up", "subtitle": "Weather" @@ -433,7 +433,7 @@ "forward": "Next", "skip": "Skip this step", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/5.%20Place%20Stevenson%20Screen/", "header": { "title": "Set Up", "subtitle": "Weather" @@ -455,10 +455,10 @@ "id": "20", "name": "onboarding.weather.06", "locale": "en_US", - "forward": "Complete Setup", - "skip": "", - "guide_title": "Need more help? View Product Guide", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station/#weather-module-setup", + "forward": "Need more help? View Product Guide", + "skip": "Complete Setup", + "guide_title": "", + "guide_url": "fieldkit/search/6.%20Attach%20to%20Station/", "header": { "title": "Set Up", "subtitle": "Weather" @@ -491,7 +491,7 @@ "forward": "Next", "skip": "Skip this step", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/Collect%20the%20pH%20Probe./", "header": { "title": "Set Up", "subtitle": "pH" @@ -517,10 +517,10 @@ "id": "22", "name": "onboarding.water.ph.02", "locale": "en_US", - "forward": "Calibrate Sensor", - "skip": "Finish and Exit", - "guide_title": "Need more help? View Product Guide.", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station//#pH-module-setup", + "forward": "Next", + "skip": "Skip this step", + "guide_title": "", + "guide_url": "fieldkit/search/Screw%20the%20pH%20Probe%20cable%20into%20the%20pH%20Module%20Board./", "header": { "title": "Set Up", "subtitle": "pH" @@ -665,7 +665,7 @@ "forward": "Next", "skip": "Skip this step", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/Assemble%20Water%20Temperature%20Pack/", "header": { "title": "Set Up", "subtitle": "Water Temperature" @@ -691,10 +691,10 @@ "id": "30", "name": "onboarding.water.temp.02", "locale": "en_US", - "forward": "Calibrate Sensor", + "forward": "Need more help? View Product Guide.", "skip": "Finish and Exit", - "guide_title": "Need more help? View Product Guide.", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station/#water-temperature-module-setup", + "guide_title": "", + "guide_url": "fieldkit/search/Screw%20the%20Water%20Temperature%20Probe%20cable%20into/", "header": { "title": "Set Up", "subtitle": "Water Temperature" @@ -723,7 +723,7 @@ "forward": "Next", "skip": "Skip this step", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/Assemble%20Distance%20Pack/", "header": { "title": "Set Up", "subtitle": "Distance" @@ -752,7 +752,7 @@ "forward": "Next", "skip": "Skip this step", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/2.%20Insert%20CAT5%20Cable%20into%20Distance%20Sensor%20Board/", "header": { "title": "Set Up", "subtitle": "Distance" @@ -784,8 +784,8 @@ "locale": "en_US", "forward": "Complete Setup", "skip": "", - "guide_title": "Need more help? View Product Guide", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station", + "guide_title": "", + "guide_url": "fieldkit/search/4.%20Attach%20Distance%20Sensor%20Board/", "header": { "title": "Set Up", "subtitle": "Distance" @@ -814,7 +814,7 @@ "forward": "Next", "skip": "Skip this step", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/Your%20Distance%20Pack%20consists%20of%20a/", "header": { "title": "Set Up", "subtitle": "Weather" @@ -847,7 +847,7 @@ "forward": "Next", "skip": "Skip this step", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/2.%20Insert%20CAT5%20Cable%20into%20Distance%20Sensor%20Board/", "header": { "title": "Set Up", "subtitle": "Weather" @@ -878,9 +878,9 @@ "name": "onboarding.water.ph.03", "locale": "en_US", "forward": "Next", - "skip": "Skip", + "skip": "Finish and Exit", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/Make%20sure%20you%20have%203%20different%20pH%20standard%20solutions./", "header": { "title": "Set Up", "subtitle": "pH" @@ -1006,17 +1006,17 @@ "id": "47", "name": "onboarding.01", "locale": "en_US", - "forward": "Complete", - "skip": null, + "forward": "Next", + "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/Overview/", "header": { - "title": "Need Additional Help?", + "title": "If You Need Help", "subtitle": null }, "simple": [ { - "body": "If you get stuck, use our Product Guide at fieldkit.org that goes through these steps (and more) in additional detail. \n\nYou can access all of our support resources, including the Product Guide, by clicking the blue ? icon at the upper right hand corner. ", + "body": "If you get stuck, use our Product Guide at fieldkit.org that goes through these steps (and more) in additional detail. \n\nYou can access all of our support resources, including the Product Guide, by clicking the ? icon at the upper right hand corner. ", "images": [ { "url": "/uploads/product_guide_help_icon_38aad2f330.svg", @@ -1033,8 +1033,8 @@ "locale": "en_US", "forward": "Next", "skip": "Skip Assembly Instructions", - "guide_title": null, - "guide_url": null, + "guide_title": "", + "guide_url": "fieldkit/search/1.%20Core/", "header": { "title": "Assemble Station", "subtitle": null @@ -1059,7 +1059,7 @@ "forward": "Next", "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/3.%20Power/", "header": { "title": "Assemble Station", "subtitle": null @@ -1084,7 +1084,7 @@ "forward": "Next", "skip": "Skip Assembly Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/4.%20Case/", "header": { "title": "Assemble Station", "subtitle": null @@ -1561,7 +1561,7 @@ "forward": "Continue", "skip": "Skip Connection Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/1.%20Turn%20on%20Station%20WiFi/", "header": { "title": "Connect Station", "subtitle": "FieldKit Station WiFi" @@ -1590,7 +1590,7 @@ "forward": "Open WiFi Settings", "skip": "Done", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/2.%20Connect%20to%20your%20Station/", "header": { "title": "Connect Station", "subtitle": "FieldKit Station WiFi" @@ -1723,14 +1723,14 @@ "forward": "Continue", "skip": "Skip Modules Instructions", "guide_title": null, - "guide_url": null, + "guide_url": "fieldkit/search/6.%20Attach%20Module%20Boards/", "header": { "title": "Attach Modules", "subtitle": "" }, "simple": [ { - "body": "# Attach Module Boards\n\nAttach your individual Module Boards to the Module Base, and secure with Module Board Screws.\n\n## Use caution to avoid bending the Module Base pins, and make sure the pins never touch each other, as it could damage the board.\n\n##Remember to remove the small transparent yellow tape circles from the standoffs where you’ll attach your Module Board(s) to the Module Base.", + "body": "# Attach Module Boards\n\nAttach your individual Module Boards to the Module Base, and secure with Module Board Screws.\n\n## Use caution to avoid bending the Module Base pins, and make sure the pins never touch each other, as it could damage the board.\n\n## Remember to remove the small transparent yellow tape circles from the standoffs where you’ll attach your Module Board(s) to the Module Base.", "images": [ { "url": "/uploads/small_TI_4_A_e9dc955a94_ff618a7209.jpg", @@ -1752,7 +1752,7 @@ "forward": "Continue", "skip": "Skip Modules Instructions", "guide_title": "", - "guide_url": "", + "guide_url": "fieldkit/search/10.%20Switch%20On%20to%20Connect/", "header": { "title": "Attach Modules", "subtitle": "" @@ -1811,7 +1811,7 @@ "id": "76", "name": "data_sync.01", "locale": "en_US", - "forward": "Got It", + "forward": "Next", "skip": "Skip", "guide_title": null, "guide_url": null, @@ -1831,7 +1831,7 @@ "id": "77", "name": "data_sync.02", "locale": "en_US", - "forward": "Got It", + "forward": "Next", "skip": "Skip", "guide_title": null, "guide_url": null, @@ -1851,7 +1851,7 @@ "id": "78", "name": "data_sync.03", "locale": "en_US", - "forward": "Got It", + "forward": "Next", "skip": "Skip", "guide_title": null, "guide_url": null, @@ -1862,7 +1862,12 @@ "simple": [ { "body": "# Step 3\n\nConnect to your internet WiFi to automatically sync data with the FieldKit protal.", - "images": [], + "images": [ + { + "url": "/uploads/TI_10_2024_0621_Product_Guide_Phone_Wifi_Setting_081f6cfc2b.png", + "alternativeText": "Screenshot of a Wi-Fi settings screen showing the device connected to a network named \"Friendly Squid\" with other available networks listed, including \"Wi-Fi Network\" and \"Public Wi-Fi Network.\"" + } + ], "logo": null } ] @@ -1871,7 +1876,7 @@ "id": "79", "name": "data_sync.04", "locale": "en_US", - "forward": "Got It", + "forward": "Next", "skip": "Skip", "guide_title": null, "guide_url": null, diff --git a/resources/flows/flows_es.json b/resources/flows/flows_es.json index f592d56aa65f47a2dafab9ae354792e4423c5150..56d713ecd8f884c21fd625b8190684fc5d432b78 100644 --- a/resources/flows/flows_es.json +++ b/resources/flows/flows_es.json @@ -1,1107 +1,1897 @@ { - "data": { - "flows": [ - { - "id": "1", - "name": "onboarding", - "show_progress": true - }, - { - "id": "2", - "name": "deploy", - "show_progress": true - }, - { - "id": "3", - "name": "calibration", - "show_progress": false - }, - { - "id": "4", - "name": "examples", - "show_progress": false - } - ], - "screens": [ - { - "id": "1", - "name": "OLD_onboarding.01", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": "" - }, - "simple": [ - { - "body": "#¿Tienes todo?\nComprueba que tienes todas las partes necesarias para ensamblar tu FieldKit.\n\n| LEFT | RIGHT |\n|----------------|------------|\n| A) Placa superior | F) Caja del FieldKit |\n| B) Placa inferior | G) Paquete de placa de cableado |\n| C) Base de los módulos | H) Paquetes de tornillos |\n| D) Placa(s) modular(es) | I) Cable micro-USB |\n| E) Batería | |", - "images": [ - { - "url": "uploads/TI_1_A_e65b535bb2.png" - }, - { - "url": "uploads/TI_18_9cfa25c5fc.png" - } - ], - "logo": null - } + "data": { + "flows": [ + { + "id": "1", + "name": "onboarding", + "show_progress": true + }, + { + "id": "2", + "name": "deploy", + "show_progress": true + }, + { + "id": "3", + "name": "calibration", + "show_progress": false + }, + { + "id": "4", + "name": "examples", + "show_progress": false + }, + { + "id": "5", + "name": "no_modules", + "show_progress": true + }, + { + "id": "6", + "name": "data_sync", + "show_progress": true + } + ], + "screens": [ + { + "id": "1", + "name": "z.onboarding.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": null, + "header": { + "title": "Ensamblar la estación", + "subtitle": "" + }, + "simple": [ + { + "body": "#¿Tienes todo?\nComprueba que tienes todas las partes necesarias para ensamblar tu FieldKit.\n\n| LEFT | RIGHT |\n|----------------|------------|\n| A) Placa superior | F) Caja del FieldKit |\n| B) Placa inferior | G) Paquete de placa de cableado |\n| C) Base de módulos | H) Paquetes de tornillos |\n| D) Placa(s) modular(es) | I) Cable micro-USB |\n| E) Batería | |", + "images": [ + { + "url": "/uploads/TI_1_A_e65b535bb2.png", + "alternativeText": "Illustration of various electronic components labeled A to E. Component A is a rectangular blue circuit board with various circuit traces. Component B is a beige-colored rectangular circuit board with more complex circuitry. Component C is a larger beige rectangular circuit board with multiple traces. Component D is a small blue rectangular device with minimal markings. Component E is a blue battery pack with a red coiled wire." + }, + { + "url": "/uploads/TI_18_9cfa25c5fc.png", + "alternativeText": "Illustration showing components labeled F, G, H, and I, including a blue case (F), a beige mounting plate (G), two red connectors (H), a set of screws (H), and a red cable (I)." + } + ], + "logo": null + } + ] + }, + { + "id": "2", + "name": "onboarding.05", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/2.%20Separate%20the%20Upper%20and%20Lower%20Boards/", + "header": { + "title": "Ensamblar la estación", + "subtitle": "" + }, + "simple": [ + { + "body": "# Combinar las placas superiores e inferiores\nSi aún no está ensamblado, combine la placa superior con la inferior. Asegúrate de alinear las pinos y los conectores. Luego pulsa juntos con firmeza.", + "images": [ + { + "url": "/uploads/TI_2_A_112a78f350.jpg", + "alternativeText": "Illustration showing hands aligning two circuit boards, one beige and one blue, ensuring proper connection between them." + }, + { + "url": "/uploads/TI_19_23d1c3d3b8.png", + "alternativeText": "Illustration showing hands connecting a blue module with a beige module, aligning the pins on each piece for proper connection." + }, + { + "url": "/uploads/TI_2_B_9b35a3f7e6.jpg", + "alternativeText": "Illustration showing hands holding and aligning two connected circuit boards, one beige and one blue, ensuring they fit together snugly." + } + ], + "logo": null + } + ] + }, + { + "id": "3", + "name": "onboarding.06", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/3.%20Attach%20Module%20Base/", + "header": { + "title": "Ensamblar la estación", + "subtitle": "" + }, + "simple": [ + { + "body": "# Adjuntar la base de los módulos\nAdjunta las placas combinadas superior e inferior a la base de los módulos. Ahora tienes tu núcleo FieldKit.", + "images": [ + { + "url": "/uploads/TI_3_B_128f1f4de9.png", + "alternativeText": "Illustration showing hands holding a beige and blue circuit board, positioning it onto a beige backing or assembly frame, finishing the connection." + }, + { + "url": "/uploads/TI_3_A_8ed4a5e981.jpg", + "alternativeText": "Illustration showing hands assembling two circuit boards, one in beige with cutouts, and the other in blue with electronic components, guiding them together with a downward arrow indicating alignment and attachment." + } + ], + "logo": null + } + ] + }, + { + "id": "4", + "name": "onboarding.07", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/6.%20Attach%20Module%20Boards/", + "header": { + "title": "Ensamblar la estación", + "subtitle": "" + }, + "simple": [ + { + "body": "# Adjuntar las placas modulares\nAdjuntar las placas modulares individuales a la base de los módulos y asegurarlas con tornillos de módulo.\n\n## Ten cuidado para evitar doblar los pines de la base de módulos, y asegúrate de que los pines nunca se tocan entre sí, ya que podría dañar la placa.", + "images": [ + { + "url": "/uploads/TI_4_A_e9dc955a94.jpg", + "alternativeText": "Illustration of two hands assembling electronic components. One hand holds a beige circuit board with various slots, while the other hand positions two smaller blue circuit boards to be inserted into the larger board." + }, + { + "url": "/uploads/TI_4_B_ca5ad842a0.png", + "alternativeText": "Illustration showing hands holding and working on a blue circuit board attached to a beige backing, using a screwdriver to secure a module on the board." + } + ], + "logo": null + } + ] + }, + { + "id": "5", + "name": "onboarding.08", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/4.%20Secure%20Inside%20Case/", + "header": { + "title": "Ensamblar la estación", + "subtitle": "" + }, + "simple": [ + { + "body": "# Asegurar en la caja\nColoca los componentes ensamblados dentro de la caja. Asegúralos con los tornillos del núcleo para minimizar el movimiento y el riesgo de daño.\n\n## Tendrás que levantar temporalmente la parte superior para llegar a uno de los agujeros de tornillo en la parte inferior.", + "images": [ + { + "url": "/uploads/TI_20_e6fe720726.png", + "alternativeText": "An open electronic device enclosure showing internal components, including a battery pack, circuit boards, and connected wiring. The layout highlights multiple connection points on the circuit board, which are marked with red circles. The enclosure lid is open and positioned on the left." + }, + { + "url": "/uploads/TI_5_A_e5f56c0f2d.jpg", + "alternativeText": " Illustration of hands assembling an electronic device inside a protective case, positioning a blue and beige circuit board within the case." + }, + { + "url": "/uploads/TI_5_B_90b1d06e88.jpg", + "alternativeText": "Illustration of hands assembling an electronic device inside a protective case, using a screwdriver to secure a blue and beige circuit board within the case." + } + ], + "logo": null + } + ] + }, + { + "id": "6", + "name": "onboarding.09", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/7.%20Attach%20Battery/", + "header": { + "title": "Ensamblar la estación", + "subtitle": "" + }, + "simple": [ + { + "body": "# Adjuntar la batería\nInserte el cable de batería a la parte superior izquierda de la placa superior donde dice \"BATTERY\".\n\n## Importante: Antes de insertar, comprueba que lo has hecho bien. Insertar cables en los enchufes incorrectos puede dañar permanentemente tu FieldKit.", + "images": [ + { + "url": "/uploads/TI_6_A_d90a8d0f66.jpg", + "alternativeText": "Illustration of hands assembling an electronic device inside a protective case, securing the battery wire within the case." + }, + { + "url": "/uploads/TI_6_B_e3c19cdb6b.jpg", + "alternativeText": " Illustration of an electronic device with blue and beige circuit boards secured inside a protective case." + } + ], + "logo": null + } + ] + }, + { + "id": "7", + "name": "onboarding.10", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/8.%20Attach%20Button/", + "header": { + "title": "Ensamblar la estación", + "subtitle": "" + }, + "simple": [ + { + "body": "# Adjuntar el botón\nInserta el cable del botón a la parte superior derecha de la placa superior donde dice \"BTN\".\n\n## Importante: Antes de insertar, comprueba que lo has hecho bien. Insertar cables en los enchufes incorrectos puede dañar permanentemente tu FieldKit.", + "images": [ + { + "url": "/uploads/TI_7_A_d839eb5f1c.jpg", + "alternativeText": " Illustration of an electronic device with blue and beige circuit boards secured inside a protective case with battery wires being attached by a hand." + }, + { + "url": "/uploads/TI_7_B_cf99717d28.jpg", + "alternativeText": " Illustration of an electronic device with blue and beige circuit boards secured inside a protective case with battery wires attached." + } + ], + "logo": null + } + ] + }, + { + "id": "8", + "name": "onboarding.13", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/63%20Assemble%20Cable%20Plate/", + "header": { + "title": "Ensamblar la estación", + "subtitle": "" + }, + "simple": [ + { + "body": "# Ensamblar la placa de cableado\nAñade los cables e insértalos en las prensaestopas. Atorníllalos en la placa de cableado.\n\n## Nota: El ensamblaje de las placas de cableado depende de la configuración de sensores y potencia, y puede ser bastante complejo. Visita [Manual del producto](https://productguide.fieldkit.org/product-guide/set-up-station/#assemble-cable-plate) para obtener instrucciones detalladas.", + "images": [ + { + "url": "/uploads/TI_21_1c7cdf7182.png", + "alternativeText": "Illustration of hands assembling red gland connectors onto a beige panel, with one hand holding a connector and the other placing it through a hole in the panel, showing the process of securing the connectors in place." + }, + { + "url": "/uploads/TI_22_89ef0f77bf.png", + "alternativeText": "Illustration showing hands assembling two red gland connectors onto a beige panel, likely part of an electrical enclosure. The hands are positioning the glands securely into place." + }, + { + "url": "/uploads/TI_23_f4df431734.png", + "alternativeText": "Illustration showing hands using a screwdriver to tighten screws on two red gland connectors mounted on a beige panel, likely as part of assembling an electrical enclosure." + } + ], + "logo": null + } + ] + }, + { + "id": "9", + "name": "onboarding.11", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/9.%20Plug%20in%20Micro-USB%20Cable%20to%20Charge%20Station/", + "header": { + "title": "Ensamblar la estación", + "subtitle": "" + }, + "simple": [ + { + "body": "# Conectar el cable micro-USB\nConectar el cable micro-USB a una fuente de alimentación externa para cargar la batería.", + "images": [ + { + "url": "/uploads/TI_8_A_808910da96.jpg", + "alternativeText": "A hand connecting a cable to a component inside an enclosure containing blue and beige circuit boards, indicating the assembly or setup of electronic equipment." + }, + { + "url": "/uploads/TI_8_B_dcb63a9526.jpg", + "alternativeText": " Illustration of an electronic device with blue and beige circuit boards secured inside a protective case, with connected cables visible. The USB charging cable is plugged in." + } + ], + "logo": null + } + ] + }, + { + "id": "10", + "name": "onboarding.14", + "locale": "en_US", + "forward": "Ver Manual del producto", + "skip": "Completar el ensamblaje", + "guide_title": "Ver el Manual del producto para instrucciones de configuración", + "guide_url": "fieldkit/search/Screw%20in%20Cable%20Plate/", + "header": { + "title": "Ensamblar la estación", + "subtitle": "" + }, + "simple": [ + { + "body": "# Adjunta la placa de cableado a la caja\nAhora que te hayas conectado tus cables, insertos y prensaestopas a la placa de cableado, atornilla la placa de cableado en la caja con tornillos de placa de cableado. \n\n## Asegurarte de que la junta esté presionada en la ranura para formar un ajuste adecuado para una protección óptima meterológica.", + "images": [ + { + "url": "/uploads/TI_24_6362509d17.png", + "alternativeText": "Illustration of hands assembling an electronic device inside a protective case, connecting wires to red connectors and securing components to the blue and beige circuit boards." + }, + { + "url": "/uploads/TI_25_80accf62d1.png", + "alternativeText": "Illustration of an open electrical enclosure with internal components connected by wires. The enclosure contains a blue battery pack and several connected electronic modules with red wire connections leading out of the enclosure through two red glands." + } + ], + "logo": null + } + ] + }, + { + "id": "11", + "name": "onboarding.12", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/10.%20Switch%20On%20to%20Connect/", + "header": { + "title": "Ensamblar la estación", + "subtitle": "" + }, + "simple": [ + { + "body": "# Desactivar y dejar la estación para cargar\nVoltear el interruptor a la posición \"OFF\". Deja el cable micro-USB conectado hasta que la batería está completamente cargada.", + "images": [ + { + "url": "/uploads/TI_8_A_808910da96.jpg", + "alternativeText": "A hand connecting a cable to a component inside an enclosure containing blue and beige circuit boards, indicating the assembly or setup of electronic equipment." + }, + { + "url": "/uploads/small_TI_15_B_NEW_x2_c6d2b7798b_OFF_b5a0e1959b.png", + "alternativeText": "Illustration of a section of an electronic device with a blue circuit board, connected wires, and an on/off switch labeled at the top, switched OFF." + } + ], + "logo": null + } + ] + }, + { + "id": "17", + "name": "onboarding.weather.03", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": "fieldkit/search/3.%20Connect%20Rain%20Gauge/", + "header": { + "title": "Configurar", + "subtitle": "Módulo meteorológico" + }, + "simple": [ + { + "body": "# Conectar el anemómetro de lluvia\n\nSe voltea la placa del sensor meteorológico, e inserta el cable RJ11 del pluviómetro en la ranura de la placa del sensor meteorológico marcado como “RAIN.”", + "images": [ + { + "url": "/uploads/TI_32_ea3474ae96.png", + "alternativeText": " Illustration of a hand holding a beige weather circuit board with red wires connected to it on the back side and another being attached with a hand." + }, + { + "url": "/uploads/TI_33_ba502858a1.png", + "alternativeText": "Illustration of a hand holding a beige weather circuit board with red wires attached to it." + } + ], + "logo": null + } + ] + }, + { + "id": "18", + "name": "onboarding.weather.04", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": "fieldkit/search/4.%20Connect%20Wind%20Vane%20and%20Anemometer/", + "header": { + "title": "Configurar", + "subtitle": "Módulo meteorológico" + }, + "simple": [ + { + "body": "# Conectar el anemómetro y la veleta\n\nInserta el cable RJ11 de la veleta en la ranura de la placa del sensor meteorológico marcado como \"WIND.\" Inserta el cable RJ11 del anemómetro en la veleta para que estén conectados.", + "images": [ + { + "url": "/uploads/TI_34_41fc0b20bb.png", + "alternativeText": " Illustration of a hand holding a beige weather circuit board with one red wire connected to it and another being attached with a hand." + }, + { + "url": "/uploads/TI_35_77a7e23703.png", + "alternativeText": " Illustration of a hand holding a beige weather circuit board with two red wires connected to it." + }, + { + "url": "/uploads/TI_63_8e5ec859d8.png", + "alternativeText": "The image shows hands assembling or connecting wires to a round, blue device, part of the wind sensor, with attention to detail in wiring or securing parts in place." + } + ], + "logo": null + } + ] + }, + { + "id": "19", + "name": "onboarding.weather.05", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": "fieldkit/search/5.%20Place%20Stevenson%20Screen/", + "header": { + "title": "Configurar", + "subtitle": "Módulo meteorológico" + }, + "simple": [ + { + "body": "# Colocar el abrigo meteorológico\n\nInserta la placa del sensor meteorológico en el abrigo meteorológico. Adjunta la placa al brazo.", + "images": [ + { + "url": "/uploads/TI_64_69d61032ed.png", + "alternativeText": "The image shows the bottom view of a cylindrical device with a screw being tightened, indicating the assembly or securing of a component inside a sensor cover." + } + ], + "logo": null + } + ] + }, + { + "id": "20", + "name": "onboarding.weather.06", + "locale": "en_US", + "forward": "¿Necesitas más ayuda? Ver el Manual del producto.", + "skip": "Completar configuración", + "guide_title": "", + "guide_url": "fieldkit/search/6.%20Attach%20to%20Station/", + "header": { + "title": "Configurar", + "subtitle": "Módulo meteorológico" + }, + "simple": [ + { + "body": "# Adjuntar a la estación\n\nAsegúrate de que el otro extremo del cable CAT5 se inserte de forma segura en la placa de módulo meteorológico.\n\n## Visita FieldKit.Org/Product-Guide/Set-Up-Station/#Weather-Module-Setup para instrucciones sobre la colocación de los instrumentos, gestión de cables y exploración de soluciones de montaje. ", + "images": [ + { + "url": "/uploads/TI_38_5c371cef29.png", + "alternativeText": "Illustration of an open electronics enclosure with a hand inside. The hand is holding a red wire that is connected to the right-side module inside the enclosure. The wire is being routed toward the bottom of the enclosure, where it will be passed through one of the red connectors at the bottom." + }, + { + "url": "/uploads/TI_39_bdd7faffff.png", + "alternativeText": "Illustration of an open electronics enclosure containing several components. Inside, there is a blue battery pack, a blue circuit board, and another blue module on the right side. A red wire is connected to the module on the right and is routed through one of the red connectors at the bottom of the enclosure." + }, + { + "url": "/uploads/TI_65_2d924591e9.png", + "alternativeText": "The image depicts a detailed illustration of a weather station with various sensors and instruments, such as an anemometer and a rain gauge, all connected with red wires." + } + ], + "logo": null + } + ] + }, + { + "id": "21", + "name": "onboarding.water.ph.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": "fieldkit/search/Collect%20the%20pH%20Probe./", + "header": { + "title": "Configurar", + "subtitle": "pH" + }, + "simple": [ + { + "body": "# ¿Tienes todo?\n\nToma la sonda de pH.\n\n## La placa del módulo de pH ya debería estar conectada a la estación.\n\n## Antes de calibrarlos, examina la placa del módulo y el cable de la sonda en busca de una calcomanía de identificación de calibración (CAL ID). Todos los pares de sonda y placa del módulo que tienen el mismo CAL ID ya han sido calibrados juntos en el laboratorio y no tienes que calibrarlos antes de su uso inicial. Además, si tienes varias sondas del mismo tipo, asegúrate de hacer coincidir el número de CAL ID en el cable de la sonda y la placa del módulo al configurar la estación.", + "images": [ + { + "url": "/uploads/TI_41_ee59861b57.png", + "alternativeText": "Illustration of an open electronic enclosure containing several mounted components, including a blue battery, blue and beige circuit boards, and two red connectors at the bottom of the box." + }, + { + "url": "/uploads/TI_40_c5a6a2624f.png", + "alternativeText": "Illustration of a sensor device consisting of a coiled black cable, a beige probe with a red cap, and a small blue rectangular module with a red button, all laid out side by side." + } + ], + "logo": null + } + ] + }, + { + "id": "22", + "name": "onboarding.water.ph.02", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": "", + "guide_url": "fieldkit/search/Screw%20the%20pH%20Probe%20cable%20into%20the%20pH%20Module%20Board./", + "header": { + "title": "Configurar", + "subtitle": "pH" + }, + "simple": [ + { + "body": "# Adjuntar a la estación\n\nAtornilla el cable de la sonda de pH en la placa del módulo de pH.", + "images": [ + { + "url": "/uploads/TI_51_7245d5bf10.png", + "alternativeText": "An illustration of an open field device case showing internal components, including a blue battery pack, circuit boards, wiring, and two red connectors on the exterior, with a white cable connected to one of the connectors." + }, + { + "url": "/uploads/TI_50_8834adfd6d.png", + "alternativeText": "An illustration of an open field device case showing internal components, including a blue battery pack, circuit boards, and wiring. A hand is shown twisting a white cable to a red connector inside the case." + } + ], + "logo": null + } + ] + }, + { + "id": "24", + "name": "onboarding.water.ec.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Conductividad" + }, + "simple": [ + { + "body": "# ¿Tienes todo?\n\nToma la sonda de conductividad.\n\n## La placa del módulo de conductividad ya debería estar conectada a la estación.\n\n## Antes de calibrarlos, examina la placa del módulo y el cable de la sonda en busca de una calcomanía de identificación de calibración (CAL ID). Todos los pares de sonda y placa del módulo que tienen el mismo CAL ID ya han sido calibrados juntos en el laboratorio y no tienes que calibrarlos antes de su uso inicial. Además, si tienes varias sondas del mismo tipo, asegúrate de hacer coincidir el número de CAL ID en el cable de la sonda y la placa del módulo al configurar la estación.", + "images": [ + { + "url": "/uploads/TI_44_d448775f78.png", + "alternativeText": "Illustration showing a coiled black cable with a sensor featuring a green connector on one end, placed next to a blue electronic module with buttons and connectors." + }, + { + "url": "/uploads/TI_45_0771d4aa64.png", + "alternativeText": "Illustration of an open protective case containing several electronic components, including a blue battery, a green module, and red connectors, with wiring routed within the case." + } + ], + "logo": null + } + ] + }, + { + "id": "25", + "name": "onboarding.water.ec.02", + "locale": "en_US", + "forward": "Calibrar sensor", + "skip": "Finalizar y salir", + "guide_title": "¿Necesitas más ayuda? Ver el Manual del producto", + "guide_url": "https://www.fieldkit.org/product-guide/set-up-station/#conductivity-module-setup", + "header": { + "title": "Configurar", + "subtitle": "Conductividad" + }, + "simple": [ + { + "body": "# Adjuntar a la estación\n\nAtornilla el cable de la sonda de conductividad en la placa del módulo de conductividad.", + "images": [ + { + "url": "/uploads/TI_46_249a8d8dd5.png", + "alternativeText": "Illustration of a hand connecting a cable to a component inside an open electronics enclosure. The enclosure contains a blue battery pack on the left, a blue circuit board with red wires at the top, and another blue module on the right with a green label. The cable being connected exits through a red connector at the bottom." + }, + { + "url": "/uploads/TI_47_cb0eafa7a6.png", + "alternativeText": "Illustration of an open electronics enclosure with components inside. The setup includes a blue battery pack on the left, a blue circuit board with red wires at the top, and another blue module on the right. A white cable is connected to the module on the right, exiting through a red connector at the bottom. There is a module with a green label." + } + ], + "logo": null + } + ] + }, + { + "id": "26", + "name": "onboarding.water.dox.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Oxígeno disuelto" + }, + "simple": [ + { + "body": "# ¿Tienes todo?\nRecoge la sonda de oxígeno disuelto.\n\n## La placa de módulos de oxígeno disuelto está preconectada a tu estación. Comprueba si hay una etiqueta de CAL ID en la placa del módulo y el cable de la sonda. Los números de CAL ID coinciden con los pares precalibrados. Utiliza los números de CAL ID coincidentes para la configuración.", + "images": [ + { + "url": "/uploads/TI_48_764d104c39.png", + "alternativeText": "Illustration showing a coiled black cable with a sensor featuring a yellow connector on one end, placed next to a blue electronic module with buttons and connectors." + }, + { + "url": "/uploads/TI_49_769c7512f4.png", + "alternativeText": "An illustration of an open field device case showing internal components, including a blue battery pack, circuit boards, wiring, and two red connectors on the exterior." + } + ], + "logo": null + } + ] + }, + { + "id": "27", + "name": "onboarding.water.dox.02", + "locale": "en_US", + "forward": "Calibrar sensor", + "skip": "Finalizar y salir", + "guide_title": "¿Necesitas más ayuda? Ver el Manual del producto", + "guide_url": "https://www.fieldkit.org/product-guide/set-up-station/#dissolved-oxygen-module-setup", + "header": { + "title": "Configurar", + "subtitle": "Dissolved Oxygen" + }, + "simple": [ + { + "body": "# Adjuntar a la estación\nAtornilla el cable de sonda de oxígeno disuelto en la placa de módulo de oxígeno disuelto.", + "images": [ + { + "url": "/uploads/TI_50_8834adfd6d.png", + "alternativeText": "An illustration of an open field device case showing internal components, including a blue battery pack, circuit boards, and wiring. A hand is shown twisting a white cable to a red connector inside the case." + }, + { + "url": "/uploads/TI_51_7245d5bf10.png", + "alternativeText": "An illustration of an open field device case showing internal components, including a blue battery pack, circuit boards, wiring, and two red connectors on the exterior, with a white cable connected to one of the connectors." + } + ], + "logo": null + } + ] + }, + { + "id": "29", + "name": "onboarding.water.temp.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": "fieldkit/search/Assemble%20Water%20Temperature%20Pack/", + "header": { + "title": "Configurar", + "subtitle": "Temperatura del agua" + }, + "simple": [ + { + "body": "# ¿Tienes todo?\n\nToma la sonda de temperatura del agua.\n\n## La placa del módulo de temperatura del agua ya debería estar conectada a la estación.\n\n## Antes de calibrarlos, examina la placa del módulo y el cable de la sonda en busca de una calcomanía de identificación de calibración (CAL ID). Todos los pares de sonda y placa del módulo que tienen el mismo CAL ID ya han sido calibrados juntos en el laboratorio y no tienes que calibrarlos antes de su uso inicial. Además, si tienes varias sondas del mismo tipo, asegúrate de hacer coincidir el número de CAL ID en el cable de la sonda y la placa del módulo al configurar la estación.", + "images": [ + { + "url": "/uploads/TI_52_6bd200df41.png", + "alternativeText": "Illustration showing a coiled black cable with a sensor on one end and a separate blue electronic module with buttons and connectors." + }, + { + "url": "/uploads/TI_53_bf0f0b3bd8.png", + "alternativeText": "Illustration of an open electronics enclosure containing various components. Inside the enclosure, there is a blue battery pack on the left, a blue circuit board with connected red wires at the top, and a blue rectangular module on the right side. Two red connectors are mounted at the bottom of the enclosure, with a white cable exiting through one of them." + } + ], + "logo": null + } + ] + }, + { + "id": "30", + "name": "onboarding.water.temp.02", + "locale": "en_US", + "forward": "¿Necesitas más ayuda? Ver el Manual del producto.", + "skip": "Finalizar y salir", + "guide_title": "", + "guide_url": "fieldkit/search/Screw%20the%20Water%20Temperature%20Probe%20cable%20into/", + "header": { + "title": "Configurar", + "subtitle": "Temperatura del agua" + }, + "simple": [ + { + "body": "# Adjuntar a la estación\n\nAtornilla el cable de la sonda de temperatura del agua en el cuadro del módulo de temperatura del agua.", + "images": [ + { + "url": "/uploads/TI_54_144e3748ce.png", + "alternativeText": "Illustration of a hand inside an open electronics enclosure, connecting a wire to a white connector on the right side by twisting. The enclosure contains a blue battery pack on the left, a blue circuit board with connected red wires at the top, and a blue rectangular module on the right side. Two red connectors are mounted at the bottom of the enclosure, with a white cable exiting through one of them." + }, + { + "url": "/uploads/TI_55_66606bdf84.png", + "alternativeText": "Illustration of an open electronics enclosure. Inside the enclosure are several electronic components, including a blue battery pack on the left, a blue circuit board with connected red wires at the top, and a blue rectangular module on the right side connected to a white cable. Two red connectors are mounted at the bottom of the enclosure, with a white cable exiting through one of them." + } + ], + "logo": null + } + ] + }, + { + "id": "31", + "name": "onboarding.distance.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": "fieldkit/search/Assemble%20Distance%20Pack/", + "header": { + "title": "Configurar", + "subtitle": "Distancia" + }, + "simple": [ + { + "body": "# ¿Tienes todo?\nRecoge el paquete de distancia:\n\nA) Cable CAT5\nB) Placa del sensor de distancia\nC) Telémetro ultrasónico \n\n## La placa del módulo de distancia ya debe estar conectado a tu estación.", + "images": [ + { + "url": "/uploads/TI_56_69c1d0dd93.png", + "alternativeText": "An illustration showing three labeled components: A red cable labeled 'A,' a blue rectangular module labeled 'B,' and a blue distance probe labeled 'C.'" + }, + { + "url": "/uploads/TI_57_7fc02a0769.png", + "alternativeText": "Illustration of an open field device case showing the internal components, including blue battery packs, circuit boards, and red wiring connections. The case features two red connectors at the bottom, and the components are neatly arranged within the case." + } + ], + "logo": null + } + ] + }, + { + "id": "32", + "name": "onboarding.distance.02", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": "fieldkit/search/2.%20Insert%20CAT5%20Cable%20into%20Distance%20Sensor%20Board/", + "header": { + "title": "Configurar", + "subtitle": "Distancia" + }, + "simple": [ + { + "body": "# Insertar cable CAT5\nInserta un extremo del cable CAT5. Asegúrate de insertarlo de la forma correcta.", + "images": [ + { + "url": "/uploads/TI_58_8615906cb3.png", + "alternativeText": "Illustration showing two hands. The left hand holds a blue cylindrical component with a beige electronic piece and a blue socket attached at the top. The right hand is holding a red cable connector, positioned as if it is about to be inserted into the blue socket on the electronic piece." + }, + { + "url": "/uploads/TI_59_224561592e.png", + "alternativeText": "Illustration showing two hands. The left hand holds a blue cylindrical component with a beige electronic piece and a blue socket attached at the top. The right hand is holding a red cable connector, positioned as if it is about to be inserted into the blue socket on the electronic piece." + }, + { + "url": "/uploads/TI_60_ad8e7789c5.png", + "alternativeText": "Illustration showing a beige electronic component with a blue socket connected to a red cable. The component is partially inserted into a blue base with a threaded lower section." + } + ], + "logo": null + } + ] + }, + { + "id": "33", + "name": "onboarding.distance.03", + "locale": "en_US", + "forward": "Completar configuración", + "skip": "", + "guide_title": "", + "guide_url": "fieldkit/search/4.%20Attach%20Distance%20Sensor%20Board/", + "header": { + "title": "Configurar", + "subtitle": "Distancia" + }, + "simple": [ + { + "body": "# Adjuntar a la estación\nAsegúrate de que el otro extremo del cable CAT5 se inserte de forma segura en la placa del módulo de distancia.", + "images": [ + { + "url": "/uploads/TI_61_d487cfcc1b.png", + "alternativeText": "An illustration showing an open field device case with internal components, including blue battery packs, circuit boards, and red wiring. A hand is holding a red cable, while a blue component with attached red wiring lies outside the case, ready to be connected." + }, + { + "url": "/uploads/TI_62_9036f44b11.png", + "alternativeText": "Illustration showing the inside of an open field device case with internal components, including blue battery packs, circuit boards, and red wiring connections. A red cable is partially connected, and a blue sensor with attached red cable is positioned outside the case." + } + ], + "logo": null + } + ] + }, + { + "id": "34", + "name": "onboarding.weather.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": "fieldkit/search/Your%20Distance%20Pack%20consists%20of%20a/", + "header": { + "title": "Configurar", + "subtitle": "Módulo meteorológico" + }, + "simple": [ + { + "body": "# ¿Tienes todo?\n\nRecoge el paquete meterológico:\n\nA) Abrigo meterólogico y brazo E) Anemómetro y veleta y brazo \nB) Placa de sensor meteorológico F) Poste de instalación (a) y (b) \nC) Cable CAT5 G) Abrazadera de manguera |\nD) Pluviómetro y brazo H) Tornillos \n\n## La placa del módulo meteorológico ya debe estar conectado a tu estación.", + "images": [ + { + "url": "/uploads/TI_26_2e8af5beca.png", + "alternativeText": "Illustration showing a cylindrical component (A), a rectangular circuit board (B), a small rectangular module (C), and a coiled cable (D) arranged side by side." + }, + { + "url": "/uploads/TI_27_17f8b5ff80.png", + "alternativeText": "Illustration of various components, including a rectangular device with attached cables (D), an anemometer assembly (E), two cylindrical tubes (F), and a clamp (G)." + }, + { + "url": "/uploads/TI_28_c01ec2c372.png", + "alternativeText": "Illustration of an open enclosure containing several electronic components, including a blue battery pack, circuit boards, and red connectors at the bottom." + } + ], + "logo": null + } + ] + }, + { + "id": "35", + "name": "onboarding.weather.02", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar este paso", + "guide_title": null, + "guide_url": "fieldkit/search/2.%20Insert%20CAT5%20Cable%20into%20Distance%20Sensor%20Board/", + "header": { + "title": "Configurar", + "subtitle": "Módulo meteorológico" + }, + "simple": [ + { + "body": "# Insertar cable CAT5\n\nInserta un extremo del cable CAT5 en la placa del sensor meteorológico. Asegúrate de insertarlo de la forma correcta.", + "images": [ + { + "url": "/uploads/TI_29_04490e357c.png", + "alternativeText": "Illustration of hands holding a beige weather circuit board, connecting a red wire to it." + }, + { + "url": "/uploads/TI_30_fe64b4c2e8.png", + "alternativeText": "Illustration of a hand holding a beige weather circuit board with a red wire connected to it." + }, + { + "url": "/uploads/TI_31_182d1a91b6.png", + "alternativeText": "Illustration of hands holding a beige weather circuit board, with one hand connecting a red wire to the board." + } + ], + "logo": null + } + ] + }, + { + "id": "40", + "name": "onboarding.water.ph.03", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Finalizar y salir", + "guide_title": null, + "guide_url": "fieldkit/search/Make%20sure%20you%20have%203%20different%20pH%20standard%20solutions./", + "header": { + "title": "Configurar", + "subtitle": "pH" + }, + "simple": [ + { + "body": "# Calibración de tres puntos\n\nAsegúrate de que tienes tres soluciones estándar de pH. Recomendamos pH 4.00, 7.00 y 10.00.", + "images": [ + { + "url": "/uploads/TI_11_1_2_3_p_H_b98d65977a.png", + "alternativeText": "An illustration of three bottles labeled Point 1, Point 2, and Point 3, each with different colors representing different pH levels." + } + ], + "logo": null + } + ] + }, + { + "id": "41", + "name": "onboarding.water.ec.03", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar", + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Conductividad" + }, + "simple": [ + { + "body": "# Calibración de tres puntos\n\nAsegúrate de que tienes tres soluciones estándar de conductividad. Recomendamos 1.000, 10.000 y 100.000 µS/cm.", + "images": [ + { + "url": "/uploads/TI_11_1_2_3_conductivity_a5568114a3.png", + "alternativeText": "An illustration of three bottles labeled Point 1, Point 2, and Point 3, each with different colors representing different conductivity levels measured in µS/cm." + } + ], + "logo": null + } + ] + }, + { + "id": "42", + "name": "onboarding.water.temp.03", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar", + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Temperatura del agua" + }, + "simple": [ + { + "body": "# Calibración de transferencia de tres puntos\nAsegúrate de que tienes 3 fuentes de temperatura y un termómetro estándar.\n\n## Recomendamos usar las siguientes fuentes en este orden: una taza de agua de hielo (0°C), aire a temperatura ambiente y una taza de agua hirviendo (100°C).", + "images": [ + { + "url": "/uploads/TI_74_e5319a0c87.png", + "alternativeText": "Three beakers are shown with different liquids and temperatures. The first beaker on the left, labeled 'Point 1,' contains liquid with ice cubes, the middle position 'Point 2' is empty with a thermometer above it, and the third beaker on the right, labeled 'Point 3,' has a steaming liquid, with a thermometer being inserted by a hand from the right." + } + ], + "logo": null + } + ] + }, + { + "id": "43", + "name": "onboarding.water.dox.03", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar", + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Oxígeno disuelto" + }, + "simple": [ + { + "body": "# Calibración de transferencia de tres puntos\n\nReúne una taza de agua, una bomba de aire para acuarios, mangueras y piedra de difusión de aire, y un medidor de oxígeno disuelto estándar o kit de prueba.", + "images": [ + { + "url": "/uploads/TI_66_9740ee9cb4.png", + "alternativeText": "The image shows a setup with a blue device connected to a jar containing liquid, a black probe, and a small red object, with the text \"+ your standard\" indicating an additional component to be added to the jar." + } + ], + "logo": null + } + ] + }, + { + "id": "45", + "name": "z.onboarding.00", + "locale": "en_US", + "forward": "Empezar", + "skip": "Saltar instrucciones", + "guide_title": "", + "guide_url": "", + "header": { + "title": "¡Bienvenido!", + "subtitle": null + }, + "simple": [ + { + "body": "![Logo](0:auto)\n\n![Welcome](1)\n\n# ¡Bienvenido!\n\nNuestra aplicación móvil hace que sea fácil configurar y desplegar tu estación FieldKit.", + "images": [ + { + "url": "/uploads/fieldkit_Logo_final_ac28b5ba44.png", + "alternativeText": "Logo de Fieldkit" + }, + { + "url": "/uploads/Fieldkit_Panel_04_1500px_a9dcbe9502.png", + "alternativeText": "Illustrations of people using laptops surrounded by speech bubbles, plants, and birds" + } + ], + "logo": null + } + ] + }, + { + "id": "47", + "name": "onboarding.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/Overview/", + "header": { + "title": "Si necesitas ayuda", + "subtitle": null + }, + "simple": [ + { + "body": "Si te quedas atascado, usa nuestra Manual del producto en fieldkit.org que pasa por estos pasos (y más) con más detalle. \n\nPuedes acceder a todos nuestros recursos de soporte, incluida el Manual del producto, haciendo clic en el ? azul en la esquina superior derecha. ", + "images": [ + { + "url": "/uploads/product_guide_help_icon_38aad2f330.svg", + "alternativeText": "An icon with a book with an exclamation mark in a circle to the left and a question mark in a circle to the right." + } + ], + "logo": null + } + ] + }, + { + "id": "48", + "name": "onboarding.02", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": "", + "guide_url": "fieldkit/search/1.%20Core/", + "header": { + "title": "Ensamblar la estación", + "subtitle": null + }, + "simple": [ + { + "body": "# ¿Tienes todo? (1/3)\nComprueba que tienes todas las piezas necesarias para ensamblar tu estación FieldKit.\n\nNÚCLEO\nA) Placa superior \nB) Placa inferior\nC) Base de módulo\n\nSENSORES\nD) Placa(s) de módulo encontrada(s) en cada paquete de sensor", + "images": [ + { + "url": "/uploads/TI_1_A_1021_150bb7fb93.png", + "alternativeText": "An illustration depicting four different electronic components. Component A is a blue circuit board with a few lines and a small rectangular outline. Component B is a beige circuit board with several square and rectangular patterns, including a few small components and connectors. Component C is another beige circuit board with larger, more simplified patterns. Component D is a smaller blue component with a narrow rectangular shape, a module." + } + ], + "logo": null + } + ] + }, + { + "id": "49", + "name": "onboarding.03", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/3.%20Power/", + "header": { + "title": "Ensamblar la estación", + "subtitle": null + }, + "simple": [ + { + "body": "# ¿Tienes todo? (2/3)\n\nPOTENCIA\nE) Batería\nF) Cable microUSB\nG) Panel Solar + Cable (opcional)", + "images": [ + { + "url": "/uploads/TI_1_B_e7c58a7039.png", + "alternativeText": "The image displays three labeled components: E shows a blue battery pack with attached red wires, F presents a coiled red wire with connectors, and G illustrates a blue solar panel with a long red wire attached." + } + ], + "logo": null + } + ] + }, + { + "id": "50", + "name": "onboarding.04", + "locale": "en_US", + "forward": "Siguiente", + "skip": "Saltar instrucciones de ensamblado", + "guide_title": null, + "guide_url": "fieldkit/search/4.%20Case/", + "header": { + "title": "Ensamblar la estación", + "subtitle": null + }, + "simple": [ + { + "body": "# ¿Tienes todo? (3/3)\n\nCAJA\nH) Caja FieldKit\nI) Paquete de placa de cableado\n\nTORNILLOS DE ESTACIÓN\nJ) Paquetes de tornillos de estación (Station Screw Packs)\n\n+ destornillador de estrella y cargador USB de pared (no incluido)", + "images": [ + { + "url": "/uploads/TI_18_A_21_1022_47199fdf54.png", + "alternativeText": "A large blue enclosure alongside smaller components, including a panel with circular cutouts, red grommets, and screws, intended for assembly and securing internal electronic components." + } + ], + "logo": null + } + ] + }, + { + "id": "51", + "name": "calibration.water.ph.p1.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Set Up", + "subtitle": "pH" + }, + "simple": [ + { + "body": "Coloca la sonda de pH en una taza con el primer estándar y deja que las lecturas se estabilicen.", + "images": [ + { + "url": "/uploads/TI_13_A_p_H_9d27dc0d6f.png", + "alternativeText": "Illustration of a hand holding a beige and red pH sensor device, dipping it into a clear beaker filled with liquid." + }, + { + "url": "/uploads/TI_13_B_p_H_d2c2bea9e5.png", + "alternativeText": " Illustration of a beige and red pH sensor device placed in a clear beaker filled with liquid, with a black cable attached to the sensor." + } + ], + "logo": null + } + ] + }, + { + "id": "52", + "name": "calibration.water.ph.p2.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "pH" + }, + "simple": [ + { + "body": "# Enjuagar\n\nEntre los pasos de calibración necesitarás enjuagar la sonda con agua. El agua del grifo está bien.", + "images": [ + { + "url": "/uploads/TI_12_A_p_H_8706644487.png", + "alternativeText": "Illustration of hands holding a beige and red sensor device, with blue liquid being dispensed onto it from a red squeeze bottle." + }, + { + "url": "/uploads/TI_12_B_p_H_5a0aa8abd9.png", + "alternativeText": "Illustration of hands holding a beige and red sensor device, with liquid to be dispensed onto it from a red squeeze bottle." + } + ], + "logo": null + } + ] + }, + { + "id": "53", + "name": "calibration.water.ph.p2.02", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "pH" + }, + "simple": [ + { + "body": "Coloca la sonda de pH en una taza con el sigiuente estándar y deja que las lecturas se estabilicen.", + "images": [ + { + "url": "/uploads/TI_13_A_p_H_9d27dc0d6f.png", + "alternativeText": "Illustration of a hand holding a beige and red pH sensor device, dipping it into a clear beaker filled with liquid." + }, + { + "url": "/uploads/TI_13_B_p_H_d2c2bea9e5.png", + "alternativeText": " Illustration of a beige and red pH sensor device placed in a clear beaker filled with liquid, with a black cable attached to the sensor." + } + ], + "logo": null + } + ] + }, + { + "id": "54", + "name": "calibration.water.ph.p3.02", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "pH" + }, + "simple": [ + { + "body": "Coloca la sonda de pH en una taza con el sigiuente estándar y deja que las lecturas se estabilicen.", + "images": [ + { + "url": "/uploads/TI_13_A_p_H_9d27dc0d6f.png", + "alternativeText": "Illustration of a hand holding a beige and red pH sensor device, dipping it into a clear beaker filled with liquid." + }, + { + "url": "/uploads/TI_13_B_p_H_d2c2bea9e5.png", + "alternativeText": " Illustration of a beige and red pH sensor device placed in a clear beaker filled with liquid, with a black cable attached to the sensor." + } + ], + "logo": null + } + ] + }, + { + "id": "55", + "name": "calibration.water.ec.p1.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Conductividad" + }, + "simple": [ + { + "body": "Coloca la sonda de conductividad en una taza con el primer estándar y deja que las lecturas se estabilicen.", + "images": [ + { + "url": "/uploads/TI_13_A_ec_d7230f1d7b.png", + "alternativeText": "Illustration of a hand holding a green and black EC sensor device, dipping it into a clear beaker filled with liquid." + }, + { + "url": "/uploads/TI_13_B_ec_8cc7ee0135.png", + "alternativeText": " Illustration of a black and green EC sensor device placed in a clear beaker filled with liquid, with a black cable attached to the sensor." + } + ], + "logo": null + } + ] + }, + { + "id": "56", + "name": "calibration.water.ec.p2.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Conductividad" + }, + "simple": [ + { + "body": "# Enjuagar\n\nEntre los pasos de calibración necesitarás enjuagar la sonda con agua. El agua del grifo está bien.", + "images": [ + { + "url": "/uploads/TI_12_A_ec_97a2522c00.png", + "alternativeText": " Illustration of hands holding a green and black sensor device, with liquid to be dispensed onto it from a red squeeze bottle." + }, + { + "url": "/uploads/TI_12_B_ec_ffacfe0ae0.png", + "alternativeText": " Illustration of hands holding a green and black sensor device, with blue liquid being dispensed onto it from a red squeeze bottle." + } + ], + "logo": null + } + ] + }, + { + "id": "57", + "name": "calibration.water.ec.p2.02", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Conductividad" + }, + "simple": [ + { + "body": "Coloca la sonda de conductividad en una taza con el primer estándar y deja que las lecturas se estabilicen.", + "images": [ + { + "url": "/uploads/TI_13_A_ec_d7230f1d7b.png", + "alternativeText": "Illustration of a hand holding a green and black EC sensor device, dipping it into a clear beaker filled with liquid." + }, + { + "url": "/uploads/TI_13_B_ec_8cc7ee0135.png", + "alternativeText": " Illustration of a black and green EC sensor device placed in a clear beaker filled with liquid, with a black cable attached to the sensor." + } + ], + "logo": null + } + ] + }, + { + "id": "58", + "name": "calibration.water.ec.p3.02", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Conductividad" + }, + "simple": [ + { + "body": "Coloca la sonda de conductividad en una taza con el primer estándar y deja que las lecturas se estabilicen.", + "images": [ + { + "url": "/uploads/TI_13_A_ec_d7230f1d7b.png", + "alternativeText": "Illustration of a hand holding a green and black EC sensor device, dipping it into a clear beaker filled with liquid." + }, + { + "url": "/uploads/TI_13_B_ec_8cc7ee0135.png", + "alternativeText": " Illustration of a black and green EC sensor device placed in a clear beaker filled with liquid, with a black cable attached to the sensor." + } + ], + "logo": null + } + ] + }, + { + "id": "59", + "name": "onboarding.water.orp.01", + "locale": "en_US", + "forward": "Iniciar temporizador", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Potencial de reducción (ORP)" + }, + "simple": [ + { + "body": "Coloca la sonda ORP en una taza con el primer estándar.", + "images": [ + { + "url": "/uploads/TI_13_A_fc64035c11.png", + "alternativeText": "Illustration of a hand holding a blue probe, inserting it into a beaker containing a liquid." + }, + { + "url": "/uploads/TI_13_B_e25343ac9c.png", + "alternativeText": "Illustration of a blue probe submerged in a beaker containing a liquid, with a cable extending from the top of the probe." + } + ], + "logo": null + } + ] + }, + { + "id": "60", + "name": "calibration.water.orp.p2.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Potencial de reducción (ORP)" + }, + "simple": [ + { + "body": "# Enjuagar\n\nEntre los pasos de calibración necesitarás enjuagar la sonda con agua. El agua del grifo está bien.", + "images": [ + { + "url": "/uploads/TI_12_A_02a7dac8c0.png", + "alternativeText": "Illustration of a hand holding a squeeze bottle with a long nozzle, applying a liquid to the end of a cylindrical object held by another hand on the right, with drops of liquid visibly falling from the nozzle." + }, + { + "url": "/uploads/TI_12_B_517bbeacf5.png", + "alternativeText": "Illustration of a hand holding a squeeze bottle with a long nozzle, applying a liquid to a cylindrical object held by another hand on the right." + } + ], + "logo": null + } + ] + }, + { + "id": "61", + "name": "calibration.water.temp.p1.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Temperatura del agua" + }, + "simple": [ + { + "body": "Coloca la sonda de temperatura y el termómetro estándar en una taza con agua helada.", + "images": [ + { + "url": "/uploads/TI_75_e297e55cab.png", + "alternativeText": "The image depicts a hand holding a red thermometer, inserting it into a beaker filled with liquid and ice cubes and the temperature probe." + } + ], + "logo": null + } + ] + }, + { + "id": "62", + "name": "calibration.water.temp.p2.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Temperatura del agua" + }, + "simple": [ + { + "body": "Coloca el termómetro estándar y la sonda de temperatura del agua en contacto entre sí sobre una superficie seca.", + "images": [ + { + "url": "/uploads/TI_76_0c7fb8389f.png", + "alternativeText": "A hand holding a red temperature meter with a long, slender metal tip of the temperature probe and a connected black cable." + } + ], + "logo": null + } + ] + }, + { + "id": "63", + "name": "calibration.water.temp.p3.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Temperatura del agua" + }, + "simple": [ + { + "body": "Coloca la sonda de temperatura y el termómetro estándar en una taza con agua hirviendo.", + "images": [ + { + "url": "/uploads/TI_77_1b8e30f70e.png", + "alternativeText": "The image depicts a hand holding a red thermometer, inserting it into a beaker filled with boiling water and the temperature probe." + } + ], + "logo": null + } + ] + }, + { + "id": "64", + "name": "calibration.water.dox.p1.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Oxígeno disuelto" + }, + "simple": [ + { + "body": "Si usas un medidor DO, coloca el medidor y la sonda en agua caliente y quieta y esperar a que el número en su pantalla deje de cambiar. Si usas un kit de prueba DO, retira una muestra de agua y pruébala ahora. Introduce ese número en el formulario en la siguiente pantalla.", + "images": [ + { + "url": "/uploads/TI_68_A_691f2b80d8.png", + "alternativeText": "Illustration of a setup involving a blue pump connected to a jar containing a black and yellow sensor and a red probe, with the text \"Add your standard\" above the jar. A red arrow is pointing into the jar." + }, + { + "url": "/uploads/TI_68_B_1c66c8e1b7.png", + "alternativeText": "Illustration of a setup involving a blue pump connected to a jar containing a black and yellow sensor and a red probe, with the text \"Add your standard\" above the jar." + } + ], + "logo": null + } + ] + }, + { + "id": "65", + "name": "calibration.water.dox.p2.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Oxígeno disuelto" + }, + "simple": [ + { + "body": "Si usas un medidor DO, coloca el medidor y la sonda en agua que está siendo aireada por la bomba de aire y esperar a que el número en su pantalla deje de cambiar. Si usas un kit de prueba DO, retira una muestra de agua y pruébala ahora. Introduce ese número en el formulario en la siguiente pantalla.", + "images": [ + { + "url": "/uploads/TI_72_1f5a131303.png", + "alternativeText": "Illustration of a blue pump connected to a jar containing a black and yellow sensor and a red probe, with lots of bubbles in the liquid and a red arrow pointing down into the jar. The text \"Add your standard\" is displayed above the jar." + }, + { + "url": "/uploads/TI_71_39fbdbadf1.png", + "alternativeText": " Illustration of a blue pump connected to a jar containing a black and yellow sensor and a red probe, with bubbles in the liquid and a red arrow pointing down into the jar. The text \"Add your standard\" is displayed above the jar, and the text \"Turn to Low\" with an arrow is shown clockwise turning next to the pump." + } + ], + "logo": null + } + ] + }, + { + "id": "66", + "name": "calibration.water.dox.p3.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Oxígeno disuelto" + }, + "simple": [ + { + "body": "Coloca la sonda en el aire libre e ingresa la concentración de oxígeno atmosférico, 20,9%, en el formulario en la siguiente pantalla.", + "images": [ + { + "url": "/uploads/TI_70_9d33114cee.png", + "alternativeText": "Illustration of a blue pump connected to a jar containing a black and yellow sensor and a red probe, with bubbles in the liquid and a red arrow pointing down into the jar. The text \"Add your standard\" is displayed above the jar." + }, + { + "url": "/uploads/TI_73_dd68fb7f11.png", + "alternativeText": " Illustration of a blue pump connected to a jar containing a black and yellow sensor and a red probe, with bubbles in the liquid and a red arrow pointing down into the jar. The text \"Add your standard\" is displayed above the jar, and the text \"Turn to High\" with an arrow is shown counterclockwise turning next to the pump." + } + ], + "logo": null + } + ] + }, + { + "id": "67", + "name": "wifi.01", + "locale": "en_US", + "forward": "Continuar", + "skip": "Saltar instrucciones de conexión", + "guide_title": null, + "guide_url": "fieldkit/search/1.%20Turn%20on%20Station%20WiFi/", + "header": { + "title": "Conectar estación", + "subtitle": "WiFi de la estación FieldKit" + }, + "simple": [ + { + "body": "#Encender el WiFi de la estación\n\nLa estación tiene un punto de acceso con su propia señal WiFi que se usa para conectar directamente a tu móvil (no hay conectividad al resto del internet).\n\nPresiona el botón para activar el WiFi de la estación.\n\n## El WiFi también se puede encender en el menú de la pantalla de la estación.", + "images": [ + { + "url": "/uploads/TI_9_A_0f592cae73.jpg", + "alternativeText": "Illustration of a hand hovering over pressing a red button on the side of a blue protective case." + }, + { + "url": "/uploads/TI_9_B_3119a0d5e5.jpg", + "alternativeText": "Illustration of a hand pressing a red button on the side of a blue protective case." + } + ], + "logo": null + } + ] + }, + { + "id": "68", + "name": "wifi.02", + "locale": "en_US", + "forward": "Abrir la configuración WiFi", + "skip": "Hecho", + "guide_title": null, + "guide_url": "fieldkit/search/2.%20Connect%20to%20your%20Station/", + "header": { + "title": "Conectar estación", + "subtitle": "WiFi de la estación FieldKit" + }, + "simple": [ + { + "body": "#Conectate a la estación\n\nPrimero, ve a la configuración del WiFi de tu teléfono móvil:\n\nANDROID:\n- Desplegar el menú superior\n- Pulsar el icono de \"Configuración\"\n- Pulsar \"Red e Internet\"\n- Pulsar \"Wi-Fi\"\n\niOS:\n- Pulsar el icono de \"Configuración\"\n- Pulsar \"Wi-Fi\"\n\nDespués, selecciona el nombre del WiFi que se muestra en la pantalla de la estación.\n\n## Nota: Por defecto, el nombre será una combinación de un adjetivo calificativo y el nombre de un animal (todo en inglés), por ejemplo, Friendly Squid.", + "images": [ + { + "url": "/uploads/TI_10_2024_0621_ffb15b11dd.png", + "alternativeText": "Illustration of an electronic device with a blue circuit board and connected wires, displaying a screen labeled \"Friendly Squid.\"" + }, + { + "url": "/uploads/TI_10_2024_0621_Product_Guide_Phone_Wifi_Setting_081f6cfc2b.png", + "alternativeText": "Screenshot of a Wi-Fi settings screen showing the device connected to a network named \"Friendly Squid\" with other available networks listed, including \"Wi-Fi Network\" and \"Public Wi-Fi Network.\"" + } + ], + "logo": null + } + ] + }, + { + "id": "69", + "name": "calibration.water.ph.p3.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "pH" + }, + "simple": [ + { + "body": "# Enjuagar\n\nEntre los pasos de calibración necesitarás enjuagar la sonda con agua. El agua del grifo está bien.", + "images": [ + { + "url": "/uploads/TI_12_A_p_H_8706644487.png", + "alternativeText": "Illustration of hands holding a beige and red sensor device, with blue liquid being dispensed onto it from a red squeeze bottle." + } + ], + "logo": null + } + ] + }, + { + "id": "70", + "name": "calibration.water.ec.p3.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Conductividad" + }, + "simple": [ + { + "body": "# Enjuagar\n\nEntre los pasos de calibración necesitarás enjuagar la sonda con agua. El agua del grifo está bien.", + "images": [ + { + "url": "/uploads/TI_12_A_ec_97a2522c00.png", + "alternativeText": " Illustration of hands holding a green and black sensor device, with liquid to be dispensed onto it from a red squeeze bottle." + } + ], + "logo": null + } + ] + }, + { + "id": "71", + "name": "calibration.water.orp.p3.01", + "locale": "en_US", + "forward": "Siguiente", + "skip": null, + "guide_title": null, + "guide_url": null, + "header": { + "title": "Configurar", + "subtitle": "Potencial de reducción (ORP)" + }, + "simple": [ + { + "body": "# Enjuagar\n\nEntre los pasos de calibración necesitarás enjuagar la sonda con agua. El agua del grifo está bien.", + "images": [ + { + "url": "/uploads/TI_12_A_02a7dac8c0.png", + "alternativeText": "Illustration of a hand holding a squeeze bottle with a long nozzle, applying a liquid to the end of a cylindrical object held by another hand on the right, with drops of liquid visibly falling from the nozzle." + } + ], + "logo": null + } + ] + }, + { + "id": "72", + "name": "no_modules.01", + "locale": "en_US", + "forward": "Continuar", + "skip": "Saltar instrucciones de módulos", + "guide_title": null, + "guide_url": null, + "header": { + "title": "Adjuntar módulos", + "subtitle": "" + }, + "simple": [ + { + "body": "# Apagar\n\nMueve el pequeño interruptor que se encuentra en la parte superior izquierda de la placa superior a la posición \"OFF\" para que tu estación FieldKit apague y estés listo para agegrar las placas de módulo.\n\nPuedes hacerlo con la punta del dedo o de la uña, o incluso con la punta del destornillador.", + "images": [ + { + "url": "/uploads/small_TI_15_B_NEW_x2_c6d2b7798b_ON_4013a38928.png", + "alternativeText": "Illustration of a section of an electronic device with a blue circuit board, connected wires, and an on/off switch labeled at the top, switched ON." + }, + { + "url": "/uploads/small_TI_15_B_NEW_x2_c6d2b7798b_OFF_b5a0e1959b.png", + "alternativeText": "Illustration of a section of an electronic device with a blue circuit board, connected wires, and an on/off switch labeled at the top, switched OFF." + } + ], + "logo": null + } + ] + }, + { + "id": "73", + "name": "no_modules.02", + "locale": "en_US", + "forward": "Continuar", + "skip": "Saltar instrucciones de módulos", + "guide_title": null, + "guide_url": "fieldkit/search/6.%20Attach%20Module%20Boards/", + "header": { + "title": "Adjuntar módulos", + "subtitle": "" + }, + "simple": [ + { + "body": "# Adjuntar placas de módulos\n\nAdjuntar las placas de módulos individuales a la base de módulos y asegurarlas con tornillos de la placa de módulo.\n\n## Ten cuidado para evitar plegar los pines en la base de módulos, y asegúrate de que los pines nunca se tocan entre sí, ya que podría dañar la placa.\n\n##Recuerda remover los pequeños círculos transparentes de cinta amarilla de los \"standoffs\" donde unirás tu placa de módulos a la base de módulos.", + "images": [ + { + "url": "/uploads/small_TI_4_A_e9dc955a94_ff618a7209.jpg", + "alternativeText": "Illustration of two hands assembling an electronic device, connecting the blue circuit board with the beige base." + }, + { + "url": "/uploads/small_TI_4_B_ca5ad842a0_61d9cc2eb0.png", + "alternativeText": "Illustration of hands holding an electronic device with a blue circuit board and connected components, showing both the blue and beige sections of the device." + } + ], + "logo": null + } + ] + }, + { + "id": "74", + "name": "no_modules.03", + "locale": "en_US", + "forward": "Continuar", + "skip": "Saltar instrucciones de módulos", + "guide_title": "", + "guide_url": "fieldkit/search/10.%20Switch%20On%20to%20Connect/", + "header": { + "title": "Adjuntar módulos", + "subtitle": "" + }, + "simple": [ + { + "body": "# Encender\n\nInvierte el pequeño interruptor en la parte superior izquierda de la placa superior a la posición \"ON\" para que tu estación FieldKit llegue a la vida, y prepararte para volver a conectar.", + "images": [ + { + "url": "/uploads/small_TI_15_B_NEW_x2_c6d2b7798b_OFF_2_d87d9414e3.png", + "alternativeText": "Illustration of a section of an electronic device with a blue circuit board, connected wires, and an on/off switch labeled at the top, switched OFF." + }, + { + "url": "/uploads/small_TI_15_B_NEW_x2_c6d2b7798b_ON_2_20dfcdc707.png", + "alternativeText": "Illustration of a section of an electronic device with a blue circuit board, connected wires, and an on/off switch labeled at the top, switched ON." + } + ], + "logo": null + } + ] + }, + { + "id": "75", + "name": "no_modules.04", + "locale": "en_US", + "forward": "Continuar", + "skip": "Saltar instrucciones de módulos", + "guide_title": "Ver el Manual de producto para instrucciones completas de \"Conectar estación\"", + "guide_url": "https://www.fieldkit.org/product-guide/set-up-station/#connect-station", + "header": { + "title": "Adjuntar módulos", + "subtitle": "Volver a conectar" + }, + "simple": [ + { + "body": "# Volver a conectar a tu estación\n\nEncienda el WiFi de la estación presionando el botón externo del WiFi. Ve a la configuración WiFi de tu teléfono móvil y selecciona el nombre de la estación que aparece en la pantalla de la estación. ", + "images": [ + { + "url": "/uploads/TI_9_B_3119a0d5e5.jpg", + "alternativeText": "Illustration of a hand pressing a red button on the side of a blue protective case." + }, + { + "url": "/uploads/TI_10_2024_0621_ffb15b11dd.png", + "alternativeText": "Illustration of an electronic device with a blue circuit board and connected wires, displaying a screen labeled \"Friendly Squid.\"" + }, + { + "url": "/uploads/TI_10_2024_0621_Product_Guide_Phone_Wifi_Setting_081f6cfc2b.png", + "alternativeText": "Screenshot of a Wi-Fi settings screen showing the device connected to a network named \"Friendly Squid\" with other available networks listed, including \"Wi-Fi Network\" and \"Public Wi-Fi Network.\"" + } + ], + "logo": null + } + ] + }, + { + "id": "76", + "name": "data_sync.01", + "locale": "en_US", + "forward": "Got It", + "skip": "Saltar", + "guide_title": null, + "guide_url": null, + "header": { + "title": "Cómo funciona la sincronización de datos", + "subtitle": "4 pasos fáciles" + }, + "simple": [ + { + "body": "# Paso 1\n\nConéctate a tu estación FieldKit para descargar datos de tu estación a tu telefono celular.", + "images": [], + "logo": null + } + ] + }, + { + "id": "77", + "name": "data_sync.02", + "locale": "en_US", + "forward": "Got It", + "skip": "Saltar", + "guide_title": null, + "guide_url": null, + "header": { + "title": "Cómo funciona la sincronización de datos", + "subtitle": "4 pasos fáciles" + }, + "simple": [ + { + "body": "# Paso 2\n\nLos archivos de datos se almacenan en tu telefono celular hasta que se conectan al internet.", + "images": [], + "logo": null + } + ] + }, + { + "id": "78", + "name": "data_sync.03", + "locale": "en_US", + "forward": "Got It", + "skip": "Saltar", + "guide_title": null, + "guide_url": null, + "header": { + "title": "Cómo funciona la sincronización de datos", + "subtitle": "4 pasos fáciles" + }, + "simple": [ + { + "body": "# Paso 3\n\nConéctate al internet para sincronizar automáticamente los datos con el portal FieldKit.", + "images": [ + { + "url": "/uploads/TI_10_2024_0621_Product_Guide_Phone_Wifi_Setting_081f6cfc2b.png", + "alternativeText": "Screenshot of a Wi-Fi settings screen showing the device connected to a network named \"Friendly Squid\" with other available networks listed, including \"Wi-Fi Network\" and \"Public Wi-Fi Network.\"" + } + ], + "logo": null + } + ] + }, + { + "id": "79", + "name": "data_sync.04", + "locale": "en_US", + "forward": "Got It", + "skip": "Saltar", + "guide_title": null, + "guide_url": null, + "header": { + "title": "Cómo funciona la sincronización de datos", + "subtitle": "4 pasos fáciles" + }, + "simple": [ + { + "body": "# Paso 4\n\nPodrás controlar quién puede ver esos datos desde la página tuya en el portal de datos.", + "images": [], + "logo": null + } + ] + } ] - }, - { - "id": "2", - "name": "onboarding.05", - "locale": "en_US", - "forward": "Seguir", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": "" - }, - "simple": [ - { - "body": "# Combinar las placas superiores e inferiores\nSi aún no está ensamblado, combine la placa superior con la inferior. Asegúrate de alinear las pinos y los conectores. Luego pulsa juntos con firmeza.", - "images": [ - { - "url": "uploads/TI_2_A_112a78f350.jpg" - }, - { - "url": "uploads/TI_19_23d1c3d3b8.png" - }, - { - "url": "uploads/TI_2_B_9b35a3f7e6.jpg" - } - ], - "logo": null - } - ] - }, - { - "id": "3", - "name": "onboarding.06", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": "" - }, - "simple": [ - { - "body": "# Adjuntar la base de los módulos\nAdjunta las placas combinadas superior e inferior a la base de los módulos. Ahora tienes tu núcleo FieldKit.", - "images": [ - { - "url": "uploads/TI_3_A_e2c8ce7917.png" - }, - { - "url": "uploads/TI_3_B_128f1f4de9.png" - } - ], - "logo": null - } - ] - }, - { - "id": "4", - "name": "onboarding.07", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": "" - }, - "simple": [ - { - "body": "# Adjuntar las placas modulares\nAdjuntar las placas modulares individuales a la base de los módulos y asegurarlas con tornillos de módulo.\n\n## Ten cuidado para evitar doblar los pines de la base de módulos, y asegúrate de que los pines nunca se tocan entre sí, ya que podría dañar la placa.", - "images": [ - { - "url": "uploads/TI_4_A_e9dc955a94.jpg" - }, - { - "url": "uploads/TI_4_B_8d208f1547.jpg" - } - ], - "logo": null - } - ] - }, - { - "id": "5", - "name": "onboarding.08", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": "" - }, - "simple": [ - { - "body": "# Asegurar en la caja\nColoca los componentes ensamblados dentro de la caja. Asegúralos con los tornillos del núcleo para minimizar el movimiento y el riesgo de daño.\n\n## Tendrás que levantar temporalmente la parte superior para llegar a uno de los agujeros de tornillo en la parte inferior.", - "images": [ - { - "url": "uploads/TI_5_A_ccf0984f18.png" - }, - { - "url": "uploads/TI_5_B_920a8e61b4.png" - }, - { - "url": "uploads/TI_20_e6fe720726.png" - } - ], - "logo": null - } - ] - }, - { - "id": "6", - "name": "onboarding.09", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": "" - }, - "simple": [ - { - "body": "# Adjuntar la batería\nInserte el cable de batería a la parte superior izquierda de la placa superior donde dice \"BATTERY\".\n\n## Importante: Antes de insertar, comprueba que lo has hecho bien. Insertar cables en los enchufes incorrectos puede dañar permanentemente tu FieldKit.", - "images": [ - { - "url": "uploads/TI_6_A_501dfaea02.png" - }, - { - "url": "uploads/TI_6_B_6405844cdc.png" - } - ], - "logo": null - } - ] - }, - { - "id": "7", - "name": "onboarding.10", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": "" - }, - "simple": [ - { - "body": "# Adjuntar el botón\nInserta el cable del botón a la parte superior derecha de la placa superior donde dice \"BTN\".\n\n## Importante: Antes de insertar, comprueba que lo has hecho bien. Insertar cables en los enchufes incorrectos puede dañar permanentemente tu FieldKit.", - "images": [ - { - "url": "uploads/TI_7_A_836b705122.png" - }, - { - "url": "uploads/TI_7_B_4470d5694e.png" - } - ], - "logo": null - } - ] - }, - { - "id": "8", - "name": "onboarding.13", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": "" - }, - "simple": [ - { - "body": "# Ensamblar la placa de cableado\nAñade los cables e insértalos en las prensaestopas. Atorníllalos en la placa de cableado.\n\n## Nota: El ensamblaje de las placas de cableado depende de la configuración de sensores y potencia, y puede ser bastante complejo. Visita [Manual del producto](https://fieldkit.org/Product-Guide/Set-Up-Station/#Assemble-Cable-Plate) para obtener instrucciones detalladas.", - "images": [ - { - "url": "uploads/TI_21_1c7cdf7182.png" - }, - { - "url": "uploads/TI_22_89ef0f77bf.png" - }, - { - "url": "uploads/TI_23_f4df431734.png" - } - ], - "logo": null - } - ] - }, - { - "id": "9", - "name": "onboarding.11", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": "" - }, - "simple": [ - { - "body": "# Conecta el cable micro-USB\nConecta el cable micro-USB a una fuente de alimentación externa para cargar la batería.", - "images": [ - { - "url": "uploads/TI_8_A_5c71cc37f2.png" - }, - { - "url": "uploads/TI_8_B_1bf06a1115.png" - } - ], - "logo": null - } - ] - }, - { - "id": "10", - "name": "onboarding.14", - "locale": "en_US", - "forward": "Completar el ensamblaje", - "skip": "", - "guide_title": "Ver el Manual del producto para instrucciones de configuración", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station/", - "header": { - "title": "Ensamblar la estación", - "subtitle": "" - }, - "simple": [ - { - "body": "# Adjunta la placa de cableado a la caja\nAhora que te hayas conectado tus cables, insertos y prensaestopas a la placa de cableado, atornilla la placa de cableado en la caja con tornillos de placa de cableado. \n\n## Asegurarte de que la junta esté presionada en la ranura para formar un ajuste adecuado para una protección óptima meterológica.", - "images": [ - { - "url": "uploads/TI_24_6362509d17.png" - }, - { - "url": "uploads/TI_25_80accf62d1.png" - } - ], - "logo": null - } - ] - }, - { - "id": "11", - "name": "onboarding.12", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": "" - }, - "simple": [ - { - "body": "# Encender y dejar la estación para cargar\nVoltear el interruptor a la posición \"ON\". Deja el cable micro-USB conectado hasta que la batería está completamente cargada.", - "images": [ - { - "url": "uploads/TI_15_A_NEW_x2_9759453cc0.png" - }, - { - "url": "uploads/TI_15_B_NEW_x2_05f6fd4bb9.png" - }, - { - "url": "uploads/TI_8_B_f3f2eaff13.png" - } - ], - "logo": null - } - ] - }, - { - "id": "17", - "name": "onboarding.weather.03", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Módulo meteorológico" - }, - "simple": [ - { - "body": "# Conectar el anemómetro de lluvia\n\nSe voltea la placa del sensor meteorológico, e inserta el cable RJ11 del pluviómetro en la ranura de la placa del sensor meteorológico marcado como “RAIN.”", - "images": [ - { - "url": "uploads/TI_32_ea3474ae96.png" - }, - { - "url": "uploads/TI_33_ba502858a1.png" - } - ], - "logo": null - } - ] - }, - { - "id": "18", - "name": "onboarding.weather.04", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Módulo meteorológico" - }, - "simple": [ - { - "body": "# Conectar el anemómetro y la veleta\n\nInserta el cable RJ11 de la veleta en la ranura de la placa del sensor meteorológico marcado como \"WIND.\" Inserta el cable RJ11 del anemómetro en la veleta para que estén conectados.", - "images": [ - { - "url": "uploads/TI_34_41fc0b20bb.png" - }, - { - "url": "uploads/TI_35_77a7e23703.png" - }, - { - "url": "uploads/TI_63_8e5ec859d8.png" - } - ], - "logo": null - } - ] - }, - { - "id": "19", - "name": "onboarding.weather.05", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Módulo meteorológico" - }, - "simple": [ - { - "body": "# Colocar el abrigo meteorológico\n\nInserta la placa del sensor meteorológico en el abrigo meteorológico. Adjunta la placa al brazo.", - "images": [ - { - "url": "uploads/TI_36_9cae5fda4b.png" - }, - { - "url": "uploads/TI_37_d407eb532d.png" - }, - { - "url": "uploads/TI_64_69d61032ed.png" - } - ], - "logo": null - } - ] - }, - { - "id": "20", - "name": "onboarding.weather.06", - "locale": "en_US", - "forward": "Completar configuración", - "skip": "", - "guide_title": "¿Necesitas más ayuda? Ver el Manual del producto", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station/#weather-module-setup", - "header": { - "title": "Configurar", - "subtitle": "Módulo meteorológico" - }, - "simple": [ - { - "body": "# Adjuntar a la estación\n\nAsegúrate de que el otro extremo del cable CAT5 se inserte de forma segura en la placa de módulo meteorológico.\n\n## Visita FieldKit.Org/Product-Guide/Set-Up-Station/#Weather-Module-Setup para instrucciones sobre la colocación de los instrumentos, gestión de cables y exploración de soluciones de montaje. ", - "images": [ - { - "url": "uploads/TI_38_5c371cef29.png" - }, - { - "url": "uploads/TI_39_bdd7faffff.png" - }, - { - "url": "uploads/TI_65_2d924591e9.png" - } - ], - "logo": null - } - ] - }, - { - "id": "21", - "name": "onboarding.water.ph.01", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "pH" - }, - "simple": [ - { - "body": "# ¿Tienes todo?\n\nToma la sonda de pH.\n\n## La placa del módulo de pH ya debería estar conectada a la estación.\n\n## Antes de calibrarlos, examina la placa del módulo y el cable de la sonda en busca de una calcomanía de identificación de calibración (CAL ID). Todos los pares de sonda y placa del módulo que tienen el mismo CAL ID ya han sido calibrados juntos en el laboratorio y no tienes que calibrarlos antes de su uso inicial. Además, si tienes varias sondas del mismo tipo, asegúrate de hacer coincidir el número de CAL ID en el cable de la sonda y la placa del módulo al configurar la estación.", - "images": [ - { - "url": "uploads/TI_41_ee59861b57.png" - }, - { - "url": "uploads/TI_40_c5a6a2624f.png" - } - ], - "logo": null - } - ] - }, - { - "id": "22", - "name": "onboarding.water.ph.02", - "locale": "en_US", - "forward": "Calibrar sensores", - "skip": "", - "guide_title": "¿Necesitas más ayuda? Ver el Manual del producto", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station//#pH-module-setup", - "header": { - "title": "Configurar", - "subtitle": "pH" - }, - "simple": [ - { - "body": "# Adjuntar a la estación\n\nAtornilla el cable de la sonda de pH en la placa del módulo de pH.", - "images": [ - { - "url": "uploads/TI_42_c6bf2633fc.png" - }, - { - "url": "uploads/TI_43_e9486a789f.png" - } - ], - "logo": null - } - ] - }, - { - "id": "24", - "name": "onboarding.water.ec.01", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Conductividad" - }, - "simple": [ - { - "body": "# ¿Tienes todo?\n\nToma la sonda de conductividad.\n\n## La placa del módulo de conductividad ya debería estar conectada a la estación.\n\n## Antes de calibrarlos, examina la placa del módulo y el cable de la sonda en busca de una calcomanía de identificación de calibración (CAL ID). Todos los pares de sonda y placa del módulo que tienen el mismo CAL ID ya han sido calibrados juntos en el laboratorio y no tienes que calibrarlos antes de su uso inicial. Además, si tienes varias sondas del mismo tipo, asegúrate de hacer coincidir el número de CAL ID en el cable de la sonda y la placa del módulo al configurar la estación.", - "images": [ - { - "url": "uploads/TI_44_d448775f78.png" - }, - { - "url": "uploads/TI_45_0771d4aa64.png" - } - ], - "logo": null - } - ] - }, - { - "id": "25", - "name": "onboarding.water.ec.02", - "locale": "en_US", - "forward": "Calibrar sensores", - "skip": "", - "guide_title": "¿Necesitas más ayuda? Ver el Manual del producto", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station/#conductivity-module-setup", - "header": { - "title": "Configurar", - "subtitle": "Conductividad" - }, - "simple": [ - { - "body": "# Adjuntar a la estación\n\nAtornilla el cable de la sonda de conductividad en la placa del módulo de conductividad.", - "images": [ - { - "url": "uploads/TI_46_249a8d8dd5.png" - }, - { - "url": "uploads/TI_47_cb0eafa7a6.png" - } - ], - "logo": null - } - ] - }, - { - "id": "26", - "name": "onboarding.water.dox.01", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Oxígeno disuelto" - }, - "simple": [ - { - "body": "# ¿Tienes todo?\n\nToma la sonda de oxígeno disuelto.\n\n## La placa del módulo de oxígeno disuelto ya debería estar conectada a la estación.\n\n## Antes de calibrarlos, examina la placa del módulo y el cable de la sonda en busca de una calcomanía de identificación de calibración (CAL ID). Todos los pares de sonda y placa del módulo que tienen el mismo CAL ID ya han sido calibrados juntos en el laboratorio y no tienes que calibrarlos antes de su uso inicial. Además, si tienes varias sondas del mismo tipo, asegúrate de hacer coincidir el número de CAL ID en el cable de la sonda y la placa del módulo al configurar la estación.", - "images": [ - { - "url": "uploads/TI_48_764d104c39.png" - }, - { - "url": "uploads/TI_49_769c7512f4.png" - } - ], - "logo": null - } - ] - }, - { - "id": "27", - "name": "onboarding.water.dox.02", - "locale": "en_US", - "forward": "Calibrar sensores", - "skip": "", - "guide_title": "¿Necesitas más ayuda? Ver el Manual del producto", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station/#dissolved-oxygen-module-setup", - "header": { - "title": "Configurar", - "subtitle": "Dissolved Oxygen" - }, - "simple": [ - { - "body": "# Adjuntar a la estación\nAtornilla el cable de sonda de oxígeno disuelto en la placa de módulo de oxígeno disuelto.", - "images": [ - { - "url": "uploads/TI_50_8834adfd6d.png" - }, - { - "url": "uploads/TI_51_7245d5bf10.png" - } - ], - "logo": null - } - ] - }, - { - "id": "29", - "name": "onboarding.water.temp.01", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Temperatura del agua" - }, - "simple": [ - { - "body": "# ¿Tienes todo?\n\nToma la sonda de temperatura del agua.\n\n## La placa del módulo de temperatura del agua ya debería estar conectada a la estación.\n\n## Antes de calibrarlos, examina la placa del módulo y el cable de la sonda en busca de una calcomanía de identificación de calibración (CAL ID). Todos los pares de sonda y placa del módulo que tienen el mismo CAL ID ya han sido calibrados juntos en el laboratorio y no tienes que calibrarlos antes de su uso inicial. Además, si tienes varias sondas del mismo tipo, asegúrate de hacer coincidir el número de CAL ID en el cable de la sonda y la placa del módulo al configurar la estación.", - "images": [ - { - "url": "uploads/TI_52_6bd200df41.png" - }, - { - "url": "uploads/TI_53_bf0f0b3bd8.png" - } - ], - "logo": null - } - ] - }, - { - "id": "30", - "name": "onboarding.water.temp.02", - "locale": "en_US", - "forward": "Completar configuración", - "skip": "", - "guide_title": "¿Necesitas más ayuda? Ver el Manual del producto", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station/#water-temperature-module-setup", - "header": { - "title": "Configurar", - "subtitle": "Temperatura del agua" - }, - "simple": [ - { - "body": "# Adjuntar a la estación\n\nAtornilla el cable de la sonda de temperatura del agua en el cuadro del módulo de temperatura del agua.", - "images": [ - { - "url": "uploads/TI_54_144e3748ce.png" - }, - { - "url": "uploads/TI_55_66606bdf84.png" - } - ], - "logo": null - } - ] - }, - { - "id": "31", - "name": "onboarding.distance.01", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Distancia" - }, - "simple": [ - { - "body": "# ¿Tienes todo?\nRecoge el paquete de distancia:\n\nA) Cable CAT5\nB) Placa del sensor de distancia\nC) Telémetro ultrasónico \n\n## La placa del módulo de distancia ya debe estar conectado a tu estación.", - "images": [ - { - "url": "uploads/TI_56_69c1d0dd93.png" - }, - { - "url": "uploads/TI_57_7fc02a0769.png" - } - ], - "logo": null - } - ] - }, - { - "id": "32", - "name": "onboarding.distance.02", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Distancia" - }, - "simple": [ - { - "body": "# Insertar cable CAT5\nInserta un extremo del cable CAT5. Asegúrate de insertarlo de la forma correcta.", - "images": [ - { - "url": "uploads/TI_58_8615906cb3.png" - }, - { - "url": "uploads/TI_59_224561592e.png" - }, - { - "url": "uploads/TI_60_ad8e7789c5.png" - } - ], - "logo": null - } - ] - }, - { - "id": "33", - "name": "onboarding.distance.03", - "locale": "en_US", - "forward": "Completar configuración", - "skip": "", - "guide_title": "¿Necesitas más ayuda? Ver el Manual del producto", - "guide_url": "https://www.fieldkit.org/product-guide/set-up-station", - "header": { - "title": "Configurar", - "subtitle": "Distancia" - }, - "simple": [ - { - "body": "# Adjuntar a la estación\nAsegúrate de que el otro extremo del cable CAT5 se inserte de forma segura en la placa del módulo de distancia.", - "images": [ - { - "url": "uploads/TI_61_d487cfcc1b.png" - }, - { - "url": "uploads/TI_62_9036f44b11.png" - } - ], - "logo": null - } - ] - }, - { - "id": "34", - "name": "onboarding.weather.01", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Módulo meteorológico" - }, - "simple": [ - { - "body": "# ¿Tienes todo?\n\nRecoge el paquete meterológico:\n\n| IZQUIERDA | DERECHA |\n|----------------|------------|\n| 1. Abrigo meterólogico + brazo | 5. Anemómetro y veleta + brazo |\n| 2. Placa de sensor meteorológico | 6. Poste de instalación (a) + (b) |\n| 3. Cable CAT5 | 7. Abrazadera de manguera |\n| 4. Pluviómetro + brazo | 8. Tornillos |\n\n## La placa del módulo meteorológico ya debe estar conectado a tu estación.", - "images": [ - { - "url": "uploads/TI_26_2e8af5beca.png" - }, - { - "url": "uploads/TI_27_17f8b5ff80.png" - }, - { - "url": "uploads/TI_28_c01ec2c372.png" - } - ], - "logo": null - } - ] - }, - { - "id": "35", - "name": "onboarding.weather.02", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Módulo meteorológico" - }, - "simple": [ - { - "body": "# Insertar cable CAT5\n\nInserta un extremo del cable CAT5 en la placa del sensor meteorológico. Asegúrate de insertarlo de la forma correcta.", - "images": [ - { - "url": "uploads/TI_29_04490e357c.png" - }, - { - "url": "uploads/TI_30_fe64b4c2e8.png" - }, - { - "url": "uploads/TI_31_182d1a91b6.png" - } - ], - "logo": null - } - ] - }, - { - "id": "39", - "name": "examples.01", - "locale": "en_US", - "forward": "Avanzar", - "skip": "Saltar", - "guide_title": "Guía", - "guide_url": "https://www.google.com", - "header": { - "title": "Example Title", - "subtitle": "Example Subtitle" - }, - "simple": [ - { - "body": "# Heading\n\n## Another header\n\nParagraph of text, hello there how are you doing I hope this finds you well.\n\n| LEFT | RIGHT |\n|----------------|------------|\n| 1. Stevenson Screen + Arm | 5. Anemometer and Wind Vane + Arm |\n| 2. Weather Sensor Board | 6. Mounting Pole (a) + (b) |\n| 3. CAT5 Cable | 7. Hose Clamps |\n| 4. Rain Gauge + Arm | 8. Screws |\n\nTables don't need to line up exactly in this editor, though that makes things easier to read. The left hand side pipes are important if you're using lists. Another thing you may notice is that LEFT and RIGHT. It's annoying, but the headers are required (cause this is a table) and so we will hide them, but they're necessary for the parser we're using.", - "images": [], - "logo": null - } - ] - }, - { - "id": "40", - "name": "onboarding.water.ph.03", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "pH" - }, - "simple": [ - { - "body": "# Calibración de tres puntos\n\nAsegúrate de que tienes tres soluciones estándar de pH. Recomendamos pH 4.00, 7.00 y 10.00.", - "images": [ - { - "url": "uploads/TI_11_1_2_3_p_H_b98d65977a.png" - } - ], - "logo": null - } - ] - }, - { - "id": "41", - "name": "onboarding.water.ec.03", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Conductividad" - }, - "simple": [ - { - "body": "# Calibración de tres puntos\n\nAsegúrate de que tienes tres soluciones estándar de conductividad. Recomendamos 1.000, 10.000 y 100.000 µS/cm.", - "images": [ - { - "url": "uploads/TI_11_1_2_3_conductivity_a5568114a3.png" - } - ], - "logo": null - } - ] - }, - { - "id": "42", - "name": "onboarding.water.temp.03", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Temperatura del agua" - }, - "simple": [ - { - "body": "# Calibración de transferencia de tres puntos\nAsegúrate de que tienes 3 fuentes de temperatura y un termómetro estándar.\n\n## Recomendamos usar las siguientes fuentes en este orden: una taza de agua de hielo (0°C), aire a temperatura ambiente y una taza de agua hirviendo (100°C).", - "images": [ - { - "url": "uploads/TI_74_e5319a0c87.png" - } - ], - "logo": null - } - ] - }, - { - "id": "43", - "name": "onboarding.water.dox.03", - "locale": "en_US", - "forward": "Siguiente", - "skip": "Saltar", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Configurar", - "subtitle": "Oxígeno disuelto" - }, - "simple": [ - { - "body": "# Calibración de transferencia de tres puntos\n\nReúne una taza de agua, una bomba de aire para acuarios, mangueras y piedra de difusión de aire, y un medidor de oxígeno disuelto estándar o kit de prueba.", - "images": [ - { - "url": "uploads/TI_66_9740ee9cb4.png" - } - ], - "logo": null - } - ] - }, - { - "id": "44", - "name": "examples.02", - "locale": "en_US", - "forward": "Avanzar", - "skip": null, - "guide_title": null, - "guide_url": null, - "header": { - "title": "A", - "subtitle": "B" - }, - "simple": [ - { - "body": "\n\n![Logo](1)\n\n![Welcome](0)\n\nWorld!", - "images": [ - { - "url": "uploads/Fieldkit_Panel_04_1500px_a9dcbe9502.png" - }, - { - "url": "uploads/fieldkit_Logo_final_ac28b5ba44.png" - } - ], - "logo": null - } - ] - }, - { - "id": "45", - "name": "onboarding.00", - "locale": "en_US", - "forward": "Empezar", - "skip": "Saltar instrucciones", - "guide_title": "", - "guide_url": "", - "header": { - "title": "¡Bienvenido!", - "subtitle": null - }, - "simple": [ - { - "body": "![Logo](0:auto)\n\n![Welcome](1)\n\n# ¡Bienvenido!\n\nNuestra aplicación móvil hace que sea fácil configurar y desplegar tu estación FieldKit.", - "images": [ - { - "url": "uploads/fieldkit_Logo_final_ac28b5ba44.png" - }, - { - "url": "uploads/Fieldkit_Panel_04_1500px_a9dcbe9502.png" - } - ], - "logo": null - } - ] - }, - { - "id": "46", - "name": "examples.03", - "locale": "en_US", - "forward": "Avanzar", - "skip": null, - "guide_title": null, - "guide_url": null, - "header": { - "title": "A", - "subtitle": "B" - }, - "simple": [ - { - "body": "Hello\n\n![Dropper Image](0,1)\n\nWorld!", - "images": [ - { - "url": "uploads/Image_from_i_OS_13_1_d4f56f3f14.jpg" - }, - { - "url": "uploads/Image_from_i_OS_14_1_cb602a19a3.jpg" - } - ], - "logo": null - } - ] - }, - { - "id": "47", - "name": "onboarding.01", - "locale": "en_US", - "forward": "Continuar", - "skip": null, - "guide_title": null, - "guide_url": null, - "header": { - "title": "¿Necesitas ayuda adicional?", - "subtitle": null - }, - "simple": [ - { - "body": "Si te quedas atascado, usa nuestra Manual del producto en fieldkit.org que pasa por estos pasos (y más) con más detalle. \n\nPuedes acceder a todos nuestros recursos de soporte, incluida el Manual del producto, haciendo clic en el ? azul en la esquina superior derecha. ", - "images": [ - { - "url": "uploads/product_guide_help_icon_38aad2f330.svg" - } - ], - "logo": null - } - ] - }, - { - "id": "48", - "name": "onboarding.02", - "locale": "en_US", - "forward": "Seguir", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": null - }, - "simple": [ - { - "body": "¿Tienes todo? (1/3)\nComprueba que tienes todas las piezas necesarias para ensamblar tu estación FieldKit.\n\nNÚCLEO\nA) Placa superior \nB) Placa inferior\nC) Base de módulo\n\nSENSORES\nD) Placa(s) de módulo encontrada(s) en cada paquete de sensor", - "images": [ - { - "url": "uploads/TI_1_A_1021_150bb7fb93.png" - } - ], - "logo": null - } - ] - }, - { - "id": "49", - "name": "onboarding.03", - "locale": "en_US", - "forward": "Seguir", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": null - }, - "simple": [ - { - "body": "¿Tienes todo? (2/3)\n\nPOTENCIA\nE) Batería\nF) Cable microUSB\nG) Panel Solar + Cable (opcional)", - "images": [ - { - "url": "uploads/TI_1_B_e7c58a7039.png" - } - ], - "logo": null - } - ] - }, - { - "id": "50", - "name": "onboarding.04", - "locale": "en_US", - "forward": "Seguir", - "skip": "Saltar este paso", - "guide_title": null, - "guide_url": null, - "header": { - "title": "Ensamblar la estación", - "subtitle": null - }, - "simple": [ - { - "body": "¿Tienes todo? (3/3)\n\nCASE\nH) Caja FieldKit\nI) Paquete de placa de cableado\n\nTORNILLOS DE ESTACIÓN\nJ) Paquetes de tornillos de estación (Station Screw Packs)\n\n+ destornillador de estrella y cargador USB de pared (no incluido)", - "images": [ - { - "url": "uploads/TI_18_A_21_1022_47199fdf54.png" - } - ], - "logo": null - } - ] - } - ] - } + } } \ No newline at end of file diff --git a/test/data_sync_page_test.dart b/test/data_sync_page_test.dart index 5da038adfb58b1e90de169fe4fd485018aa221d5..50a8268affa0eaa1003b821eb7c0e2f0cc29fc17 100644 --- a/test/data_sync_page_test.dart +++ b/test/data_sync_page_test.dart @@ -7,7 +7,7 @@ import 'package:fk/sync/data_sync_page.dart'; import 'package:fk/models/known_stations_model.dart'; import 'package:fk/app_state.dart'; import 'package:fk/sync/components/connectivity_service.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:mocktail/mocktail.dart'; import 'dart:collection'; import 'package:fk/gen/api.dart'; diff --git a/test/settings_test.dart b/test/settings_test.dart index 9ccc91304de935db22379c8217c95c1ac9625963..dcee8ea72f5ab63e64e483e675a29b8ee8f5efbf 100644 --- a/test/settings_test.dart +++ b/test/settings_test.dart @@ -1,7 +1,7 @@ import 'package:fk/settings/settings_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; void main() { group('SettingsTab', () { diff --git a/test/unknown_station_page_test.dart b/test/unknown_station_page_test.dart index 64963f11b9886223a638354b75047d74c0722d13..320d3b10d16effeb6fbdd4f612cecd65e4d0508f 100644 --- a/test/unknown_station_page_test.dart +++ b/test/unknown_station_page_test.dart @@ -1,7 +1,7 @@ import 'package:fk/common_widgets.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fk/l10n/app_localizations.dart'; import 'package:fk/unknown_station_page.dart'; void main() { @@ -13,7 +13,8 @@ void main() { MaterialApp( theme: ThemeData( useMaterial3: true, - splashFactory: InkSplash.splashFactory, // Use InkSplash to avoid InkSparkle issues + splashFactory: InkSplash + .splashFactory, // Use InkSplash to avoid InkSparkle issues ), localizationsDelegates: const [AppLocalizations.delegate], home: const NoSuchStationPage(), @@ -33,7 +34,8 @@ void main() { MaterialApp( theme: ThemeData( useMaterial3: true, - splashFactory: InkSplash.splashFactory, // Use InkSplash to avoid InkSparkle issues + splashFactory: InkSplash + .splashFactory, // Use InkSplash to avoid InkSparkle issues ), localizationsDelegates: const [AppLocalizations.delegate], home: Builder(