From 97671f0d9338ff43d598b7d5ebc7b742b6f0bb03 Mon Sep 17 00:00:00 2001 From: Alberdi Date: Tue, 16 Nov 2021 19:09:42 +0000 Subject: [PATCH 01/12] Complete Spanish translations plus some fixes I've used the POEditor project to update them, this commit imports the changes directly from there. --- locale/es/LC_MESSAGES/django.mo | Bin 19516 -> 24152 bytes locale/es/LC_MESSAGES/django.po | 1075 ++++++++++++++++--------------- 2 files changed, 546 insertions(+), 529 deletions(-) diff --git a/locale/es/LC_MESSAGES/django.mo b/locale/es/LC_MESSAGES/django.mo index efdf6f38c6f06b85c2919076c251c25cde827505..4d210bef1f3363b940e9e964d9310f13e9140a73 100644 GIT binary patch literal 24152 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 NnU?>oX)&qY{{XAPI-mdm diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index fa637e3b..d2d42970 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -1,13 +1,11 @@ msgid "" msgstr "" -"Project-Id-Version: Baby Buddy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-15 15:42+0000\n" -"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" +"Project-Id-Version: Baby Buddy\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: babybuddy/admin.py:12 babybuddy/admin.py:13 @@ -31,10 +29,8 @@ msgid "Refresh rate" msgstr "Tasa de refresco" #: babybuddy/models.py:21 -msgid "" -"If supported by browser, the dashboard will only refresh when visible, and " -"also when receiving focus." -msgstr "" +msgid "This setting will only be used when a browser does not support refresh on focus." +msgstr "Este parámetro solo será utilizado en caso de que tu navegador no soporte la opción de refrescar al hacer foco." #: babybuddy/models.py:27 msgid "disabled" @@ -72,52 +68,11 @@ msgstr "15 min." msgid "30 min." msgstr "30 min." -#: babybuddy/models.py:38 -msgid "Hide Empty Dashboard Cards" -msgstr "" - -#: babybuddy/models.py:43 -msgid "Hide data older than" -msgstr "" - -#: babybuddy/models.py:44 -msgid "This setting controls which data will be shown in the dashboard." -msgstr "" - -#: babybuddy/models.py:50 -msgid "show all data" -msgstr "" - -#: babybuddy/models.py:51 -msgid "1 day" -msgstr "" - -#: babybuddy/models.py:52 -msgid "2 days" -msgstr "" - -#: babybuddy/models.py:53 -msgid "3 days" -msgstr "" - -#: babybuddy/models.py:54 -msgid "1 week" -msgstr "" - -#: babybuddy/models.py:55 -msgid "4 weeks" -msgstr "" - #: babybuddy/models.py:61 msgid "Language" msgstr "Idioma" -#: babybuddy/models.py:67 -msgid "Timezone" -msgstr "Zona horaria" - #: babybuddy/models.py:71 -#, python-brace-format msgid "{user}'s Settings" msgstr "Configuración de {user}" @@ -125,63 +80,19 @@ msgstr "Configuración de {user}" msgid "English" msgstr "Inglés" -#: babybuddy/settings/base.py:172 -msgid "Dutch" -msgstr "" - #: babybuddy/settings/base.py:173 msgid "French" msgstr "Francés" -#: babybuddy/settings/base.py:174 -msgid "Finnish" -msgstr "" - -#: babybuddy/settings/base.py:175 -msgid "German" -msgstr "Alemán" - -#: babybuddy/settings/base.py:176 -msgid "Italian" -msgstr "" - -#: babybuddy/settings/base.py:177 -msgid "Polish" -msgstr "" - -#: babybuddy/settings/base.py:178 -msgid "Portuguese" -msgstr "" - -#: babybuddy/settings/base.py:179 -msgid "Spanish" -msgstr "Español" - -#: babybuddy/settings/base.py:180 -msgid "Swedish" -msgstr "Sueco" - -#: babybuddy/settings/base.py:181 -msgid "Turkish" -msgstr "Turco" - #: babybuddy/templates/403.html:4 babybuddy/templates/403.html:7 msgid "Permission Denied" msgstr "Acceso denegado" #: babybuddy/templates/403.html:12 -msgid "" -"You do not have permission to access this resource. Contact a site " -"administrator for assistance." -msgstr "" -"No tienes permisos para acceder a este recurso. Contacta con un " -"administrador si necesitas ayuda." - -#: babybuddy/templates/admin/base_site.html:4 -#: babybuddy/templates/admin/base_site.html:7 -#: babybuddy/templates/babybuddy/nav-dropdown.html:277 -msgid "Database Admin" -msgstr "Administrar Base de Datos" +msgid "You do not have permission to access this resource.\n" +" Contact a site administrator for assistance." +msgstr "No tienes permiso para acceder a este recurso.\n" +"Contacta con un administrador si necesitas asistencia." #: babybuddy/templates/babybuddy/base.html:23 msgid "Home" @@ -206,21 +117,12 @@ msgstr "Enviar" #: babybuddy/templates/babybuddy/messages.html:18 #: babybuddy/templates/babybuddy/user_settings_form.html:19 -#, python-format msgid "Error: %(error)s" msgstr "Error: %(error)s" #: babybuddy/templates/babybuddy/messages.html:23 -#: babybuddy/templates/babybuddy/user_settings_form.html:26 -msgid "Error: Some fields have errors. See below for details." -msgstr "" -"Error: Algunos campos contienen errores. Mira más abajo " -"para más detalles." - -#: babybuddy/templates/babybuddy/nav-dropdown.html:32 -#: core/templates/core/timer_nav.html:18 -msgid "Quick Start Timer" -msgstr "Iniciar Temporizador Rápido" +msgid "Error: Some fields have errors. See below for details. " +msgstr "Error: Algunos campos contienen errores. Mira más abajo para más detalle." #: babybuddy/templates/babybuddy/nav-dropdown.html:51 core/models.py:165 #: core/models.py:169 @@ -250,18 +152,6 @@ msgstr "Nota" msgid "Sleep" msgstr "Sueño" -#: babybuddy/templates/babybuddy/nav-dropdown.html:75 -#: babybuddy/templates/babybuddy/nav-dropdown.html:158 core/models.py:363 -#: core/models.py:377 core/models.py:378 core/models.py:381 -#: core/templates/core/temperature_confirm_delete.html:7 -#: core/templates/core/temperature_form.html:13 -#: core/templates/core/temperature_list.html:4 -#: core/templates/core/temperature_list.html:7 -#: core/templates/core/temperature_list.html:12 -#: core/templates/core/temperature_list.html:29 -msgid "Temperature" -msgstr "Temperatura" - #: babybuddy/templates/babybuddy/nav-dropdown.html:81 #: babybuddy/templates/babybuddy/nav-dropdown.html:238 #: babybuddy/templates/babybuddy/welcome.html:50 core/models.py:531 @@ -291,13 +181,6 @@ msgstr "Tiempo boca a bajo" msgid "Weight" msgstr "Peso" -#: babybuddy/templates/babybuddy/nav-dropdown.html:111 -#: core/templates/timeline/timeline.html:4 -#: core/templates/timeline/timeline.html:7 -#: dashboard/templates/dashboard/child_button_group.html:9 -msgid "Timeline" -msgstr "" - #: babybuddy/templates/babybuddy/nav-dropdown.html:122 #: babybuddy/templates/babybuddy/nav-dropdown.html:130 core/models.py:105 #: core/templates/core/child_confirm_delete.html:7 @@ -330,10 +213,6 @@ msgstr "Niño" msgid "Notes" msgstr "Notas" -#: babybuddy/templates/babybuddy/nav-dropdown.html:164 -msgid "Temperature reading" -msgstr "Lectura de temperatura" - #: babybuddy/templates/babybuddy/nav-dropdown.html:178 msgid "Weight entry" msgstr "Introducir peso" @@ -401,6 +280,10 @@ msgstr "Navegador API" msgid "Users" msgstr "Usuarios" +#: babybuddy/templates/babybuddy/nav-dropdown.html:250 +msgid "Backend Admin" +msgstr "Administrar Backend" + #: babybuddy/templates/babybuddy/nav-dropdown.html:279 msgid "Support" msgstr "Soporte" @@ -471,13 +354,8 @@ msgstr "Eliminar" #: core/templates/core/timer_confirm_delete.html:17 #: core/templates/core/tummytime_confirm_delete.html:14 #: core/templates/core/weight_confirm_delete.html:14 -#, python-format -msgid "" -"

Are you sure you want to delete %(object)s?

" -msgstr "" -"

¿Estás seguro de querer eliminar %(object)s?

" +msgid "

Are you sure you want to delete %(object)s?

" +msgstr "

¿Estás seguro de querer eliminar %(object)s?

" #: babybuddy/templates/babybuddy/user_confirm_delete.html:19 #: core/templates/core/child_confirm_delete.html:32 @@ -521,7 +399,6 @@ msgstr "Actualizar" #: core/templates/core/timer_form.html:18 #: core/templates/core/tummytime_form.html:23 #: core/templates/core/weight_form.html:23 -#, python-format msgid "

Update %(object)s

" msgstr "

Actualizar %(object)s

" @@ -582,6 +459,11 @@ msgstr "Cambiar Contraseña" msgid "User Settings" msgstr "Configuración del Usuario" +#: babybuddy/templates/babybuddy/messages.html:23 +#: babybuddy/templates/babybuddy/user_settings_form.html:26 +msgid "Error: Some fields have errors. See below for details." +msgstr "Error: Algunos campos contienen errores. Mira más abajo para más detalles." + #: babybuddy/templates/babybuddy/user_settings_form.html:33 msgid "User Profile" msgstr "Perfil del Usuario" @@ -608,12 +490,10 @@ msgid "Welcome to Baby Buddy!" msgstr "¡Bienvenido a Baby Buddy!" #: babybuddy/templates/babybuddy/welcome.html:14 -msgid "" -"Learn about and predict baby's needs without (as much) guess work " -"by using Baby Buddy to track —" -msgstr "" -"Aprende a predecir las necesidades de tu bebé sin tener que adivinar " -"haciendo track con Baby Buddy —" +msgid "Learn about and predict baby's needs without\n" +" (as much) guess work by using Baby Buddy to track —" +msgstr "Aprende y predice las necesidades de tu bebé sin\n" +" tener que adivinar (tanto) usando Baby Buddy —" #: babybuddy/templates/babybuddy/welcome.html:26 core/models.py:166 #: core/templates/core/diaperchange_confirm_delete.html:7 @@ -625,20 +505,19 @@ msgstr "" msgid "Diaper Changes" msgstr "Cambios de Pañal" -#: babybuddy/templates/babybuddy/welcome.html:56 -msgid "" -"As the amount of entries grows, Baby Buddy will help parents and caregivers " -"to identify small patterns in baby's habits using the dashboard and graphs. " -"Baby Buddy is mobile-friendly and uses a dark theme to help weary moms and " -"dads with 2AM feedings and changings. To get started, just click the button " -"below to add your first (or second, third, etc.) child!" -msgstr "" -"A medida que el número de entradas crece, Baby Buddy ayudará a los padres y " -"cuidadores a identificar pequeños patrones y hábitos del bebé usando los " -"dashboards y gráficas. Baby buddy funciona en el móvil y usa un tema oscuro " -"para ayudar a los padres y madres en las tomas y cambios de las 2 de la " -"mañana. Para comenzar, haz click en el botón y añade tu primer (o segundo, o " -"tercer) hijo!" +#: babybuddy/templates/babybuddy/welcome.html:54 +msgid "As the amount of entries grows, Baby Buddy will help\n" +" parents and caregivers to identify small patterns in baby's habits\n" +" using the dashboard and graphs. Baby Buddy is mobile-friendly and\n" +" uses a dark theme to help weary moms and dads with 2AM feedings and\n" +" changings. To get started, just click the button below to add your\n" +" first (or second, third, etc.) child!" +msgstr "A medida que las entradas van aumentando, Baby Buddy ayudará\n" +" a padres y cuidadores a identificar pequeños patrones en los hábitos\n" +" del bebé usando las gráficas y el dashboard. Baby Buddy funciona en\n" +" el móvil y usa un tema oscuro para ayudar a las mamás y papás cansados\n" +" con las tomas y cambios de las 2 de la mañana. Para empezar, haz click\n" +" en el enlace más abajo para añadir tu primer (o segundo, tercero, etc.) hijo!" #: babybuddy/templates/babybuddy/welcome.html:68 #: core/templates/core/child_form.html:8 core/templates/core/child_form.html:18 @@ -670,12 +549,10 @@ msgstr "Iniciar Sesión" msgid "Password Reset" msgstr "Resetear Contraseña" -#: babybuddy/templates/registration/password_reset_confirm.html:13 -msgid "" -"Oh snap! The two passwords did not match. Please try again." -msgstr "" -"¡Vaya! Las dos contraseñas no coinciden. Por favor, " -"inténtalo otra vez." +#: babybuddy/templates/registration/password_reset_confirm.html:12 +msgid "

Oh snap! The\n" +" two passwords did not match. Please try again.

" +msgstr "

¡Vaya! Las contraseñas no coinciden. Por favor, inténtalo de nuevo.

" #: babybuddy/templates/registration/password_reset_confirm.html:22 msgid "Enter your new password in each field below." @@ -690,46 +567,41 @@ msgstr "Resetear Contraseña" msgid "Reset Email Sent" msgstr "Correo de reseteo enviado" -#: babybuddy/templates/registration/password_reset_done.html:9 -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Te hemos enviado por email las instrucciones para establecer tu contraseña, " -"si la cuenta que has introducido existe. Deberías recibirlo en breve." - -#: babybuddy/templates/registration/password_reset_done.html:15 -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si no recibes el email, asegúrate de haber introducido la dirección de " -"correo con la que te has registrado y comprueba tu carpeta de spam." +#: babybuddy/templates/registration/password_reset_done.html:8 +msgid "

We've emailed you instructions for setting your\n" +" password, if an account exists with the email you entered. You\n" +" should receive them shortly.

\n" +"

If you don't receive an email, please make sure you've\n" +" entered the address you registered with, and check your spam\n" +" folder.

" +msgstr "

Te hemos enviado instrucciones para configurar tu\n" +" contraseña, si la cuenta existe y coincide con el email introducido, \n" +" deberías recibirlas en breve.

\n" +"

Si no recibes el email, por favor comprueba que\n" +" has introducido el email con el que te has registrado y tu carpeta\n" +" de spam.

" #: babybuddy/templates/registration/password_reset_form.html:4 msgid "Forgot Password" msgstr "Contraseña Olvidada" -#: babybuddy/templates/registration/password_reset_form.html:9 -msgid "" -"Enter your account email address in the form below. If the address is valid, " -"you will receive instructions for resetting your password." -msgstr "" -"Introduce tu dirección de correo electrónico en el siguiente formulario. Si " -"la dirección es válida, recibirás instrucciones para respetar tu contraseña." +#: babybuddy/templates/registration/password_reset_form.html:8 +msgid "

Enter your account email address in the\n" +" form below. If the address is valid, you will receive instructions for\n" +" resetting your password.

" +msgstr "

Introduce tu dirección de email en el siguiente \n" +" formulario. Si la direción es valida, recibirás las instrucciones\n" +" para resetear tu contraseña.

" #: babybuddy/views.py:66 -#, python-format msgid "User %(username)s added!" msgstr "¡Se ha añadido el usuario %(username)s!" #: babybuddy/views.py:76 -#, python-format msgid "User %(username)s updated." msgstr "¡Se ha actualizado el usuario %(username)s!" #: babybuddy/views.py:88 -#, python-brace-format msgid "User {user} deleted." msgstr "Usuario {user} eliminado." @@ -826,11 +698,6 @@ msgstr "Amarillo" msgid "Color" msgstr "Color" -#: core/models.py:157 core/models.py:235 -#: core/templates/core/diaperchange_list.html:31 -msgid "Amount" -msgstr "Cantidad" - #: core/models.py:187 msgid "Wet and/or solid is required." msgstr "Se requiere mojado y/o sólido." @@ -859,14 +726,6 @@ msgstr "Leche de pecho" msgid "Formula" msgstr "Fórmula" -#: core/models.py:217 -msgid "Fortified breast milk" -msgstr "Leche de pecho fortificada" - -#: core/models.py:218 -msgid "Solid food" -msgstr "" - #: core/models.py:221 core/templates/core/feeding_list.html:30 msgid "Type" msgstr "Tipo" @@ -883,22 +742,19 @@ msgstr "Pecho izquierdo" msgid "Right breast" msgstr "Pecho derecho" -#: core/models.py:228 -msgid "Both breasts" -msgstr "Ambos pechos" - -#: core/models.py:229 -msgid "Parent fed" -msgstr "" - -#: core/models.py:230 -msgid "Self fed" -msgstr "" - #: core/models.py:233 core/templates/core/feeding_list.html:29 msgid "Method" msgstr "Método" +#: core/models.py:157 core/models.py:235 +#: core/templates/core/diaperchange_list.html:31 +msgid "Amount" +msgstr "Cantidad" + +#: core/models.py:243 +msgid "Only \"Bottle\" method is allowed with \"Formula\" type." +msgstr "Solo se permite método \"botella\" para el tipo \"Fórmula\"." + #: core/models.py:401 core/templates/core/timer_list.html:25 msgid "Name" msgstr "Nombre" @@ -917,7 +773,6 @@ msgid "Timers" msgstr "Temporizadores" #: core/models.py:440 -#, python-brace-format msgid "Timer #{id}" msgstr "Temporizador #{id}" @@ -953,9 +808,9 @@ msgstr "Nacimiento" msgid "Age" msgstr "Edad" -#: core/templates/core/child_list.html:15 -msgid "Add Child" -msgstr "Añadir Niño" +#: core/templates/timeline/_timeline.html:33 +msgid "%(since)s ago (%(time)s)" +msgstr "hace %(since)s (%(time)s)" #: core/templates/core/child_list.html:27 msgid "Birth Date" @@ -985,18 +840,14 @@ msgstr "Añadir un Cambio de Pañal" msgid "Add" msgstr "Añadir" -#: core/templates/core/diaperchange_list.html:15 -msgid "Add Diaper Change" -msgstr "Añadir Cambio de Pañal" - -#: core/templates/core/diaperchange_list.html:29 -msgid "Contents" -msgstr "" - #: core/templates/core/diaperchange_list.html:73 msgid "No diaper changes found." msgstr "No se han encontrado cambios de pañal." +#: core/templates/core/diaperchange_list.html:63 +msgid "Add a Change" +msgstr "Añadir Cambio" + #: core/templates/core/feeding_confirm_delete.html:4 msgid "Delete a Feeding" msgstr "Eliminar una Toma" @@ -1010,10 +861,6 @@ msgstr "Actualizar una Toma" msgid "Add a Feeding" msgstr "Añadir una Toma" -#: core/templates/core/feeding_list.html:15 -msgid "Add Feeding" -msgstr "Añadir Toma" - #: core/templates/core/feeding_list.html:33 msgid "Amt." msgstr "Cant." @@ -1034,10 +881,6 @@ msgstr "Actualizar una Nota" msgid "Add a Note" msgstr "Añadir una Nota" -#: core/templates/core/note_list.html:15 -msgid "Add Note" -msgstr "Añadir Nota" - #: core/templates/core/note_list.html:60 msgid "No notes found." msgstr "No se han encontrado notas." @@ -1054,22 +897,18 @@ msgstr "Actualizar Entrada de Sueño" msgid "Add a Sleep Entry" msgstr "Añadir Entrada de Sueño" -#: core/templates/core/sleep_list.html:15 -msgid "Add Sleep" -msgstr "Añadir Sueño" - #: core/templates/core/sleep_list.html:25 #: core/templates/core/timer_form.html:12 #: core/templates/core/timer_list.html:24 #: core/templates/core/tummytime_list.html:24 msgid "Start" -msgstr "Iniciar" +msgstr "Inicio" #: core/templates/core/sleep_list.html:26 #: core/templates/core/timer_list.html:30 #: core/templates/core/tummytime_list.html:25 msgid "End" -msgstr "Finalizar" +msgstr "Fin" #: core/templates/core/sleep_list.html:31 msgid "Nap" @@ -1079,45 +918,10 @@ msgstr "Siesta" msgid "No sleep entries found." msgstr "No se han encontrado entradas de sueño." -#: core/templates/core/temperature_confirm_delete.html:4 -msgid "Delete a Temperature Reading" -msgstr "Eliminar Lectura de Temperatura" - -#: core/templates/core/temperature_form.html:8 -#: core/templates/core/temperature_form.html:17 -msgid "Add a Temperature Reading" -msgstr "Añadir Lectura de Temperatura" - -#: core/templates/core/temperature_form.html:27 -msgid "Add a Temperature Entry" -msgstr "Añadir Entrada de Temperatura" - -#: core/templates/core/temperature_list.html:15 -msgid "Add Temperature Reading" -msgstr "Añadir Lectura de Temperatura" - -#: core/templates/core/temperature_list.html:66 -msgid "No temperature entries found." -msgstr "No se han encontrada registros de temperatura." - #: core/templates/core/timer_confirm_delete.html:5 -#, python-format msgid "Delete %(object)s" msgstr "Eliminar %(object)s" -#: core/templates/core/timer_confirm_delete_inactive.html:5 -msgid "Delete All Inactive Timers" -msgstr "Eliminar Todos los Temporizadores Inactivos" - -#: core/templates/core/timer_confirm_delete_inactive.html:10 -msgid "Delete Inactive" -msgstr "Eliminar Inactivo" - -#: core/templates/core/timer_confirm_delete_inactive.html:17 -#, python-format -msgid "Are you sure you want to delete %(number)s inactive timer%(plural)s?" -msgstr "" - #: core/templates/core/timer_detail.html:28 msgid "Started" msgstr "Iniciado" @@ -1126,23 +930,14 @@ msgstr "Iniciado" msgid "Stopped" msgstr "Parado" -#: core/templates/core/timer_detail.html:34 -#, python-format -msgid "%(timer)s created by %(user)s" -msgstr "%(timer)s creados por %(user)s" +#: core/templates/core/timer_detail.html:26 +msgid "%(timer)s created by %(object.user)s" +msgstr "%(timer)s creado por %(object.user)s" #: core/templates/core/timer_detail.html:63 msgid "Timer actions" msgstr "Acciones de temporizador" -#: core/templates/core/timer_detail.html:77 -msgid "Restart timer" -msgstr "" - -#: core/templates/core/timer_detail.html:84 -msgid "Delete timer" -msgstr "" - #: core/templates/core/timer_form.html:22 #: core/templates/core/timer_list.html:15 core/templates/core/timer_nav.html:23 msgid "Start Timer" @@ -1152,9 +947,10 @@ msgstr "Iniciar Temporizador" msgid "No timer entries found." msgstr "No se han encontrado temporizadores." -#: core/templates/core/timer_list.html:68 -msgid "Delete Inactive Timers" -msgstr "Eliminar Temporizadores Inactivos" +#: babybuddy/templates/babybuddy/nav-dropdown.html:32 +#: core/templates/core/timer_nav.html:18 +msgid "Quick Start Timer" +msgstr "Iniciar Temporizador Rápido" #: core/templates/core/timer_nav.html:28 msgid "View Timers" @@ -1191,10 +987,6 @@ msgstr "Actualizar entrada de Tiempo Boca Abajo" msgid "Add a Tummy Time Entry" msgstr "Añadir entrada de Tiempo Boca Abajo" -#: core/templates/core/tummytime_list.html:15 -msgid "Add Tummy Time" -msgstr "Añadir Tiempo Boca Abajo" - #: core/templates/core/tummytime_list.html:63 msgid "No tummy time entries found." msgstr "No se han encontrado entradas de tiempo boca abajo." @@ -1209,161 +1001,76 @@ msgstr "Eliminar Entrada de Peso" msgid "Add a Weight Entry" msgstr "Añadir Entrada de Peso" -#: core/templates/core/weight_list.html:15 -msgid "Add Weight" -msgstr "Añadir Peso" - #: core/templates/core/weight_list.html:66 msgid "No weight entries found." msgstr "No se han encontrado entradas de peso." -#: core/templates/timeline/_timeline.html:33 -#, python-format -msgid "%(since)s ago (%(time)s)" -msgstr "hace %(since)s (%(time)s)" - -#: core/templatetags/datetime.py:42 -msgid "Today" -msgstr "hoy" - -#: core/templatetags/datetime.py:56 -msgid "{}, {}" -msgstr "" - -#: core/templatetags/duration.py:23 -msgid "0 days" -msgstr "" - -#: core/timeline.py:43 -#, python-format -msgid "%(child)s started tummy time!" -msgstr "¡%(child)s ha empezado tiempo boca abajo!" - -#: core/timeline.py:53 -#, python-format -msgid "%(child)s finished tummy time." -msgstr "%(child)s ha finalizado tiempo boca abajo." - -#: core/timeline.py:76 -#, python-format -msgid "%(child)s fell asleep." -msgstr "%(child)s se ha dormido." - -#: core/timeline.py:86 -#, python-format -msgid "%(child)s woke up." -msgstr "%(child)s se ha despertado." - -#: core/timeline.py:119 -#, python-format -msgid "Amount: %(amount).0f" -msgstr "" +#: core/timeline.py:164 +msgid "%(child)s had a diaper change." +msgstr "%(child)s ha tenido un cambio de pañal." #: core/timeline.py:124 -#, python-format msgid "%(child)s started feeding." msgstr "%(child)s ha empezado una toma." #: core/timeline.py:135 -#, python-format msgid "%(child)s finished feeding." msgstr "%(child)s ha finalizado una toma." -#: core/timeline.py:157 -#, python-format -msgid "Contents: %(contents)s" -msgstr "" +#: core/timeline.py:76 +msgid "%(child)s fell asleep." +msgstr "%(child)s se ha dormido." -#: core/timeline.py:164 -#, python-format -msgid "%(child)s had a diaper change." -msgstr "%(child)s ha tenido un cambio de pañal." +#: core/timeline.py:86 +msgid "%(child)s woke up." +msgstr "%(child)s se ha despertado." -#: core/utils.py:15 -#, python-format -msgid "%(hours)s hour" -msgid_plural "%(hours)s hours" -msgstr[0] "%(hours)s hora" -msgstr[1] "%(hours)s horas" +#: core/timeline.py:43 +msgid "%(child)s started tummy time!" +msgstr "¡%(child)s ha empezado tiempo boca abajo!" -#: core/utils.py:22 -#, python-format -msgid "%(minutes)s minute" -msgid_plural "%(minutes)s minutes" -msgstr[0] "%(minutes)s minuto" -msgstr[1] "%(minutes)s minutos" - -#: core/utils.py:30 -#, python-format -msgid "%(seconds)s second" -msgid_plural "%(seconds)s seconds" -msgstr[0] "%(seconds)s segundo" -msgstr[1] "%(seconds)s segundos" +#: core/timeline.py:53 +msgid "%(child)s finished tummy time." +msgstr "%(child)s ha finalizado tiempo boca abajo." #: core/views.py:34 -#, python-format msgid "%(model)s entry for %(child)s added!" msgstr "¡%(model)s entrada para %(child)s añadida!" #: core/views.py:36 -#, python-format msgid "%(model)s entry added!" msgstr "¡%(model)s entrada añadida!" #: core/views.py:63 -#, python-format msgid "%(model)s entry for %(child)s updated." msgstr "%(model)s entrada para %(child)s actualizada." #: core/views.py:65 -#, python-format msgid "%(model)s entry updated." msgstr "%(model)s entrada actualizada." -#: core/views.py:75 core/views.py:126 -#, python-format -msgid "%(model)s entry deleted." -msgstr "%(model)s entradas borradas." - #: core/views.py:95 -#, python-format msgid "%(first_name)s %(last_name)s added!" msgstr "¡%(first_name)s %(last_name)s añadido!" -#: core/views.py:257 -#, python-format -msgid "%(model)s reading added!" -msgstr "%(model)s lectura añadida!" - -#: core/views.py:265 -#, python-format -msgid "%(model)s reading for %(child)s updated." -msgstr "%(model)s lectura para %(child)s actualizada." - #: core/views.py:371 -#, python-format msgid "%(timer)s stopped." msgstr "%(timer)s parado." -#: core/views.py:395 -msgid "All inactive timers deleted." -msgstr "Todos los temporizadores inactivos eliminados." - -#: core/views.py:405 -msgid "No inactive timers exist." -msgstr "No hay temporizadores inactivos." - #: dashboard/templates/cards/diaperchange_last.html:6 msgid "Last Diaper Change" -msgstr "Ultimo Cambio Pañal" +msgstr "Último Cambio Pañal" -#: dashboard/templates/cards/diaperchange_last.html:12 -#: dashboard/templates/cards/feeding_last.html:12 -#: dashboard/templates/cards/sleep_last.html:12 -#: dashboard/templates/cards/tummytime_last.html:13 -#, python-format -msgid "
%(since)s ago
%(time)s" -msgstr "" +#: dashboard/templates/cards/diaperchange_last.html:8 +#: dashboard/templates/cards/feeding_last.html:8 +#: dashboard/templates/cards/sleep_last.html:8 +#: dashboard/templates/cards/tummytime_last.html:8 +msgid "%(time)s ago" +msgstr "hace %(time)s" + +#: dashboard/templates/cards/tummytime_last.html:18 +msgid "Never" +msgstr "Nunca" #: dashboard/templates/cards/diaperchange_types.html:14 msgid "Past Week" @@ -1386,55 +1093,40 @@ msgid "yesterday" msgstr "ayer" #: dashboard/templates/cards/diaperchange_types.html:42 -#, python-format msgid "%(key)s days ago" msgstr "hace %(key)s días" -#: dashboard/templates/cards/feeding_day.html:6 -msgid "Today's Feeding" -msgstr "" - -#: dashboard/templates/cards/feeding_day.html:20 -#, python-format -msgid "%(count)s feeding entries" -msgstr "" - #: dashboard/templates/cards/feeding_last.html:6 msgid "Last Feeding" -msgstr "Ultima Toma" +msgstr "Última Toma" #: dashboard/templates/cards/feeding_last_method.html:6 msgid "Last Feeding Method" -msgstr "Ultimo Método de Toma" - -#: dashboard/templates/cards/feeding_last_method.html:19 -msgid "most recent" -msgstr "most recent" - -#: dashboard/templates/cards/feeding_last_method.html:21 -#, python-format -msgid "%(n)s feeding%(plural)s ago" -msgstr "hace %(n)s toma%(plural)s" +msgstr "Último Método de Toma" #: dashboard/templates/cards/sleep_day.html:6 msgid "Today's Sleep" msgstr "Sueño Hoy" +#: dashboard/templates/cards/sleep_day.html:11 +#: dashboard/templates/cards/sleep_naps_day.html:13 +#: dashboard/templates/cards/tummytime_day.html:11 +msgid "None yet today" +msgstr "Ninguno hoy todavía" + #: dashboard/templates/cards/sleep_day.html:20 -#, python-format msgid "%(count)s sleep entries" msgstr "%(count)s entradas de sueño" -#: dashboard/templates/cards/sleep_last.html:6 -msgid "Last Sleep" -msgstr "Último sueño" +#: dashboard/templates/cards/sleep_last.html:4 +msgid "Last Slept" +msgstr "Último Sueño" #: dashboard/templates/cards/sleep_naps_day.html:6 msgid "Today's Naps" msgstr "Siestas de Hoy" #: dashboard/templates/cards/sleep_naps_day.html:12 -#, python-format msgid "%(count)s nap%(plural)s" msgstr "%(count)s siesta%(plural)s" @@ -1446,50 +1138,30 @@ msgstr "Estadísticas" msgid "Not enough data" msgstr "No hay suficientes datos" -#: dashboard/templates/cards/statistics.html:42 -msgid "No data yet" -msgstr "" - #: dashboard/templates/cards/timer_list.html:12 -#, python-format msgid "%(count)s active timer%(plural)s" msgstr "%(count)s temporizador%(plural)s activo%(plural)s" -#: dashboard/templates/cards/timer_list.html:25 -#, python-format -msgid "Started by %(user)s at %(start)s" -msgstr "Iniciado por %(user)s el %(start)s" +#: dashboard/templates/cards/timer_list.html:19 +msgid "Started by %(instance.user)s at %(start)s" +msgstr "Iniciado por %(instance.user)s a las %(start)s" #: dashboard/templates/cards/tummytime_day.html:6 msgid "Today's Tummy Time" msgstr "Tiempo Boca Abajo Hoy" #: dashboard/templates/cards/tummytime_day.html:22 -#, python-format msgid "%(duration)s at %(end)s" msgstr "%(duration)s en %(end)s" #: dashboard/templates/cards/tummytime_last.html:6 msgid "Last Tummy Time" -msgstr "Ultimo Tiempo Boca Abajo" - -#: dashboard/templates/cards/tummytime_last.html:18 -msgid "Never" -msgstr "Nunca" +msgstr "Último Tiempo Boca Abajo" #: dashboard/templates/dashboard/child_button_group.html:3 msgid "Child actions" msgstr "Acciones de niño" -#: dashboard/templates/dashboard/child_button_group.html:17 -#: reports/templates/reports/report_base.html:9 -msgid "Reports" -msgstr "Reportes" - -#: dashboard/templates/dashboard/child_button_group.html:23 -msgid "Diaper Change Amounts" -msgstr "Cantidades de Cambio de Pañal" - #: dashboard/templates/dashboard/child_button_group.html:24 #: reports/templates/reports/diaperchange_types.html:4 #: reports/templates/reports/diaperchange_types.html:8 @@ -1502,12 +1174,6 @@ msgstr "Tipos de Cambio de Pañal" msgid "Diaper Lifetimes" msgstr "Duración Pañal" -#: dashboard/templates/dashboard/child_button_group.html:26 -#: reports/templates/reports/feeding_amounts.html:4 -#: reports/templates/reports/feeding_amounts.html:8 -msgid "Feeding Amounts" -msgstr "Cantidad de Tomas" - #: dashboard/templates/dashboard/child_button_group.html:27 msgid "Feeding Durations (Average)" msgstr "Duración de Tomas (Media)" @@ -1524,18 +1190,14 @@ msgstr "Patrón de Sueño" msgid "Sleep Totals" msgstr "Totales de Sueño" -#: dashboard/templates/dashboard/child_button_group.html:30 -msgid "Tummy Time Durations (Sum)" -msgstr "" - -#: dashboard/templates/dashboard/child_button_group.html:38 -msgid "Edit" -msgstr "" - #: dashboard/templatetags/cards.py:277 msgid "Diaper change frequency" msgstr "Frecuencia de cambio de pañal" +#: dashboard/templatetags/cards.py:371 +msgid "Feeding frequency" +msgstr "Frecuencia de tomas" + #: dashboard/templatetags/cards.py:292 msgid "Average nap duration" msgstr "Duración media siesta" @@ -1556,30 +1218,6 @@ msgstr "Duración media despierto" msgid "Weight change per week" msgstr "Cambio de peso por semana" -#: dashboard/templatetags/cards.py:361 -msgid "Feeding frequency (past 3 days)" -msgstr "" - -#: dashboard/templatetags/cards.py:365 -msgid "Feeding frequency (past 2 weeks)" -msgstr "" - -#: dashboard/templatetags/cards.py:371 -msgid "Feeding frequency" -msgstr "Frecuencia de tomas" - -#: reports/graphs/diaperchange_amounts.py:27 -msgid "Diaper change amount" -msgstr "Cantidad de Cambio de Pañal" - -#: reports/graphs/diaperchange_amounts.py:36 -msgid "Diaper Change Amounts" -msgstr "Cantidades de Cambio de Pañal" - -#: reports/graphs/diaperchange_amounts.py:39 -msgid "Change amount" -msgstr "Cambiar cantidad" - #: reports/graphs/diaperchange_lifetimes.py:35 msgid "Diaper Lifetimes" msgstr "Duración Pañal" @@ -1600,18 +1238,6 @@ msgstr "Tipo de Cambio de Pañal" msgid "Number of changes" msgstr "Número de cambios" -#: reports/graphs/feeding_amounts.py:27 -msgid "Total feeding amount" -msgstr "Total cantidad toma" - -#: reports/graphs/feeding_amounts.py:36 -msgid "Total Feeding Amounts" -msgstr "Cantidad Total Tomas" - -#: reports/graphs/feeding_amounts.py:39 -msgid "Feeding amount" -msgstr "Cantidad toma" - #: reports/graphs/feeding_duration.py:36 msgid "Average duration" msgstr "Duración media" @@ -1652,42 +1278,433 @@ msgstr "Totales de Sueño" msgid "Hours of sleep" msgstr "Horas de sueño" -#: reports/graphs/tummytime_duration.py:32 -msgid "Total duration" -msgstr "" - -#: reports/graphs/tummytime_duration.py:39 -#: reports/graphs/tummytime_duration.py:53 -msgid "Number of sessions" -msgstr "" - -#: reports/graphs/tummytime_duration.py:48 -msgid "Total Tummy Time Durations" -msgstr "" - -#: reports/graphs/tummytime_duration.py:51 -msgid "Total duration (minutes)" -msgstr "" - #: reports/graphs/weight_weight.py:27 msgid "Weight" msgstr "Peso" -#: reports/templates/reports/diaperchange_amounts.html:4 -#: reports/templates/reports/diaperchange_amounts.html:8 -msgid "Diaper Amounts" -msgstr "Cantidades de Pañal" - #: reports/templates/reports/feeding_duration.html:4 #: reports/templates/reports/feeding_duration.html:8 msgid "Average Feeding Durations" msgstr "Duración Media Tomas" +#: dashboard/templates/dashboard/child_button_group.html:17 +#: reports/templates/reports/report_base.html:9 +msgid "Reports" +msgstr "Reportes" + +#: reports/templates/reports/report_base.html:19 +msgid "There is no enough data to generate this report." +msgstr "No hay suficientes datos para generar este reporte." + +#: core/models.py:228 +msgid "Both breasts" +msgstr "Ambos pechos" + +#: babybuddy/settings/base.py:175 +msgid "German" +msgstr "Alemán" + +#: babybuddy/settings/base.py:179 +msgid "Spanish" +msgstr "Español" + +#: babybuddy/settings/base.py:180 +msgid "Swedish" +msgstr "Sueco" + +#: babybuddy/settings/base.py:181 +msgid "Turkish" +msgstr "Turco" + +#: babybuddy/templates/403.html:12 +msgid "You do not have permission to access this resource. Contact a site administrator for assistance." +msgstr "No tienes permisos para acceder a este recurso. Contacta con un administrador si necesitas ayuda." + +#: babybuddy/templates/babybuddy/nav-dropdown.html:75 +#: babybuddy/templates/babybuddy/nav-dropdown.html:158 core/models.py:363 +#: core/models.py:377 core/models.py:378 core/models.py:381 +#: core/templates/core/temperature_confirm_delete.html:7 +#: core/templates/core/temperature_form.html:13 +#: core/templates/core/temperature_list.html:4 +#: core/templates/core/temperature_list.html:7 +#: core/templates/core/temperature_list.html:12 +#: core/templates/core/temperature_list.html:29 +msgid "Temperature" +msgstr "Temperatura" + +#: babybuddy/templates/babybuddy/nav-dropdown.html:164 +msgid "Temperature reading" +msgstr "Lectura de temperatura" + +#: babybuddy/templates/babybuddy/welcome.html:14 +msgid "Learn about and predict baby's needs without (as much) guess work by using Baby Buddy to track —" +msgstr "Aprende a predecir las necesidades de tu bebé sin tener que adivinar haciendo track con Baby Buddy —" + +#: babybuddy/templates/babybuddy/welcome.html:56 +msgid "As the amount of entries grows, Baby Buddy will help parents and caregivers to identify small patterns in baby's habits using the dashboard and graphs. Baby Buddy is mobile-friendly and uses a dark theme to help weary moms and dads with 2AM feedings and changings. To get started, just click the button below to add your first (or second, third, etc.) child!" +msgstr "A medida que el número de entradas crece, Baby Buddy ayudará a los padres y cuidadores a identificar pequeños patrones y hábitos del bebé usando los dashboards y gráficas. Baby Buddy funciona en el móvil y usa un tema oscuro para ayudar a los padres y madres en las tomas y cambios de las 2 de la mañana. Para comenzar, haz click en el botón y añade tu primer (o segundo, o tercer) hijo!" + +#: babybuddy/templates/registration/password_reset_confirm.html:13 +msgid "Oh snap! The two passwords did not match. Please try again." +msgstr "¡Vaya! Las dos contraseñas no coinciden. Por favor, inténtalo otra vez." + +#: babybuddy/templates/registration/password_reset_done.html:9 +msgid "We've emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly." +msgstr "Te hemos enviado por email las instrucciones para establecer tu contraseña, si la cuenta que has introducido existe. Deberías recibirlo en breve." + +#: babybuddy/templates/registration/password_reset_done.html:15 +msgid "If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder." +msgstr "Si no recibes el email, asegúrate de haber introducido la dirección de correo con la que te has registrado y comprueba tu carpeta de spam." + +#: babybuddy/templates/registration/password_reset_form.html:9 +msgid "Enter your account email address in the form below. If the address is valid, you will receive instructions for resetting your password." +msgstr "Introduce tu dirección de correo electrónico en el siguiente formulario. Si la dirección es válida, recibirás instrucciones para respetar tu contraseña." + +#: core/models.py:217 +msgid "Fortified breast milk" +msgstr "Leche de pecho fortificada" + +#: core/templates/core/temperature_confirm_delete.html:4 +msgid "Delete a Temperature Reading" +msgstr "Eliminar Lectura de Temperatura" + +#: core/templates/core/temperature_form.html:8 +#: core/templates/core/temperature_form.html:17 +msgid "Add a Temperature Reading" +msgstr "Añadir Lectura de Temperatura" + +#: core/templates/core/temperature_form.html:27 +msgid "Add a Temperature Entry" +msgstr "Añadir Entrada de Temperatura" + +#: core/templates/core/temperature_list.html:66 +msgid "No temperature entries found." +msgstr "No se han encontrada registros de temperatura." + +#: core/templates/core/timer_detail.html:34 +msgid "%(timer)s created by %(user)s" +msgstr "%(timer)s creados por %(user)s" + +#: core/utils.py:15 +msgid "%(hours)s hour" +msgid_plural "%(hours)s hours" +msgstr[0] "%(hours)s hora" +msgstr[1] "%(hours)s horas" + +#: core/utils.py:22 +msgid "%(minutes)s minute" +msgid_plural "%(minutes)s minutes" +msgstr[0] "%(minutes)s minuto" +msgstr[1] "%(minutes)s minutos" + +#: core/utils.py:30 +msgid "%(seconds)s second" +msgid_plural "%(seconds)s seconds" +msgstr[0] "%(seconds)s segundo" +msgstr[1] "%(seconds)s segundos" + +#: core/views.py:75 core/views.py:126 +msgid "%(model)s entry deleted." +msgstr "%(model)s entradas borradas." + +#: core/views.py:257 +msgid "%(model)s reading added!" +msgstr "%(model)s lectura añadida!" + +#: core/views.py:265 +msgid "%(model)s reading for %(child)s updated." +msgstr "%(model)s lectura para %(child)s actualizada." + +#: dashboard/templates/cards/timer_list.html:25 +msgid "Started by %(user)s at %(start)s" +msgstr "Iniciado por %(user)s el %(start)s" + +#: dashboard/templates/dashboard/child_button_group.html:26 +#: reports/templates/reports/feeding_amounts.html:4 +#: reports/templates/reports/feeding_amounts.html:8 +msgid "Feeding Amounts" +msgstr "Cantidad de Tomas" + +#: reports/graphs/feeding_amounts.py:27 +msgid "Total feeding amount" +msgstr "Total cantidad toma" + +#: reports/graphs/feeding_amounts.py:36 +msgid "Total Feeding Amounts" +msgstr "Cantidad Total Tomas" + +#: reports/graphs/feeding_amounts.py:39 +msgid "Feeding amount" +msgstr "Cantidad toma" + #: reports/templates/reports/report_base.html:19 msgid "There is not enough data to generate this report." msgstr "No hay suficientes datos para generar este informe." +#: babybuddy/models.py:67 +msgid "Timezone" +msgstr "Zona horaria" + +#: babybuddy/templates/admin/base_site.html:4 +#: babybuddy/templates/admin/base_site.html:7 +#: babybuddy/templates/babybuddy/nav-dropdown.html:277 +msgid "Database Admin" +msgstr "Administrar Base de Datos" + +#: core/templates/core/child_list.html:15 +msgid "Add Child" +msgstr "Añadir Niño" + +#: core/templates/core/diaperchange_list.html:15 +msgid "Add Diaper Change" +msgstr "Añadir Cambio de Pañal" + +#: core/templates/core/feeding_list.html:15 +msgid "Add Feeding" +msgstr "Añadir Toma" + +#: core/templates/core/note_list.html:15 +msgid "Add Note" +msgstr "Añadir Nota" + +#: core/templates/core/sleep_list.html:15 +msgid "Add Sleep" +msgstr "Añadir Sueño" + +#: core/templates/core/temperature_list.html:15 +msgid "Add Temperature Reading" +msgstr "Añadir Lectura de Temperatura" + +#: core/templates/core/timer_confirm_delete_inactive.html:5 +msgid "Delete All Inactive Timers" +msgstr "Eliminar Todos los Temporizadores Inactivos" + +#: core/templates/core/timer_confirm_delete_inactive.html:10 +msgid "Delete Inactive" +msgstr "Eliminar Inactivo" + +#: core/templates/core/timer_confirm_delete_inactive.html:17 +msgid "Are you sure you want to delete %(number)s inactive timer%(plural)s?" +msgstr "¿Está seguro de que desea eliminar %(number) temporizador%(plural)es inactivo%(plural)s?" + +#: core/templates/core/timer_list.html:68 +msgid "Delete Inactive Timers" +msgstr "Eliminar Temporizadores Inactivos" + +#: core/templates/core/tummytime_list.html:15 +msgid "Add Tummy Time" +msgstr "Añadir Tiempo Boca Abajo" + +#: core/templates/core/weight_list.html:15 +msgid "Add Weight" +msgstr "Añadir Peso" + +#: core/views.py:395 +msgid "All inactive timers deleted." +msgstr "Todos los temporizadores inactivos eliminados." + +#: core/views.py:405 +msgid "No inactive timers exist." +msgstr "No hay temporizadores inactivos." + +#: dashboard/templates/cards/feeding_last_method.html:19 +msgid "most recent" +msgstr "most recent" + +#: dashboard/templates/cards/feeding_last_method.html:21 +msgid "%(n)s feeding%(plural)s ago" +msgstr "hace %(n)s toma%(plural)s" + +#: dashboard/templates/cards/sleep_last.html:6 +msgid "Last Sleep" +msgstr "Último sueño" + +#: dashboard/templates/dashboard/child_button_group.html:23 +msgid "Diaper Change Amounts" +msgstr "Cantidades de Cambio de Pañal" + +#: reports/graphs/diaperchange_amounts.py:27 +msgid "Diaper change amount" +msgstr "Cantidad de Cambio de Pañal" + +#: reports/graphs/diaperchange_amounts.py:36 +msgid "Diaper Change Amounts" +msgstr "Cantidades de Cambio de Pañal" + +#: reports/graphs/diaperchange_amounts.py:39 +msgid "Change amount" +msgstr "Cambiar cantidad" + +#: reports/templates/reports/diaperchange_amounts.html:4 +#: reports/templates/reports/diaperchange_amounts.html:8 +msgid "Diaper Amounts" +msgstr "Cantidades de Pañal" + +#: babybuddy/models.py:21 +msgid "If supported by browser, the dashboard will only refresh when visible, and also when receiving focus." +msgstr "Si el navegador lo soporta, el dashboard sólo se refrescará cuando esté visible y recibiendo el foco." + +#: babybuddy/models.py:38 +msgid "Hide Empty Dashboard Cards" +msgstr "Ocultar tarjetas vacías del dashboard" + +#: babybuddy/models.py:43 +msgid "Hide data older than" +msgstr "Ocultar datos más antiguos que" + +#: babybuddy/models.py:44 +msgid "This setting controls which data will be shown in the dashboard." +msgstr "Esta configuración ajusta que datos serán mostrados en el dashboard." + +#: babybuddy/models.py:50 +msgid "show all data" +msgstr "mostrar todos los datos" + +#: babybuddy/models.py:51 +msgid "1 day" +msgstr "1 día" + +#: babybuddy/models.py:52 +msgid "2 days" +msgstr "2 días" + +#: babybuddy/models.py:53 +msgid "3 days" +msgstr "3 días" + +#: babybuddy/models.py:54 +msgid "1 week" +msgstr "1 semana" + +#: babybuddy/models.py:55 +msgid "4 weeks" +msgstr "4 semanas" + +#: babybuddy/settings/base.py:172 +msgid "Dutch" +msgstr "Neerlandés" + +#: babybuddy/settings/base.py:174 +msgid "Finnish" +msgstr "Finlandés" + +#: babybuddy/settings/base.py:176 +msgid "Italian" +msgstr "Italiano" + +#: babybuddy/settings/base.py:177 +msgid "Polish" +msgstr "Polaco" + +#: babybuddy/settings/base.py:178 +msgid "Portuguese" +msgstr "Portugués" + +#: babybuddy/templates/babybuddy/nav-dropdown.html:111 +#: core/templates/timeline/timeline.html:4 +#: core/templates/timeline/timeline.html:7 +#: dashboard/templates/dashboard/child_button_group.html:9 +msgid "Timeline" +msgstr "Cronología" + +#: core/models.py:218 +msgid "Solid food" +msgstr "Comida sólida" + +#: core/models.py:229 +msgid "Parent fed" +msgstr "Comió con ayuda" + +#: core/models.py:230 +msgid "Self fed" +msgstr "Comió solo" + +#: core/templates/core/diaperchange_list.html:29 +msgid "Contents" +msgstr "Contenidos" + +#: core/templates/core/timer_detail.html:77 +msgid "Restart timer" +msgstr "Reiniciar temporizador" + +#: core/templates/core/timer_detail.html:84 +msgid "Delete timer" +msgstr "Borrar temporizador" + +#: core/templatetags/datetime.py:42 +msgid "Today" +msgstr "hoy" + +#: core/templatetags/datetime.py:56 +msgid "{}, {}" +msgstr "{}, {}" + +#: core/templatetags/duration.py:23 +msgid "0 days" +msgstr "0 días" + +#: core/timeline.py:119 +msgid "Amount: %(amount).0f" +msgstr "Cantidad: %(amount).0f" + +#: core/timeline.py:157 +msgid "Contents: %(contents)s" +msgstr "Contenidos: %(contents)s" + +#: dashboard/templates/cards/diaperchange_last.html:12 +#: dashboard/templates/cards/feeding_last.html:12 +#: dashboard/templates/cards/sleep_last.html:12 +#: dashboard/templates/cards/tummytime_last.html:13 +msgid "
%(since)s ago
%(time)s" +msgstr "
hace %(since)s
%(time)s" + +#: dashboard/templates/cards/feeding_day.html:6 +msgid "Today's Feeding" +msgstr "Tomas de Hoy" + +#: dashboard/templates/cards/feeding_day.html:20 +msgid "%(count)s feeding entries" +msgstr "%(count)s entradas de tomas" + +#: dashboard/templates/cards/statistics.html:42 +msgid "No data yet" +msgstr "No hay datos todavía" + +#: dashboard/templates/dashboard/child_button_group.html:30 +msgid "Tummy Time Durations (Sum)" +msgstr "Tiempo Boca Abajo (Suma)" + +#: dashboard/templates/dashboard/child_button_group.html:38 +msgid "Edit" +msgstr "Editar" + +#: dashboard/templatetags/cards.py:361 +msgid "Feeding frequency (past 3 days)" +msgstr "Frecuenca de tomas (últimos 3 días)" + +#: dashboard/templatetags/cards.py:365 +msgid "Feeding frequency (past 2 weeks)" +msgstr "Frecuenca de tomas (últimas 2 semanas)" + +#: reports/graphs/tummytime_duration.py:32 +msgid "Total duration" +msgstr "Duración total" + +#: reports/graphs/tummytime_duration.py:39 +#: reports/graphs/tummytime_duration.py:53 +msgid "Number of sessions" +msgstr "Número de sesiones" + +#: reports/graphs/tummytime_duration.py:48 +msgid "Total Tummy Time Durations" +msgstr "Tiempo Boca Abajo Total" + +#: reports/graphs/tummytime_duration.py:51 +msgid "Total duration (minutes)" +msgstr "Duración total (minutos)" + #: reports/templates/reports/tummytime_duration.html:4 #: reports/templates/reports/tummytime_duration.html:8 msgid "Total Tummy Time Durations" -msgstr "" +msgstr "Duración Total Tiempo Boca Abajo" + From 9fd06eef4f3ad72d92879a78333f67bc6cbb19bf Mon Sep 17 00:00:00 2001 From: Christopher Charbonneau Wells <10456740+cdubz@users.noreply.github.com> Date: Fri, 19 Nov 2021 08:53:48 -0500 Subject: [PATCH 02/12] Fix Heroku deploy URL Fixed #340. --- docs/DEPLOYMENT.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 68d42f93..91bc2c78 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -45,7 +45,7 @@ python3 /app/babybuddy/manage.py clearsessions ## Heroku -[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy) +[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://dashboard.heroku.com/new?button-url=https%3A%2F%2Fgithub.com%2Fbabybuddy%2Fbabybuddy&template=https%3A%2F%2Fgithub.com%2Fbabybuddy%2Fbabybuddy) For manual deployments to Heroku without using the "deploy" button, make sure to create the following settings before pushing: @@ -188,4 +188,4 @@ and 1+ child). sudo ln -s /etc/nginx/sites-available/babybuddy /etc/nginx/sites-enabled/babybuddy sudo service nginx restart -1. That's it (hopefully)! :tada: \ No newline at end of file +1. That's it (hopefully)! :tada: From cc4e36bafdfa1b303120bb7afa0adc4d54ab28ef Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Fri, 19 Nov 2021 09:38:24 -0500 Subject: [PATCH 03/12] Update dev install procedure steps --- docs/CONTRIBUTING.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 2cf67caf..155e4990 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -85,7 +85,7 @@ documentation section: [Translation](https://docs.djangoproject.com/en/3.0/topic ### Requirements - Python 3.6+, pip, pipenv -- NodeJS 14.x and NPM 7.x +- NVM (NodeJS 14.x and NPM 7.x) - Gulp - Possibly `libpq-dev` - This is necessary if `psycopg2` can't find an appropriate prebuilt binary. @@ -96,13 +96,21 @@ documentation section: [Translation](https://docs.djangoproject.com/en/3.0/topic 1. Install required Python packages, including dev packages - pipenv install --three + pipenv install --three --dev - If this fails, install `libpq-dev` (e.g. `sudo apt install libpq-dev`) and try again. + +1. Installed Node 14.x (if necessary) + + nvm install 14 + +1. Activate Node 14.x + + nvm use 1. Install Gulp CLI - sudo npm install -g gulp-cli + npm install -g gulp-cli 1. Install required Node packages From 54a24423c07e1d6e2c0a6e8c7c7586b8655aa6e7 Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Fri, 19 Nov 2021 10:50:38 -0500 Subject: [PATCH 04/12] Fix `date` filter for models with `time` field Fixes #342 --- api/filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/filters.py b/api/filters.py index 4f6e0cdc..739dc084 100644 --- a/api/filters.py +++ b/api/filters.py @@ -4,7 +4,7 @@ from core import models class TimeFieldFilter(filters.FilterSet): - date = filters.DateFilter(field_name='date', label='Date') + date = filters.DateFilter(field_name='time__date', label='Date') date_min = filters.DateFilter(field_name='time__date', label='Min. Date', lookup_expr='gte') date_max = filters.DateFilter(field_name='time__date', label='Max. Date', From 507e0c383d6ee1bf5f4cc2922be0c074686fe281 Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Fri, 19 Nov 2021 11:14:24 -0500 Subject: [PATCH 05/12] Ensure API `OPTIONS` captures class-based filters --- api/filters.py | 72 +++++++++++++++++++++++++++++++++---------------- api/metadata.py | 2 ++ 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/api/filters.py b/api/filters.py index 739dc084..d831740d 100644 --- a/api/filters.py +++ b/api/filters.py @@ -3,64 +3,90 @@ from django_filters import rest_framework as filters from core import models -class TimeFieldFilter(filters.FilterSet): +class ChildFieldFilter(filters.FilterSet): + class Meta: + abstract = True + fields = ['child'] + + +class TimeFieldFilter(ChildFieldFilter): date = filters.DateFilter(field_name='time__date', label='Date') - date_min = filters.DateFilter(field_name='time__date', label='Min. Date', - lookup_expr='gte') date_max = filters.DateFilter(field_name='time__date', label='Max. Date', lookup_expr='lte') + date_min = filters.DateFilter(field_name='time__date', label='Min. Date', + lookup_expr='gte') + + class Meta: + abstract = True + fields = sorted(ChildFieldFilter.Meta.fields + [ + 'date', + 'date_max', + 'date_min' + ]) -class StartEndFieldFilter(filters.FilterSet): +class StartEndFieldFilter(ChildFieldFilter): end = filters.DateFilter(field_name='end__date', label='End Date') - end_min = filters.DateFilter(field_name='end__date', label='Min. End Date', - lookup_expr='gte') end_max = filters.DateFilter(field_name='end__date', label='Max. End Date', lookup_expr='lte') + end_min = filters.DateFilter(field_name='end__date', label='Min. End Date', + lookup_expr='gte') start = filters.DateFilter(field_name='start__date', label='Start Date') - start_min = filters.DateFilter(field_name='start__date', lookup_expr='gte', - label='Min. Start Date',) - start_end = filters.DateFilter(field_name='start__date', lookup_expr='lte', + start_max = filters.DateFilter(field_name='start__date', lookup_expr='lte', label='Max. End Date') + start_min = filters.DateFilter(field_name='start__date', lookup_expr='gte', + label='Min. Start Date') + + class Meta: + abstract = True + fields = sorted(ChildFieldFilter.Meta.fields + [ + 'end', + 'end_max', + 'end_min', + 'start', + 'start_max', + 'start_min' + ]) class DiaperChangeFilter(TimeFieldFilter): - class Meta: + class Meta(TimeFieldFilter.Meta): model = models.DiaperChange - fields = ['child', 'wet', 'solid', 'color', 'amount'] + fields = sorted(TimeFieldFilter.Meta.fields + [ + 'wet', + 'solid', + 'color', + 'amount' + ]) class FeedingFilter(StartEndFieldFilter): - class Meta: + class Meta(StartEndFieldFilter.Meta): model = models.Feeding - fields = ['child', 'type', 'method'] + fields = sorted(StartEndFieldFilter.Meta.fields + ['type', 'method']) class NoteFilter(TimeFieldFilter): - class Meta: + class Meta(TimeFieldFilter.Meta): model = models.Note - fields = ['child'] class SleepFilter(StartEndFieldFilter): - class Meta: + class Meta(StartEndFieldFilter.Meta): model = models.Sleep - fields = ['child'] class TemperatureFilter(TimeFieldFilter): - class Meta: + class Meta(TimeFieldFilter.Meta): model = models.Temperature - fields = ['child'] class TimerFilter(StartEndFieldFilter): - class Meta: + class Meta(StartEndFieldFilter.Meta): model = models.Timer - fields = ['child', 'active', 'user'] + fields = sorted(StartEndFieldFilter.Meta.fields + ['active', 'user']) class TummyTimeFilter(StartEndFieldFilter): - class Meta: + class Meta(StartEndFieldFilter.Meta): model = models.TummyTime - fields = ['child'] diff --git a/api/metadata.py b/api/metadata.py index 760b08da..d4403762 100644 --- a/api/metadata.py +++ b/api/metadata.py @@ -11,4 +11,6 @@ class APIMetadata(metadata.SimpleMetadata): data.pop('description') if hasattr(view, 'filterset_fields'): data.update({'filters': view.filterset_fields}) + elif hasattr(view, 'filterset_class'): + data.update({'filters': view.filterset_class.Meta.fields}) return data From 828e9ffa3f050422360f1a2f5fc82b9baf750c4f Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Fri, 19 Nov 2021 11:17:09 -0500 Subject: [PATCH 06/12] Update OpenAPI schema doc --- openapi-schema.yml | 792 ++++++++++++++++++++++----------------------- 1 file changed, 396 insertions(+), 396 deletions(-) diff --git a/openapi-schema.yml b/openapi-schema.yml index 79f8bf80..df1b37a8 100644 --- a/openapi-schema.yml +++ b/openapi-schema.yml @@ -250,24 +250,18 @@ paths: description: The initial index from which to return the results. schema: type: integer + - name: amount + required: false + in: query + description: amount + schema: + type: string - name: child required: false in: query description: child schema: type: string - - name: wet - required: false - in: query - description: wet - schema: - type: string - - name: solid - required: false - in: query - description: solid - schema: - type: string - name: color required: false in: query @@ -279,28 +273,34 @@ paths: - brown - green - yellow - - name: amount - required: false - in: query - description: amount - schema: - type: string - name: date required: false in: query description: Date schema: type: string + - name: date_max + required: false + in: query + description: Max. Date + schema: + type: string - name: date_min required: false in: query description: Min. Date schema: type: string - - name: date_max + - name: solid required: false in: query - description: Max. Date + description: solid + schema: + type: string + - name: wet + required: false + in: query + description: wet schema: type: string responses: @@ -365,24 +365,18 @@ paths: description: A unique integer value identifying this Diaper Change. schema: type: string + - name: amount + required: false + in: query + description: amount + schema: + type: string - name: child required: false in: query description: child schema: type: string - - name: wet - required: false - in: query - description: wet - schema: - type: string - - name: solid - required: false - in: query - description: solid - schema: - type: string - name: color required: false in: query @@ -394,28 +388,34 @@ paths: - brown - green - yellow - - name: amount - required: false - in: query - description: amount - schema: - type: string - name: date required: false in: query description: Date schema: type: string + - name: date_max + required: false + in: query + description: Max. Date + schema: + type: string - name: date_min required: false in: query description: Min. Date schema: type: string - - name: date_max + - name: solid required: false in: query - description: Max. Date + description: solid + schema: + type: string + - name: wet + required: false + in: query + description: wet schema: type: string responses: @@ -437,24 +437,18 @@ paths: description: A unique integer value identifying this Diaper Change. schema: type: string + - name: amount + required: false + in: query + description: amount + schema: + type: string - name: child required: false in: query description: child schema: type: string - - name: wet - required: false - in: query - description: wet - schema: - type: string - - name: solid - required: false - in: query - description: solid - schema: - type: string - name: color required: false in: query @@ -466,28 +460,34 @@ paths: - brown - green - yellow - - name: amount - required: false - in: query - description: amount - schema: - type: string - name: date required: false in: query description: Date schema: type: string + - name: date_max + required: false + in: query + description: Max. Date + schema: + type: string - name: date_min required: false in: query description: Min. Date schema: type: string - - name: date_max + - name: solid required: false in: query - description: Max. Date + description: solid + schema: + type: string + - name: wet + required: false + in: query + description: wet schema: type: string requestBody: @@ -520,24 +520,18 @@ paths: description: A unique integer value identifying this Diaper Change. schema: type: string + - name: amount + required: false + in: query + description: amount + schema: + type: string - name: child required: false in: query description: child schema: type: string - - name: wet - required: false - in: query - description: wet - schema: - type: string - - name: solid - required: false - in: query - description: solid - schema: - type: string - name: color required: false in: query @@ -549,28 +543,34 @@ paths: - brown - green - yellow - - name: amount - required: false - in: query - description: amount - schema: - type: string - name: date required: false in: query description: Date schema: type: string + - name: date_max + required: false + in: query + description: Max. Date + schema: + type: string - name: date_min required: false in: query description: Min. Date schema: type: string - - name: date_max + - name: solid required: false in: query - description: Max. Date + description: solid + schema: + type: string + - name: wet + required: false + in: query + description: wet schema: type: string responses: @@ -601,17 +601,24 @@ paths: description: child schema: type: string - - name: type + - name: end required: false in: query - description: type + description: End Date + schema: + type: string + - name: end_max + required: false + in: query + description: Max. End Date + schema: + type: string + - name: end_min + required: false + in: query + description: Min. End Date schema: type: string - enum: - - breast milk - - formula - - fortified breast milk - - solid food - name: method required: false in: query @@ -625,42 +632,35 @@ paths: - both breasts - parent fed - self fed - - name: end - required: false - in: query - description: End Date - schema: - type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - - name: end_max - required: false - in: query - description: Max. End Date - schema: - type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end + - name: type required: false in: query - description: Max. End Date + description: type schema: type: string + enum: + - breast milk + - formula + - fortified breast milk + - solid food responses: '200': content: @@ -729,17 +729,24 @@ paths: description: child schema: type: string - - name: type + - name: end required: false in: query - description: type + description: End Date + schema: + type: string + - name: end_max + required: false + in: query + description: Max. End Date + schema: + type: string + - name: end_min + required: false + in: query + description: Min. End Date schema: type: string - enum: - - breast milk - - formula - - fortified breast milk - - solid food - name: method required: false in: query @@ -753,42 +760,35 @@ paths: - both breasts - parent fed - self fed - - name: end - required: false - in: query - description: End Date - schema: - type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - - name: end_max - required: false - in: query - description: Max. End Date - schema: - type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end + - name: type required: false in: query - description: Max. End Date + description: type schema: type: string + enum: + - breast milk + - formula + - fortified breast milk + - solid food responses: '200': content: @@ -814,17 +814,24 @@ paths: description: child schema: type: string - - name: type + - name: end required: false in: query - description: type + description: End Date + schema: + type: string + - name: end_max + required: false + in: query + description: Max. End Date + schema: + type: string + - name: end_min + required: false + in: query + description: Min. End Date schema: type: string - enum: - - breast milk - - formula - - fortified breast milk - - solid food - name: method required: false in: query @@ -838,42 +845,35 @@ paths: - both breasts - parent fed - self fed - - name: end - required: false - in: query - description: End Date - schema: - type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - - name: end_max - required: false - in: query - description: Max. End Date - schema: - type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end + - name: type required: false in: query - description: Max. End Date + description: type schema: type: string + enum: + - breast milk + - formula + - fortified breast milk + - solid food requestBody: content: application/json: @@ -910,17 +910,24 @@ paths: description: child schema: type: string - - name: type + - name: end required: false in: query - description: type + description: End Date + schema: + type: string + - name: end_max + required: false + in: query + description: Max. End Date + schema: + type: string + - name: end_min + required: false + in: query + description: Min. End Date schema: type: string - enum: - - breast milk - - formula - - fortified breast milk - - solid food - name: method required: false in: query @@ -934,42 +941,35 @@ paths: - both breasts - parent fed - self fed - - name: end - required: false - in: query - description: End Date - schema: - type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - - name: end_max - required: false - in: query - description: Max. End Date - schema: - type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end + - name: type required: false in: query - description: Max. End Date + description: type schema: type: string + enum: + - breast milk + - formula + - fortified breast milk + - solid food responses: '204': description: '' @@ -1004,18 +1004,18 @@ paths: description: Date schema: type: string - - name: date_min - required: false - in: query - description: Min. Date - schema: - type: string - name: date_max required: false in: query description: Max. Date schema: type: string + - name: date_min + required: false + in: query + description: Min. Date + schema: + type: string responses: '200': content: @@ -1090,18 +1090,18 @@ paths: description: Date schema: type: string - - name: date_min - required: false - in: query - description: Min. Date - schema: - type: string - name: date_max required: false in: query description: Max. Date schema: type: string + - name: date_min + required: false + in: query + description: Min. Date + schema: + type: string responses: '200': content: @@ -1133,18 +1133,18 @@ paths: description: Date schema: type: string - - name: date_min - required: false - in: query - description: Min. Date - schema: - type: string - name: date_max required: false in: query description: Max. Date schema: type: string + - name: date_min + required: false + in: query + description: Min. Date + schema: + type: string requestBody: content: application/json: @@ -1187,18 +1187,18 @@ paths: description: Date schema: type: string - - name: date_min - required: false - in: query - description: Min. Date - schema: - type: string - name: date_max required: false in: query description: Max. Date schema: type: string + - name: date_min + required: false + in: query + description: Min. Date + schema: + type: string responses: '204': description: '' @@ -1233,36 +1233,36 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end - required: false - in: query - description: Max. End Date - schema: - type: string responses: '200': content: @@ -1337,36 +1337,36 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end - required: false - in: query - description: Max. End Date - schema: - type: string responses: '200': content: @@ -1398,36 +1398,36 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end - required: false - in: query - description: Max. End Date - schema: - type: string requestBody: content: application/json: @@ -1470,36 +1470,36 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end - required: false - in: query - description: Max. End Date - schema: - type: string responses: '204': description: '' @@ -1534,18 +1534,18 @@ paths: description: Date schema: type: string - - name: date_min - required: false - in: query - description: Min. Date - schema: - type: string - name: date_max required: false in: query description: Max. Date schema: type: string + - name: date_min + required: false + in: query + description: Min. Date + schema: + type: string responses: '200': content: @@ -1620,18 +1620,18 @@ paths: description: Date schema: type: string - - name: date_min - required: false - in: query - description: Min. Date - schema: - type: string - name: date_max required: false in: query description: Max. Date schema: type: string + - name: date_min + required: false + in: query + description: Min. Date + schema: + type: string responses: '200': content: @@ -1663,18 +1663,18 @@ paths: description: Date schema: type: string - - name: date_min - required: false - in: query - description: Min. Date - schema: - type: string - name: date_max required: false in: query description: Max. Date schema: type: string + - name: date_min + required: false + in: query + description: Min. Date + schema: + type: string requestBody: content: application/json: @@ -1717,18 +1717,18 @@ paths: description: Date schema: type: string - - name: date_min - required: false - in: query - description: Min. Date - schema: - type: string - name: date_max required: false in: query description: Max. Date schema: type: string + - name: date_min + required: false + in: query + description: Min. Date + schema: + type: string responses: '204': description: '' @@ -1751,22 +1751,16 @@ paths: description: The initial index from which to return the results. schema: type: integer - - name: child - required: false - in: query - description: child - schema: - type: string - name: active required: false in: query description: active schema: type: string - - name: user + - name: child required: false in: query - description: user + description: child schema: type: string - name: end @@ -1775,34 +1769,40 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end + - name: user required: false in: query - description: Max. End Date + description: user schema: type: string responses: @@ -1867,22 +1867,16 @@ paths: description: A unique integer value identifying this Timer. schema: type: string - - name: child - required: false - in: query - description: child - schema: - type: string - name: active required: false in: query description: active schema: type: string - - name: user + - name: child required: false in: query - description: user + description: child schema: type: string - name: end @@ -1891,34 +1885,40 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end + - name: user required: false in: query - description: Max. End Date + description: user schema: type: string responses: @@ -1940,22 +1940,16 @@ paths: description: A unique integer value identifying this Timer. schema: type: string - - name: child - required: false - in: query - description: child - schema: - type: string - name: active required: false in: query description: active schema: type: string - - name: user + - name: child required: false in: query - description: user + description: child schema: type: string - name: end @@ -1964,34 +1958,40 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end + - name: user required: false in: query - description: Max. End Date + description: user schema: type: string requestBody: @@ -2024,22 +2024,16 @@ paths: description: A unique integer value identifying this Timer. schema: type: string - - name: child - required: false - in: query - description: child - schema: - type: string - name: active required: false in: query description: active schema: type: string - - name: user + - name: child required: false in: query - description: user + description: child schema: type: string - name: end @@ -2048,34 +2042,40 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end + - name: user required: false in: query - description: Max. End Date + description: user schema: type: string responses: @@ -2112,36 +2112,36 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end - required: false - in: query - description: Max. End Date - schema: - type: string responses: '200': content: @@ -2216,36 +2216,36 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end - required: false - in: query - description: Max. End Date - schema: - type: string responses: '200': content: @@ -2277,36 +2277,36 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end - required: false - in: query - description: Max. End Date - schema: - type: string requestBody: content: application/json: @@ -2349,36 +2349,36 @@ paths: description: End Date schema: type: string - - name: end_min - required: false - in: query - description: Min. End Date - schema: - type: string - name: end_max required: false in: query description: Max. End Date schema: type: string + - name: end_min + required: false + in: query + description: Min. End Date + schema: + type: string - name: start required: false in: query description: Start Date schema: type: string + - name: start_max + required: false + in: query + description: Max. End Date + schema: + type: string - name: start_min required: false in: query description: Min. Start Date schema: type: string - - name: start_end - required: false - in: query - description: Max. End Date - schema: - type: string responses: '204': description: '' From 2fea4c880600d21ef230e3986f8c3744e79a1721 Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Fri, 19 Nov 2021 11:39:15 -0500 Subject: [PATCH 07/12] Move CI deploy steps conditional to job level --- .github/workflows/ci.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3409c563..706b1ab3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,13 +61,10 @@ jobs: deploy: needs: test runs-on: ubuntu-latest - env: - DEPLOY_DEMO: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} steps: - - if: ${{ env.DEPLOY_DEMO }} - uses: actions/checkout@v2 - - if: ${{ env.DEPLOY_DEMO }} - name: Deploy demo + - uses: actions/checkout@v2 + - name: Deploy demo uses: akhileshns/heroku-deploy@v3.12.12 with: heroku_api_key: ${{ secrets.HEROKU_API_KEY }} From 462459964cbaa14e3c402e91452e6f134494671c Mon Sep 17 00:00:00 2001 From: Marcelino Alberdi Pereira Date: Sat, 20 Nov 2021 18:41:15 +0100 Subject: [PATCH 08/12] Add notes to child timeline --- core/timeline.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/core/timeline.py b/core/timeline.py index 28a82367..7bfe6196 100644 --- a/core/timeline.py +++ b/core/timeline.py @@ -3,7 +3,7 @@ from django.urls import reverse from django.utils import timezone, timesince from django.utils.translation import gettext as _ -from core.models import DiaperChange, Feeding, Sleep, TummyTime +from core.models import DiaperChange, Feeding, Note, Sleep, TummyTime from datetime import timedelta @@ -22,6 +22,7 @@ def get_objects(date, child=None): _add_feedings(min_date, max_date, events, child) _add_sleeps(min_date, max_date, events, child) _add_tummy_times(min_date, max_date, events, child) + _add_notes(min_date, max_date, events, child) events.sort(key=lambda x: x['time'], reverse=True) @@ -169,3 +170,18 @@ def _add_diaper_changes(min_date, max_date, events, child): args=[instance.id]), 'model_name': instance.model_name }) + + +def _add_notes(min_date, max_date, events, child): + instances = Note.objects.filter( + time__range=(min_date, max_date)).order_by('-time') + if child: + instances = instances.filter(child=child) + for instance in instances: + events.append({ + 'time': timezone.localtime(instance.time), + 'details': [instance.note], + 'edit_link': reverse('core:note-update', + args=[instance.id]), + 'model_name': instance.model_name + }) From c28620b3d8f66b37f25e13e312b37293126f3afa Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Sun, 28 Nov 2021 14:02:23 -0500 Subject: [PATCH 09/12] Activate and deactivate user language in middleware Fixes #346 --- babybuddy/middleware.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/babybuddy/middleware.py b/babybuddy/middleware.py index a00b72c7..07c1472a 100644 --- a/babybuddy/middleware.py +++ b/babybuddy/middleware.py @@ -3,7 +3,7 @@ import time import pytz from django.conf import settings -from django.utils import timezone +from django.utils import timezone, translation from django.conf.locale.en import formats as formats_en_us @@ -47,10 +47,20 @@ class UserLanguageMiddleware: def __call__(self, request): user = request.user - if hasattr(user, 'settings') and user.settings.language == 'en-US': - update_en_us_date_formats() + if hasattr(user, 'settings'): + # Set the custom user language before generating the response. + translation.activate(user.settings.language) - return self.get_response(request) + if user.settings.language == 'en-US': + update_en_us_date_formats() + + response = self.get_response(request) + + # Deactivate the translation before the response is sent so it not + # reused in other threads. + translation.deactivate() + + return response class UserTimezoneMiddleware: From 0250faec6eee9e94d30e2dad5005ad718d7674ef Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Sun, 28 Nov 2021 14:05:56 -0500 Subject: [PATCH 10/12] Ensure "settings saved" is translated (#346) --- babybuddy/views.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/babybuddy/views.py b/babybuddy/views.py index 8f3bb44e..c9e41be1 100644 --- a/babybuddy/views.py +++ b/babybuddy/views.py @@ -6,6 +6,7 @@ from django.contrib.auth.models import User from django.contrib.messages.views import SuccessMessageMixin from django.shortcuts import redirect, render from django.urls import reverse, reverse_lazy +from django.utils import translation from django.utils.text import format_lazy from django.utils.translation import gettext as _, gettext_lazy from django.views.generic import View @@ -144,7 +145,9 @@ class UserSettings(LoginRequiredMixin, View): user_settings = form_settings.save(commit=False) user.settings = user_settings user.save() + translation.activate(user.settings.language) messages.success(request, _('Settings saved!')) + translation.deactivate() return set_language(request) return render(request, self.template_name, { 'user_form': form_user, From 4920f4341b3443f53652cd5f1e303a15ffae33ae Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Sun, 28 Nov 2021 14:18:00 -0500 Subject: [PATCH 11/12] Use request language code when available (#346) Enables translation on the login page. --- babybuddy/middleware.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/babybuddy/middleware.py b/babybuddy/middleware.py index 07c1472a..757eca4e 100644 --- a/babybuddy/middleware.py +++ b/babybuddy/middleware.py @@ -47,13 +47,20 @@ class UserLanguageMiddleware: def __call__(self, request): user = request.user - if hasattr(user, 'settings'): - # Set the custom user language before generating the response. - translation.activate(user.settings.language) + if hasattr(user, 'settings') and user.settings.language: + language = user.settings.language + elif request.LANGUAGE_CODE: + language = request.LANGUAGE_CODE + else: + language = settings.LANGUAGE_CODE - if user.settings.language == 'en-US': + if language: + if language == 'en-US': update_en_us_date_formats() + # Set the language before generating the response. + translation.activate(language) + response = self.get_response(request) # Deactivate the translation before the response is sent so it not From d532c5714287745505fe3643212acd5bb967140e Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Sun, 28 Nov 2021 14:34:15 -0500 Subject: [PATCH 12/12] Update Heroku runtime --- runtime.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime.txt b/runtime.txt index 150c4ab8..3fccded6 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.9.8 \ No newline at end of file +python-3.9.9 \ No newline at end of file