diff --git a/assets/icons/apple.svg b/assets/icons/apple.svg
new file mode 100644
index 00000000..987a839b
--- /dev/null
+++ b/assets/icons/apple.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/arrow.svg b/assets/icons/arrow.svg
new file mode 100644
index 00000000..6ea3765b
--- /dev/null
+++ b/assets/icons/arrow.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/arrow_down.svg b/assets/icons/arrow_down.svg
new file mode 100644
index 00000000..2101088f
--- /dev/null
+++ b/assets/icons/arrow_down.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/bread.svg b/assets/icons/bread.svg
new file mode 100644
index 00000000..c5e28365
--- /dev/null
+++ b/assets/icons/bread.svg
@@ -0,0 +1,19 @@
+
diff --git a/assets/icons/broccoli.svg b/assets/icons/broccoli.svg
new file mode 100644
index 00000000..e694e5a3
--- /dev/null
+++ b/assets/icons/broccoli.svg
@@ -0,0 +1,18 @@
+
diff --git a/assets/icons/close_button.svg b/assets/icons/close_button.svg
new file mode 100644
index 00000000..df54d212
--- /dev/null
+++ b/assets/icons/close_button.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/cocktail.svg b/assets/icons/cocktail.svg
new file mode 100644
index 00000000..5e0b7e93
--- /dev/null
+++ b/assets/icons/cocktail.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/icons/comment2.svg b/assets/icons/comment2.svg
new file mode 100644
index 00000000..de57faf3
--- /dev/null
+++ b/assets/icons/comment2.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/complain.svg b/assets/icons/complain.svg
new file mode 100644
index 00000000..c6ef0cf4
--- /dev/null
+++ b/assets/icons/complain.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/copy2.svg b/assets/icons/copy2.svg
new file mode 100644
index 00000000..5049a094
--- /dev/null
+++ b/assets/icons/copy2.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/icons/eye.svg b/assets/icons/eye.svg
new file mode 100644
index 00000000..9e56e334
--- /dev/null
+++ b/assets/icons/eye.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/heart.svg b/assets/icons/heart.svg
new file mode 100644
index 00000000..b0e7a93d
--- /dev/null
+++ b/assets/icons/heart.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/meat2.svg b/assets/icons/meat2.svg
new file mode 100644
index 00000000..d8c25b41
--- /dev/null
+++ b/assets/icons/meat2.svg
@@ -0,0 +1,29 @@
+
diff --git a/assets/icons/more_button.svg b/assets/icons/more_button.svg
new file mode 100644
index 00000000..d22c4b4a
--- /dev/null
+++ b/assets/icons/more_button.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/people.svg b/assets/icons/people.svg
new file mode 100644
index 00000000..938109c1
--- /dev/null
+++ b/assets/icons/people.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/share2.svg b/assets/icons/share2.svg
new file mode 100644
index 00000000..a2eb2f77
--- /dev/null
+++ b/assets/icons/share2.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/time2.svg b/assets/icons/time2.svg
new file mode 100644
index 00000000..aefa127b
--- /dev/null
+++ b/assets/icons/time2.svg
@@ -0,0 +1,3 @@
+
diff --git a/lib/app_router.dart b/lib/app_router.dart
index d88156f1..6b8edb3c 100644
--- a/lib/app_router.dart
+++ b/lib/app_router.dart
@@ -7,6 +7,7 @@ import 'package:eatvio_app/features/calendar/presentation/pages/calendar_screen.
import 'package:eatvio_app/features/chat/presentation/pages/chat_screen.dart';
import 'package:eatvio_app/features/chat/presentation/pages/chat_select_screen.dart';
import 'package:eatvio_app/features/chat/presentation/pages/photo_view_screen.dart';
+import 'package:eatvio_app/features/complaining/presentation/complaining_screen.dart';
import 'package:eatvio_app/features/consultant/become_consultant/presentation/pages/become_consultant_screen.dart';
import 'package:eatvio_app/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart';
import 'package:eatvio_app/features/diary/presentation/pages/diary_screen.dart';
@@ -274,6 +275,11 @@ class AppRouter {
index: int.parse(state.pathParameters['index']!),
),
),
+ GoRoute(
+ path: '/complaining-screen',
+ name: 'complainingScreen',
+ builder: (context, state) => ComplainingScreen(),
+ ),
],
);
}
diff --git a/lib/core/utils/localization_utils.dart b/lib/core/utils/localization_utils.dart
new file mode 100644
index 00000000..23d846a0
--- /dev/null
+++ b/lib/core/utils/localization_utils.dart
@@ -0,0 +1,43 @@
+import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+
+String getLocalizedMeasurementUnits(S s, Portion portion) {
+ switch (portion) {
+ case Portion.GRAMS:
+ return s.gr;
+ case Portion.MILLILITERS:
+ return s.milliliter;
+ case Portion.PCS:
+ return s.pcs;
+ }
+}
+
+String getDayForm(int number, S s) {
+ if (number % 100 >= 11 && number % 100 <= 14) {
+ return s.days;
+ }
+
+ int lastDigit = number % 10;
+ if (lastDigit == 1) {
+ return s.day.toLowerCase();
+ } else if (lastDigit >= 2 && lastDigit <= 4) {
+ return s.another_form_of_day;
+ } else {
+ return s.days;
+ }
+}
+
+String getCommentForm(int number, S s) {
+ if (number % 100 >= 11 && number % 100 <= 14) {
+ return s.comments_plural;
+ }
+
+ int lastDigit = number % 10;
+ if (lastDigit == 1) {
+ return s.comment;
+ } else if (lastDigit >= 2 && lastDigit <= 4) {
+ return s.another_form_of_comment;
+ } else {
+ return s.comments_plural;
+ }
+}
diff --git a/lib/core/utils/string_extentions.dart b/lib/core/utils/string_extentions.dart
new file mode 100644
index 00000000..4d0e5173
--- /dev/null
+++ b/lib/core/utils/string_extentions.dart
@@ -0,0 +1,9 @@
+
+
+
+extension Capitalization on String {
+
+ String capitalize() {
+ return "${this[0].toUpperCase()}${substring(1).toLowerCase()}";
+ }
+}
\ No newline at end of file
diff --git a/lib/core/utils/toasts.dart b/lib/core/utils/toasts.dart
new file mode 100644
index 00000000..c949af0d
--- /dev/null
+++ b/lib/core/utils/toasts.dart
@@ -0,0 +1,15 @@
+import 'package:eatvio_app/theme/theme_helper.dart';
+import 'package:fluttertoast/fluttertoast.dart';
+
+const int _toastDuration = 2;
+
+void showInfoToast(String message) {
+ Fluttertoast.showToast(
+ msg: message,
+ toastLength: Toast.LENGTH_SHORT,
+ gravity: ToastGravity.TOP,
+ timeInSecForIosWeb: _toastDuration,
+ backgroundColor: appTheme.blueA400,
+ textColor: appTheme.whiteA700,
+ fontSize: 16.0);
+}
diff --git a/lib/core/widgets/custom_divider.dart b/lib/core/widgets/custom_divider.dart
new file mode 100644
index 00000000..f6635d53
--- /dev/null
+++ b/lib/core/widgets/custom_divider.dart
@@ -0,0 +1,14 @@
+import 'package:eatvio_app/theme/theme_helper.dart';
+import 'package:flutter/material.dart';
+
+class CustomDivider extends StatelessWidget {
+ const CustomDivider({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Divider(
+ color: appTheme.dividerColor,
+ height: 1,
+ );
+ }
+}
diff --git a/lib/features/complaining/presentation/complaining_screen.dart b/lib/features/complaining/presentation/complaining_screen.dart
new file mode 100644
index 00000000..2c3e0fd3
--- /dev/null
+++ b/lib/features/complaining/presentation/complaining_screen.dart
@@ -0,0 +1,10 @@
+import 'package:flutter/material.dart';
+
+class ComplainingScreen extends StatelessWidget {
+ const ComplainingScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return const Placeholder();
+ }
+}
\ No newline at end of file
diff --git a/lib/features/diets/presentation/pages/about_diet_screen.dart b/lib/features/diets/presentation/pages/about_diet_screen.dart
index 7dd66a37..f32d5bd9 100644
--- a/lib/features/diets/presentation/pages/about_diet_screen.dart
+++ b/lib/features/diets/presentation/pages/about_diet_screen.dart
@@ -2,17 +2,28 @@ import 'dart:io';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:eatvio_app/core/const.dart';
+import 'package:eatvio_app/core/utils/localization_utils.dart';
+import 'package:eatvio_app/core/utils/string_extentions.dart';
+import 'package:eatvio_app/core/widgets/custom_divider.dart';
+import 'package:eatvio_app/features/diets/presentation/widgets/author_card.dart';
+import 'package:eatvio_app/features/diets/presentation/widgets/cpfc_container.dart';
+import 'package:eatvio_app/features/diets/presentation/widgets/expandable_text.dart';
+import 'package:eatvio_app/features/diets/presentation/widgets/info_bouble.dart';
+import 'package:eatvio_app/features/diets/presentation/widgets/main_background_bouble.dart';
+import 'package:eatvio_app/features/diets/presentation/widgets/more_options.dart';
+import 'package:eatvio_app/features/diets/presentation/widgets/type_badges.dart';
import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
import 'package:eatvio_app/features/feed/presentation/bloc/comments_cubit/comments_cubit.dart';
import 'package:eatvio_app/features/feed/presentation/bloc/comments_cubit/comments_state.dart';
import 'package:eatvio_app/features/feed/presentation/widgets/comments_widget.dart';
+import 'package:eatvio_app/generated/l10n.dart';
import 'package:eatvio_app/locator_service.dart';
import 'package:eatvio_app/theme/theme_helper.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:flutter_html/flutter_html.dart';
-import 'package:go_router/go_router.dart';
-import 'package:rive/rive.dart';
+import 'package:flutter_portal/flutter_portal.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:rive/rive.dart' hide LinearGradient;
class AboutDietScreen extends StatefulWidget {
final Diet diet;
@@ -29,10 +40,25 @@ class AboutDietScreen extends StatefulWidget {
class _AboutDietScreenState extends State {
final CommentsCubit commentsCubit = sl();
int? replyId;
+ final ScrollController scrollController = ScrollController();
final textEditingController = TextEditingController();
+ bool isMoreOptionsVisible = false;
+
+ @override
+ void initState() {
+ super.initState();
+ scrollController.addListener(() {
+ if (isMoreOptionsVisible) {
+ setState(() {
+ isMoreOptionsVisible = false;
+ });
+ }
+ });
+ }
@override
Widget build(BuildContext context) {
+ final s = S.of(context);
return BlocProvider(
create: (BuildContext context) => commentsCubit
..getComments(
@@ -50,6 +76,7 @@ class _AboutDietScreenState extends State {
},
builder: (BuildContext context, CommentsState state) {
return Scaffold(
+ backgroundColor: appTheme.gray100,
resizeToAvoidBottomInset: true,
bottomSheet: Container(
padding: EdgeInsets.symmetric(vertical: 12) + (Platform.isIOS ? const EdgeInsets.only(bottom: 16) : EdgeInsets.zero),
@@ -61,290 +88,353 @@ class _AboutDietScreenState extends State {
),
),
),
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- SizedBox(
- width: MediaQuery.of(context).size.width - 24,
- child: FloatingActionButton.extended(
- heroTag: 'nextButtonRegistration',
- highlightElevation: 0,
- elevation: 0,
- focusElevation: 0,
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(16),
- ),
- backgroundColor: appTheme.greenA700,
- onPressed: () {},
- label: Text(
- 'Начать диету',
- style: theme.textTheme.titleSmall,
- ),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Row(
+ children: [
+ Expanded(
+ child: SizedBox(
+ child: FloatingActionButton.extended(
+ heroTag: 'nextButtonRegistration',
+ highlightElevation: 0,
+ elevation: 0,
+ focusElevation: 0,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(16),
+ ),
+ backgroundColor: appTheme.greenA700,
+ onPressed: () {},
+ label: Text(
+ s.startDiet,
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ color: appTheme.whiteA700,
+ ),
+ ),
+ ),
+ ),
+ ),
+ SizedBox(width: 8),
+ Container(
+ width: 52,
+ height: 52,
+ decoration: BoxDecoration(color: appTheme.gray50, shape: BoxShape.circle),
+ child: Icon(
+ Icons.bookmark_border_rounded,
+ color: appTheme.blueGray800,
+ size: 24,
+ ),
+ )
+ ],
),
- ),
- SizedBox(height: 8),
- Row(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- if (replyId != null)
+ SizedBox(height: 8),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ if (replyId != null)
+ GestureDetector(
+ onTap: () {
+ context.read().setReplyId(null);
+ setState(() {
+ replyId = null;
+ textEditingController.clear();
+ });
+ FocusManager.instance.primaryFocus?.unfocus();
+ },
+ child: Container(
+ decoration: BoxDecoration(
+ color: appTheme.blueA400,
+ shape: BoxShape.circle,
+ ),
+ height: 32,
+ width: 32,
+ child: Icon(
+ Icons.close_rounded,
+ size: 18,
+ color: Colors.white,
+ ),
+ ),
+ ),
+ if (replyId != null) SizedBox(width: 8),
+ Expanded(
+ child: SizedBox(
+ child: TextFormField(
+ onChanged: (_) {
+ setState(() {});
+ },
+ controller: textEditingController,
+ maxLines: 5,
+ minLines: 1,
+ keyboardType: TextInputType.multiline,
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w400,
+ color: Colors.black,
+ height: 1,
+ ),
+ decoration: InputDecoration(
+ isDense: true,
+ contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
+ hintText: s.comment.capitalize(),
+ hintStyle: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w400,
+ height: 1,
+ color: Color(0xFFAEAEB2),
+ ),
+ filled: true,
+ border: OutlineInputBorder(
+ borderRadius: BorderRadius.circular(16),
+ borderSide: BorderSide(
+ color: Color(0xFFD1D1D6),
+ width: 1,
+ ),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderRadius: BorderRadius.circular(16),
+ borderSide: BorderSide(
+ color: Color(0xFFD1D1D6),
+ width: 1,
+ ),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderRadius: BorderRadius.circular(16),
+ borderSide: BorderSide(
+ color: Color(0xFFD1D1D6),
+ width: 1,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ SizedBox(width: 8),
GestureDetector(
onTap: () {
- context.read().setReplyId(null);
- setState(() {
- replyId = null;
- textEditingController.clear();
- });
- FocusManager.instance.primaryFocus?.unfocus();
+ if (textEditingController.text.length > 2) {
+ commentsCubit.sendComment(
+ id: widget.diet.id.toString(),
+ commentText: textEditingController.text,
+ parentCommentId: replyId,
+ commentSourceType: CommentSourceType.diet,
+ );
+ context.read().setReplyId(null);
+ setState(() {
+ textEditingController.clear();
+ replyId = null;
+ });
+ FocusManager.instance.primaryFocus?.unfocus();
+ }
},
child: Container(
decoration: BoxDecoration(
- color: appTheme.blueA400,
+ color: textEditingController.text.length > 2 ? appTheme.blueA400 : appTheme.gray50,
shape: BoxShape.circle,
),
height: 32,
width: 32,
child: Icon(
- Icons.close_rounded,
+ Icons.send_rounded,
size: 18,
- color: Colors.white,
+ color: textEditingController.text.length > 2 ? appTheme.whiteA700 : appTheme.blueGray800,
),
),
),
- if (replyId != null) SizedBox(width: 8),
- SizedBox(
- width: MediaQuery.of(context).size.width - (replyId == null ? 64 : 104),
- child: TextFormField(
- onChanged: (_) {
- setState(() {});
- },
- controller: textEditingController,
- maxLines: 5,
- minLines: 1,
- keyboardType: TextInputType.multiline,
- style: TextStyle(
- fontSize: 16,
- fontWeight: FontWeight.w400,
- color: Colors.black,
- height: 1,
- ),
- decoration: InputDecoration(
- isDense: true,
- contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
- hintText: 'Комментарий',
- hintStyle: TextStyle(
- fontSize: 16,
- fontWeight: FontWeight.w400,
- height: 1,
- color: Color(0xFFAEAEB2),
- ),
- filled: true,
- border: OutlineInputBorder(
- borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
- ),
- enabledBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
- ),
- focusedBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
- ),
- ),
- ),
- ),
- SizedBox(width: 8),
- GestureDetector(
- onTap: () {
- if (textEditingController.text.length > 2) {
- commentsCubit.sendComment(
- id: widget.diet.id.toString(),
- commentText: textEditingController.text,
- parentCommentId: replyId,
- commentSourceType: CommentSourceType.diet,
- );
- context.read().setReplyId(null);
- setState(() {
- textEditingController.clear();
- replyId = null;
- });
- FocusManager.instance.primaryFocus?.unfocus();
- }
- },
- child: Container(
- decoration: BoxDecoration(
- color: textEditingController.text.length > 2 ? appTheme.blueA400 : Colors.grey,
- shape: BoxShape.circle,
- ),
- height: 32,
- width: 32,
- child: Icon(
- Icons.send_rounded,
- size: 18,
- color: Colors.white,
- ),
- ),
- ),
- ],
- ),
- ],
- ),
- ),
- appBar: AppBar(
- actions: [
- InkWell(
- borderRadius: BorderRadius.circular(16),
- onTap: () => GoRouter.of(context).pushNamed('profileScreen', extra: widget.diet.author),
- child: Ink(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- CircleAvatar(
- maxRadius: 16,
- minRadius: 16,
- backgroundImage: NetworkImage(widget.diet.author.authorProfileIcon),
- ),
- SizedBox(height: 4),
- Text(
- widget.diet.author.authorName,
- style: TextStyle(
- color: Colors.black,
- fontSize: 14,
- fontWeight: FontWeight.w400,
- height: 1,
- ),
- ),
],
),
+ ],
+ ),
+ ),
+ ),
+ appBar: AppBar(
+ centerTitle: true,
+ title: Text(
+ widget.diet.name,
+ maxLines: 2,
+ textAlign: TextAlign.center,
+ overflow: TextOverflow.ellipsis,
+ softWrap: true,
+ style: TextStyle(
+ color: Colors.black,
+ fontSize: 24,
+ fontWeight: FontWeight.w500,
+ height: 1,
+ ),
+ ),
+ actions: [
+ PortalTarget(
+ visible: isMoreOptionsVisible,
+ portalFollower: MoreOptions(id: widget.diet.id),
+ anchor: Aligned(
+ shiftToWithinBound: AxisFlag(x: true, y: true),
+ follower: Alignment.topRight,
+ target: Alignment.bottomRight,
),
+ child: IconButton(
+ onPressed: () {
+ setState(() {
+ isMoreOptionsVisible = !isMoreOptionsVisible;
+ });
+ },
+ icon: SvgPicture.asset(
+ 'assets/icons/more_button.svg',
+ width: 20,
+ height: 20,
+ )),
),
],
),
body: SingleChildScrollView(
+ controller: scrollController,
padding: EdgeInsets.only(bottom: 160),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Text(
- widget.diet.name,
- style: TextStyle(
- color: Colors.black,
- fontSize: 24,
- fontWeight: FontWeight.w500,
- height: 1,
- ),
- ),
- ),
- SizedBox(height: 12),
- Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Row(
+ SizedBox(height: 8),
+ MainBackgroundBouble(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
children: [
- Icon(Icons.timer_outlined),
- SizedBox(width: 4),
- Text(
- widget.diet.duration.toString() + ' дней',
- style: TextStyle(
- color: Colors.black,
- fontSize: 12,
- fontWeight: FontWeight.w400,
- height: 1,
+ Stack(children: [
+ CachedNetworkImage(
+ imageUrl: baseUrl + '/storage/' + widget.diet.image,
+ ),
+ Positioned(
+ child: Row(
+ children: [
+ InfoBouble(children: [
+
+ ], backgroundColor: appTheme.whiteA700,)
+ ],
+ ),
+ )
+ ]),
+ SizedBox(height: 16),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Text(
+ s.about_diet,
+ style: TextStyle(color: appTheme.blueGray800, fontSize: 20, fontWeight: FontWeight.w600),
),
),
+ SizedBox(height: 12),
+ SingleChildScrollView(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ scrollDirection: Axis.horizontal,
+ child: Row(
+ children: [
+ InfoBouble(
+ children: [
+ SvgPicture.asset(
+ 'assets/icons/time2.svg',
+ width: 13.3,
+ height: 13.3,
+ ),
+ SizedBox(width: 4),
+ Text(widget.diet.duration.toString() + ' ' + getDayForm(widget.diet.duration, s),
+ style: TextStyle(color: appTheme.blueGray800, fontSize: 12, fontWeight: FontWeight.w500)),
+ ],
+ ),
+ SizedBox(width: 12),
+ InfoBouble(
+ children: [
+ SvgPicture.asset(
+ 'assets/icons/people.svg',
+ width: 13.3,
+ height: 13.3,
+ ),
+ SizedBox(width: 4),
+ Text('80 человек прошли(статика, ещё нет бека)',
+ style: TextStyle(color: appTheme.blueGray800, fontSize: 12, fontWeight: FontWeight.w500)),
+ ],
+ ),
+ SizedBox(width: 12),
+ InfoBouble(
+ children: [
+ TypeBadges(type: widget.diet.type),
+ ],
+ )
+ ],
+ ),
+ ),
+ ExpandableText(
+ text: widget.diet.details,
+ ),
+ SizedBox(height: 20),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: AuthorCard(
+ author: widget.diet.author,
+ ),
+ ),
+ SizedBox(height: 16),
],
),
),
- if (widget.diet.details.isNotEmpty)
- Padding(
- padding: const EdgeInsets.symmetric(horizontal: 8),
- child: Html(
- data: widget.diet.details,
- style: {
- "*": Style(
- color: Colors.black87,
- ),
- },
+ SizedBox(height: 16),
+ MainBackgroundBouble(
+ child: Padding(
+ padding: const EdgeInsets.symmetric(vertical: 16.0),
+ child: Center(
+ child: Text(
+ s.diet_plan + '(${widget.diet.duration.toString()} ' + getDayForm(widget.diet.duration, s) + ')',
+ style: TextStyle(
+ color: appTheme.blueGray800,
+ fontSize: 20,
+ fontWeight: FontWeight.w600,
+ ),
),
),
- SizedBox(height: 12),
- CachedNetworkImage(
- imageUrl: baseUrl + '/storage/' + widget.diet.image,
- ),
- SizedBox(height: 12),
- ListView.separated(
- padding: EdgeInsets.all(16),
+ )),
+ SizedBox(height: 8),
+ ListView.builder(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
- return _dayOfPlan(widget.diet.dailySchedule[index], index);
+ return _dayOfPlan(widget.diet.dailySchedule[index], index, s);
},
- separatorBuilder: (context, index) => Padding(
- padding: const EdgeInsets.symmetric(vertical: 16),
- child: Container(
- height: 0.4,
- decoration: BoxDecoration(
- color: Colors.grey,
- borderRadius: BorderRadius.circular(16),
- ),
- ),
- ),
itemCount: widget.diet.dailySchedule.length,
),
- SizedBox(height: 32),
- Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Container(
- height: 0.4,
- decoration: BoxDecoration(
- color: Colors.grey,
- borderRadius: BorderRadius.circular(16),
- ),
- ),
- ),
- SizedBox(height: 8),
- Container(
- padding: EdgeInsets.symmetric(horizontal: 16),
- alignment: Alignment.centerLeft,
- child: Text(
- widget.diet.totalComments.toString() + ' КОММЕНТАРИЕВ',
- style: TextStyle(
- fontSize: 12,
- color: appTheme.gray500,
- fontWeight: FontWeight.w400,
- ),
- ),
- ),
- SizedBox(height: 16),
- if (state is CommentsStateLoading)
- Padding(
- padding: const EdgeInsets.all(32),
- child: SizedBox(
- height: 32,
- width: 32,
- child: RiveAnimation.asset(
- 'assets/rive_animations/loading.riv',
+ MainBackgroundBouble(
+ padding: EdgeInsets.symmetric(vertical: 16),
+ child: Column(children: [
+ Container(
+ padding: EdgeInsets.symmetric(horizontal: 16),
+ alignment: Alignment.centerLeft,
+ child: Text(
+ widget.diet.totalComments.toString() + ' ' + getCommentForm(widget.diet.totalComments, s),
+ style: TextStyle(
+ fontSize: 12,
+ color: appTheme.gray500,
+ fontWeight: FontWeight.w400,
+ ),
),
),
- ),
- if (state is CommentsStateLoaded)
- CommentsWidget(
- id: widget.diet.id.toString(),
- commentSourceType: CommentSourceType.diet,
- comment: state.comment,
- replyId: replyId,
- ),
+ SizedBox(height: 16),
+ if (state is CommentsStateLoading)
+ Padding(
+ padding: const EdgeInsets.all(32),
+ child: SizedBox(
+ height: 32,
+ width: 32,
+ child: RiveAnimation.asset(
+ 'assets/rive_animations/loading.riv',
+ ),
+ ),
+ ),
+ if (state is CommentsStateLoaded)
+ CommentsWidget(
+ id: widget.diet.id.toString(),
+ commentSourceType: CommentSourceType.diet,
+ comment: state.comment,
+ replyId: replyId,
+ ),
+ ]),
+ ),
],
),
),
@@ -354,7 +444,7 @@ class _AboutDietScreenState extends State {
);
}
- _dayOfPlan(List> day, int dayNumber) {
+ _dayOfPlan(List> day, int dayNumber, S s) {
_choiceChipWidget(int index) {
return ChoiceChip(
selectedColor: appTheme.blueA400,
@@ -381,73 +471,91 @@ class _AboutDietScreenState extends State {
);
}
- return Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- 'День ' + (dayNumber + 1).toString(),
- style: TextStyle(
- color: Colors.black,
- fontSize: 16,
- fontWeight: FontWeight.w500,
- height: 1,
- ),
+ return Padding(
+ padding: const EdgeInsets.only(bottom: 8),
+ child: MainBackgroundBouble(
+ padding: EdgeInsets.only(
+ top: 16,
),
- SizedBox(height: 4),
- Text(
- 'Приём пищи',
- style: TextStyle(
- color: Colors.black,
- fontSize: 14,
- fontWeight: FontWeight.w400,
- height: 1,
- ),
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ child: Column(
children: [
- _choiceChipWidget(0),
- _choiceChipWidget(1),
- _choiceChipWidget(2),
- _choiceChipWidget(3),
- _choiceChipWidget(4),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ s.day + ' ' + (dayNumber + 1).toString(),
+ style: TextStyle(
+ color: appTheme.blueGray800,
+ fontSize: 20,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(vertical: 12),
+ child: CustomDivider(),
+ ),
+ Text(
+ s.meal,
+ style: TextStyle(
+ color: appTheme.blueGray800,
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ _choiceChipWidget(0),
+ _choiceChipWidget(1),
+ _choiceChipWidget(2),
+ _choiceChipWidget(3),
+ _choiceChipWidget(4),
+ ],
+ ),
+ SizedBox(height: 8),
+ ListView.builder(
+ shrinkWrap: true,
+ physics: NeverScrollableScrollPhysics(),
+ itemBuilder: (context, index) => _daily(day[widget.selectedIndexes[dayNumber]][index], s),
+ itemCount: day[widget.selectedIndexes[dayNumber]].length,
+ ),
+ SizedBox(height: 8),
+ ],
+ ),
+ ),
+ CpfcContainer(calories: 0, protein: 0, fat: 0, carbohydrates: 0)
],
),
- SizedBox(height: 8),
- ListView.separated(
- shrinkWrap: true,
- physics: NeverScrollableScrollPhysics(),
- itemBuilder: (context, index) => _daily(day[widget.selectedIndexes[dayNumber]][index]),
- separatorBuilder: (context, index) => SizedBox(height: 4),
- itemCount: day[widget.selectedIndexes[dayNumber]].length,
- ),
- ],
+ ),
);
}
- _daily(DailySchedule daily) {
- return Row(
- children: [
- Text(
- '• ' + daily.name,
- style: TextStyle(
- color: Colors.black,
- fontSize: 14,
- fontWeight: FontWeight.w400,
- height: 1.2,
+ _daily(DailySchedule daily, S s) {
+ return Padding(
+ padding: const EdgeInsets.only(bottom: 12),
+ child: Row(
+ children: [
+ Text(
+ daily.name,
+ style: TextStyle(
+ color: appTheme.blueGray800,
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ ),
),
- ),
- Spacer(),
- Text(
- daily.quantity.toString() + ' ' + daily.portion.name,
- style: TextStyle(
- color: Colors.black,
- fontSize: 14,
- fontWeight: FontWeight.w400,
- height: 1.2,
+ Spacer(),
+ Text(
+ daily.quantity.toString() + ' ' + getLocalizedMeasurementUnits(s, daily.portion),
+ style: TextStyle(
+ color: appTheme.blueGray800,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
),
- ),
- ],
+ ],
+ ),
);
}
}
diff --git a/lib/features/diets/presentation/widgets/author_card.dart b/lib/features/diets/presentation/widgets/author_card.dart
new file mode 100644
index 00000000..ee50ca05
--- /dev/null
+++ b/lib/features/diets/presentation/widgets/author_card.dart
@@ -0,0 +1,107 @@
+import 'package:eatvio_app/features/diets/presentation/widgets/info_bouble.dart';
+import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:eatvio_app/theme/theme_helper.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:go_router/go_router.dart';
+
+class AuthorCard extends StatelessWidget {
+ const AuthorCard({super.key, required this.author});
+ final Author author;
+ @override
+ Widget build(BuildContext context) {
+ final s = S.of(context);
+ return Container(
+ width: MediaQuery.sizeOf(context).width,
+ decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), color: appTheme.cardBackground),
+ child: Stack(
+ children: [
+ Padding(
+ padding: const EdgeInsets.only(left: 16, top: 16, bottom: 24),
+ child: Column(
+ children: [
+ ListTile(
+ contentPadding: EdgeInsets.zero,
+ leading: Container(
+ width: 64,
+ height: 64,
+ decoration: BoxDecoration(
+ shape: BoxShape.circle,
+ image: DecorationImage(
+ image: NetworkImage(author.authorProfileIcon),
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ subtitle: Text(
+ author.authorName,
+ style: TextStyle(
+ fontSize: 18,
+ fontWeight: FontWeight.w600,
+ color: appTheme.blueGray800,
+ ),
+ ),
+ title: Text(
+ s.diet_author,
+ style: TextStyle(
+ fontSize: 14,
+ fontWeight: FontWeight.w600,
+ color: Color(0xFF6D6F71),
+ ),
+ ),
+ ),
+ Row(
+ children: [
+ Text(
+ 'Конслуьтант',
+ style: TextStyle(
+ color: appTheme.blueGray800,
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ SizedBox(width: 10),
+ InfoBouble(radius: 12, backgroundColor: appTheme.whiteA700, children: [
+ Text(
+ '128-й в рейтинге',
+ style: TextStyle(
+ color: appTheme.blueA400,
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ ),
+ )
+ ])
+ ],
+ )
+ ],
+ ),
+ ),
+ Positioned(
+ right: 8,
+ top: 8,
+ child: GestureDetector(
+ onTap: () => GoRouter.of(context).pushNamed('profileScreen', extra: author),
+ child: Container(
+ width: 28,
+ height: 28,
+ decoration: BoxDecoration(
+ color: appTheme.whiteA700,
+ borderRadius: BorderRadius.circular(8),
+ ),
+ child: Center(
+ child: SvgPicture.asset(
+ 'assets/icons/arrow.svg',
+ width: 12,
+ height: 12,
+ fit: BoxFit.none,
+ ),
+ ),
+ ),
+ ),
+ )
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/features/diets/presentation/widgets/cpfc_container.dart b/lib/features/diets/presentation/widgets/cpfc_container.dart
new file mode 100644
index 00000000..f7428d46
--- /dev/null
+++ b/lib/features/diets/presentation/widgets/cpfc_container.dart
@@ -0,0 +1,46 @@
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:eatvio_app/theme/theme_helper.dart';
+import 'package:flutter/material.dart';
+
+class CpfcContainer extends StatelessWidget {
+ const CpfcContainer({super.key, required this.calories, required this.protein, required this.fat, required this.carbohydrates});
+ final double calories;
+ final double protein;
+ final double fat;
+ final double carbohydrates;
+
+ @override
+ Widget build(BuildContext context) {
+ final s = S.of(context);
+ return Container(
+ color: appTheme.cardBackground,
+ padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12),
+ child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
+ Column(
+ children: [
+ Text('$calories', style: TextStyle(color: appTheme.blueGray800, fontSize: 16, fontWeight: FontWeight.w600)),
+ Text(s.calories, style: TextStyle(color: appTheme.blueGray800, fontSize: 12, fontWeight: FontWeight.w500)),
+ ],
+ ),
+ Column(
+ children: [
+ Text('$protein', style: TextStyle(color: appTheme.blueGray800, fontSize: 16, fontWeight: FontWeight.w600)),
+ Text(s.proteins, style: TextStyle(color: appTheme.blueGray800, fontSize: 12, fontWeight: FontWeight.w500)),
+ ],
+ ),
+ Column(
+ children: [
+ Text('$fat', style: TextStyle(color: appTheme.blueGray800, fontSize: 16, fontWeight: FontWeight.w600)),
+ Text(s.fats, style: TextStyle(color: appTheme.blueGray800, fontSize: 12, fontWeight: FontWeight.w500)),
+ ],
+ ),
+ Column(
+ children: [
+ Text('$carbohydrates', style: TextStyle(color: appTheme.blueGray800, fontSize: 16, fontWeight: FontWeight.w600)),
+ Text(s.carbohydrates, style: TextStyle(color: appTheme.blueGray800, fontSize: 12, fontWeight: FontWeight.w500)),
+ ],
+ )
+ ]),
+ );
+ }
+}
diff --git a/lib/features/diets/presentation/widgets/expandable_text.dart b/lib/features/diets/presentation/widgets/expandable_text.dart
new file mode 100644
index 00000000..a035c287
--- /dev/null
+++ b/lib/features/diets/presentation/widgets/expandable_text.dart
@@ -0,0 +1,87 @@
+import 'dart:math' as math;
+
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:eatvio_app/theme/theme_helper.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_html/flutter_html.dart';
+import 'package:flutter_svg/svg.dart';
+
+class ExpandableText extends StatefulWidget {
+ final String text;
+ final int maxLines;
+
+ ExpandableText({required this.text, this.maxLines = 3});
+
+ @override
+ _ExpandableTextState createState() => _ExpandableTextState();
+}
+
+class _ExpandableTextState extends State {
+ bool isExpanded = false;
+
+ void toggleExpansion() {
+ setState(() {
+ isExpanded = !isExpanded;
+ });
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final s = S.of(context);
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Stack(
+ children: [
+ Html(
+ data: widget.text,
+ style: {
+ "*": Style(
+ color: Colors.black87,
+ maxLines: isExpanded ? null : widget.maxLines,
+ textOverflow: TextOverflow.clip,
+ ),
+ },
+ ),
+ if (!isExpanded)
+ Positioned.fill(
+ child: Align(
+ alignment: Alignment.bottomCenter,
+ child: Container(
+ height: 35,
+ decoration: BoxDecoration(
+ gradient: LinearGradient(
+ begin: Alignment.topCenter,
+ end: Alignment.bottomCenter,
+ colors: [
+ Colors.white.withOpacity(0.0),
+ Colors.white.withOpacity(0.6),
+ Colors.white,
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ Align(
+ alignment: Alignment.bottomCenter,
+ child: GestureDetector(
+ onTap: toggleExpansion,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(
+ isExpanded ? s.hide : s.expand,
+ style: TextStyle(color: appTheme.blueA400, fontSize: 16, fontWeight: FontWeight.w500),
+ ),
+ Transform.rotate(angle: isExpanded ? math.pi : 0, child: SvgPicture.asset('assets/icons/arrow_down.svg', width: 12, height: 12)),
+ ],
+ ),
+ ),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/features/diets/presentation/widgets/info_bouble.dart b/lib/features/diets/presentation/widgets/info_bouble.dart
new file mode 100644
index 00000000..d37cbd92
--- /dev/null
+++ b/lib/features/diets/presentation/widgets/info_bouble.dart
@@ -0,0 +1,20 @@
+import 'package:eatvio_app/theme/theme_helper.dart';
+import 'package:flutter/material.dart';
+
+class InfoBouble extends StatelessWidget {
+ const InfoBouble({super.key, required this.children, this.backgroundColor, this.radius = 100});
+ final List children;
+ final Color? backgroundColor;
+ final double radius;
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8.5),
+ decoration: BoxDecoration(
+ color: backgroundColor ?? appTheme.gray50,
+ borderRadius: BorderRadius.circular(radius),
+ ),
+ child: Row(children: children),
+ );
+ }
+}
diff --git a/lib/features/diets/presentation/widgets/main_background_bouble.dart b/lib/features/diets/presentation/widgets/main_background_bouble.dart
new file mode 100644
index 00000000..6b6ad9c5
--- /dev/null
+++ b/lib/features/diets/presentation/widgets/main_background_bouble.dart
@@ -0,0 +1,38 @@
+import 'package:eatvio_app/theme/theme_helper.dart';
+import 'package:flutter/material.dart';
+
+class MainBackgroundBouble extends StatelessWidget {
+ const MainBackgroundBouble(
+ {super.key, required this.child, this.width, this.padding, this.enableShadow = false});
+ final double? width;
+ final Widget child;
+ final bool enableShadow;
+ final EdgeInsetsGeometry? padding;
+ @override
+ Widget build(BuildContext context) {
+ return DecoratedBox(
+ decoration: BoxDecoration(
+ boxShadow: enableShadow
+ ? [
+ BoxShadow(
+ color: Color(0x00000000).withOpacity(0.2),
+ spreadRadius: 0,
+ blurRadius: 32,
+ offset: Offset(0, 0),
+ ),
+ ]
+ : null),
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(12),
+ child: Container(
+ decoration: BoxDecoration(
+ color: appTheme.whiteA700,
+ ),
+ width: width ?? MediaQuery.sizeOf(context).width,
+ padding: padding,
+ child: child,
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/diets/presentation/widgets/more_options.dart b/lib/features/diets/presentation/widgets/more_options.dart
new file mode 100644
index 00000000..ca5033b8
--- /dev/null
+++ b/lib/features/diets/presentation/widgets/more_options.dart
@@ -0,0 +1,96 @@
+import 'package:eatvio_app/core/const.dart';
+import 'package:eatvio_app/core/utils/toasts.dart';
+import 'package:eatvio_app/core/widgets/custom_divider.dart';
+import 'package:eatvio_app/features/diets/presentation/widgets/main_background_bouble.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:eatvio_app/theme/theme_helper.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+import 'package:share_plus/share_plus.dart';
+
+class MoreOptions extends StatelessWidget {
+ const MoreOptions({super.key, required this.id});
+ final int id;
+ @override
+ Widget build(BuildContext context) {
+ final s = S.of(context);
+ return MainBackgroundBouble(
+ enableShadow: true,
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 14),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ GestureDetector(
+ onTap: () {
+ Clipboard.setData(ClipboardData(text: baseUrl + '/ru/diet/' + id.toString()));
+ showInfoToast(s.link_was_copied);
+ },
+ child: Row(
+ children: [
+ Text(
+ s.copy_link,
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ color: appTheme.blueGray800,
+ ),
+ ),
+ Spacer(),
+ SvgPicture.asset('assets/icons/copy2.svg', width: 16, height: 20),
+ ],
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(vertical: 12.0),
+ child: CustomDivider(),
+ ),
+ GestureDetector(
+ onTap: () => Share.shareUri(
+ Uri.parse(
+ baseUrl + '/ru/diet/' + id.toString(),
+ ),
+ ),
+ child: Row(
+ children: [
+ Text(
+ s.share,
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ color: appTheme.blueGray800,
+ ),
+ ),
+ Spacer(),
+ SvgPicture.asset('assets/icons/share2.svg', width: 16, height: 20),
+ ],
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(vertical: 12.0),
+ child: CustomDivider(),
+ ),
+ GestureDetector(
+ onTap: () {},
+ child: Row(
+ children: [
+ Text(
+ s.complain,
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ color: appTheme.blueGray800,
+ ),
+ ),
+ Spacer(),
+ SvgPicture.asset('assets/icons/complain.svg', width: 16, height: 20),
+ ],
+ ),
+ )
+ ],
+ ),
+ ),
+ width: 272);
+ }
+}
diff --git a/lib/features/diets/presentation/widgets/type_badges.dart b/lib/features/diets/presentation/widgets/type_badges.dart
new file mode 100644
index 00000000..3e828f3d
--- /dev/null
+++ b/lib/features/diets/presentation/widgets/type_badges.dart
@@ -0,0 +1,222 @@
+import 'package:eatvio_app/features/diets/presentation/widgets/main_background_bouble.dart';
+import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:eatvio_app/theme/theme_helper.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_portal/flutter_portal.dart';
+import 'package:flutter_svg/svg.dart';
+
+class TypeBadges extends StatefulWidget {
+ const TypeBadges({super.key, required this.type});
+ final DietType type;
+
+ @override
+ State createState() => _TypeBadgesState();
+}
+
+class _TypeBadgesState extends State {
+ final List overlaysVisibilityState = [false, false, false, false];
+ @override
+ Widget build(BuildContext context) {
+ final s = S.of(context);
+ final List<(String, Widget)> badgeSource = [];
+ if (widget.type.alko == true) {
+ badgeSource.add((
+ 'assets/icons/cocktail.svg',
+ _InfoOverlayEntry(
+ onClose: closeOverlay,
+ assetPath: 'assets/icons/cocktail.svg',
+ title: s.alko_type,
+ description: s.alko_type_desc,
+ )
+ ));
+ }
+ if (widget.type.veg == true) {
+ badgeSource.add((
+ 'assets/icons/broccoli.svg',
+ _InfoOverlayEntry(
+ onClose: closeOverlay,
+ assetPath: 'assets/icons/broccoli.svg',
+ title: s.vegan_type,
+ description: s.vegan_type_desc,
+ )
+ ));
+ }
+ if (widget.type.corb == true) {
+ badgeSource.add((
+ 'assets/icons/bread.svg',
+ _InfoOverlayEntry(
+ onClose: closeOverlay,
+ assetPath: 'assets/icons/bread.svg',
+ title: s.corb_type,
+ description: s.corb_type_desc,
+ )
+ ));
+ }
+ if (widget.type.meat == true) {
+ badgeSource.add((
+ 'assets/icons/meat2.svg',
+ _InfoOverlayEntry(
+ onClose: closeOverlay,
+ assetPath: 'assets/icons/meat2.svg',
+ title: s.meat_type,
+ description: s.meat_type_desc,
+ )
+ ));
+ }
+ return Row(
+ children: List.generate(
+ badgeSource.length,
+ (index) => _Barrier(
+ visible: overlaysVisibilityState[index],
+ onClose: closeOverlay,
+ child: PortalTarget(
+ visible: overlaysVisibilityState[index],
+ anchor: Aligned(
+ shiftToWithinBound: AxisFlag(x: true, y: true),
+ follower: Alignment.topRight,
+ target: Alignment.bottomRight,
+ ),
+ portalFollower: badgeSource[index].$2,
+ child: GestureDetector(
+ onTap: () {
+ for (int stateIndex = 0; stateIndex < overlaysVisibilityState.length; stateIndex++) {
+ if (index != stateIndex) {
+ setState(() {
+ overlaysVisibilityState[stateIndex] = false;
+ });
+ } else {
+ setState(() {
+ overlaysVisibilityState[stateIndex] = true;
+ });
+ }
+ }
+ },
+ child: Padding(
+ padding: EdgeInsets.only(right: index != badgeSource.length - 1 ? 8.0 : 0),
+ child: SvgPicture.asset(
+ badgeSource[index].$1,
+ width: 16,
+ height: 16,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+
+ void closeOverlay() {
+ for (int stateIndex = 0; stateIndex < overlaysVisibilityState.length; stateIndex++) {
+ setState(() {
+ overlaysVisibilityState[stateIndex] = false;
+ });
+ }
+ }
+}
+
+class _InfoOverlayEntry extends StatelessWidget {
+ const _InfoOverlayEntry({super.key, required this.title, required this.description, required this.assetPath, required this.onClose});
+ final String title;
+ final String description;
+ final assetPath;
+ final void Function() onClose;
+ @override
+ Widget build(BuildContext context) {
+ return MainBackgroundBouble(
+ padding: EdgeInsets.all(8),
+ width: 343,
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ SvgPicture.asset(
+ assetPath,
+ width: 20,
+ height: 20,
+ ),
+ SizedBox(width: 8),
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Text(
+ title,
+ style: TextStyle(
+ decoration: TextDecoration.none,
+ color: appTheme.blueGray800,
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ SizedBox(height: 4),
+ Text(
+ description,
+ softWrap: true,
+ style: TextStyle(
+ decoration: TextDecoration.none,
+ color: appTheme.blueGray800,
+ fontSize: 12,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ ],
+ ),
+ ),
+ GestureDetector(
+ onTap: onClose,
+ child: SvgPicture.asset(
+ 'assets/icons/close_button.svg',
+ width: 20,
+ height: 20,
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
+
+class _Barrier extends StatelessWidget {
+ const _Barrier({
+ Key? key,
+ required this.onClose,
+ required this.visible,
+ required this.child,
+ }) : super(key: key);
+
+ final Widget child;
+ final VoidCallback onClose;
+ final bool visible;
+
+ @override
+ Widget build(BuildContext context) {
+ return PortalTarget(
+ visible: visible,
+ closeDuration: kThemeAnimationDuration,
+ portalFollower: GestureDetector(
+ behavior: HitTestBehavior.opaque,
+ onTap: onClose,
+ child: TweenAnimationBuilder(
+ duration: kThemeAnimationDuration,
+ tween: ColorTween(
+ begin: Colors.transparent,
+ end: visible ? Colors.black54 : Colors.transparent,
+ ),
+ builder: (context, color, child) {
+ return ColoredBox(color: color);
+ },
+ ),
+ ),
+ child: child,
+ );
+ }
+}
+
+class ColorTween extends Tween {
+ ColorTween({required Color begin, required Color end}) : super(begin: begin, end: end);
+
+ @override
+ Color lerp(double t) => Color.lerp(begin, end, t)!;
+}
diff --git a/lib/features/diets/services/diets_service.dart b/lib/features/diets/services/diets_service.dart
new file mode 100644
index 00000000..9130f39c
--- /dev/null
+++ b/lib/features/diets/services/diets_service.dart
@@ -0,0 +1,12 @@
+import 'package:dio/dio.dart';
+import 'package:retrofit/retrofit.dart';
+
+part 'diets_service.g.dart';
+
+@RestApi()
+abstract class DietsService {
+
+ factory DietsService(Dio dio, {String baseUrl}) = _DietsService;
+
+
+}
\ No newline at end of file
diff --git a/lib/features/diets/services/diets_service.g.dart b/lib/features/diets/services/diets_service.g.dart
new file mode 100644
index 00000000..aeef4f7e
--- /dev/null
+++ b/lib/features/diets/services/diets_service.g.dart
@@ -0,0 +1,53 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'diets_service.dart';
+
+// **************************************************************************
+// RetrofitGenerator
+// **************************************************************************
+
+// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element,unnecessary_string_interpolations
+
+class _DietsService implements DietsService {
+ _DietsService(
+ this._dio, {
+ this.baseUrl,
+ this.errorLogger,
+ });
+
+ final Dio _dio;
+
+ String? baseUrl;
+
+ final ParseErrorLogger? errorLogger;
+
+ RequestOptions _setStreamType(RequestOptions requestOptions) {
+ if (T != dynamic &&
+ !(requestOptions.responseType == ResponseType.bytes ||
+ requestOptions.responseType == ResponseType.stream)) {
+ if (T == String) {
+ requestOptions.responseType = ResponseType.plain;
+ } else {
+ requestOptions.responseType = ResponseType.json;
+ }
+ }
+ return requestOptions;
+ }
+
+ String _combineBaseUrls(
+ String dioBaseUrl,
+ String? baseUrl,
+ ) {
+ if (baseUrl == null || baseUrl.trim().isEmpty) {
+ return dioBaseUrl;
+ }
+
+ final url = Uri.parse(baseUrl);
+
+ if (url.isAbsolute) {
+ return url.toString();
+ }
+
+ return Uri.parse(dioBaseUrl).resolveUri(url).toString();
+ }
+}
diff --git a/lib/features/feed/presentation/bloc/comments_cubit/comments_cubit.dart b/lib/features/feed/presentation/bloc/comments_cubit/comments_cubit.dart
index dbfdaeb0..bf5be7e1 100644
--- a/lib/features/feed/presentation/bloc/comments_cubit/comments_cubit.dart
+++ b/lib/features/feed/presentation/bloc/comments_cubit/comments_cubit.dart
@@ -14,7 +14,7 @@ class CommentsCubit extends Cubit {
emit((state as CommentsStateLoaded).copyWith(replyId: replyId));
}
- getComments(String id, CommentSourceType commentSourceType, [bool isFirstFetch = false]) async {
+ getComments(String id, CommentSourceType commentSourceType, [bool isFirstFetch = false]) async {
if (isFirstFetch) emit(CommentsState.loading());
try {
switch (commentSourceType) {
diff --git a/lib/features/feed/presentation/widgets/comments_widget.dart b/lib/features/feed/presentation/widgets/comments_widget.dart
index 695c5459..4421a4aa 100644
--- a/lib/features/feed/presentation/widgets/comments_widget.dart
+++ b/lib/features/feed/presentation/widgets/comments_widget.dart
@@ -1,6 +1,7 @@
import 'package:eatvio_app/core/utils/date_time_utils.dart';
import 'package:eatvio_app/features/feed/models/comment_model.dart';
import 'package:eatvio_app/features/feed/presentation/bloc/comments_cubit/comments_cubit.dart';
+import 'package:eatvio_app/generated/l10n.dart';
import 'package:eatvio_app/theme/theme_helper.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -28,15 +29,16 @@ class CommentsWidget extends StatefulWidget {
class _CommentsWidgetState extends State {
@override
Widget build(BuildContext context) {
+ final s = S.of(context);
return Column(
children: [
for (int i = 0; i < widget.comment.data.length; i++) ...[
- _comment(widget.comment.data[i]),
+ _comment(s, widget.comment.data[i]),
if (widget.comment.data[i].childrenComments.isNotEmpty) SizedBox(height: 8),
for (int j = 0; j < widget.comment.data[i].childrenComments.length; j++)
Padding(
padding: EdgeInsets.only(left: 40),
- child: _comment(widget.comment.data[i].childrenComments[j], 12, true),
+ child: _comment(s, widget.comment.data[i].childrenComments[j], 16, true),
),
SizedBox(height: 8),
],
@@ -44,7 +46,7 @@ class _CommentsWidgetState extends State {
);
}
- _comment(Comment comment, [double radius = 16, bool isChild = false]) {
+ _comment(S s, Comment comment, [double radius = 18, bool isChild = false]) {
return Container(
width: MediaQuery.of(context).size.width,
decoration: BoxDecoration(
@@ -69,16 +71,19 @@ class _CommentsWidgetState extends State {
comment.authorName,
style: TextStyle(
height: 1,
- color: Colors.grey.shade600,
+ color: appTheme.grey,
+ fontSize: 12,
fontWeight: FontWeight.w500,
),
),
- SizedBox(width: 4),
+ SizedBox(height: 4),
Text(
comment.body,
style: TextStyle(
height: 1,
- color: Colors.black,
+ color: appTheme.blueGray800,
+ fontSize: 12,
+ fontWeight: FontWeight.w500,
),
),
SizedBox(height: 4),
@@ -87,10 +92,10 @@ class _CommentsWidgetState extends State {
Text(
comment.createdAt.format('dd MMMM', 'ru'),
style: TextStyle(
- color: Colors.grey.shade600,
- fontSize: 12,
- fontWeight: FontWeight.w400,
height: 1,
+ color: appTheme.grey,
+ fontSize: 12,
+ fontWeight: FontWeight.w500,
),
),
SizedBox(width: 16),
@@ -100,11 +105,11 @@ class _CommentsWidgetState extends State {
context.read().setReplyId(comment.id);
},
child: Text(
- 'Ответить',
+ s.answer,
style: TextStyle(
height: 1,
+ color: appTheme.grey,
fontSize: 12,
- color: Colors.grey.shade800,
fontWeight: FontWeight.w500,
),
),
diff --git a/lib/features/registration/presentation/pages/city_of_living_screen.dart b/lib/features/registration/presentation/pages/city_of_living_screen.dart
index fffbd19e..f21f0659 100644
--- a/lib/features/registration/presentation/pages/city_of_living_screen.dart
+++ b/lib/features/registration/presentation/pages/city_of_living_screen.dart
@@ -111,7 +111,8 @@ class _CityOfLivingScreenState extends State {
suggestionsCallback: (query) async {
if (query.length >= 3) {
final registrationCubit = context.read();
- return (await registrationCubit.getLocationsByQuery(query));
+ final qwe = (await registrationCubit.getLocationsByQuery(query));
+ return qwe;
}
return null;
},
@@ -129,9 +130,11 @@ class _CityOfLivingScreenState extends State {
if (locationData != null) {
final List locations = await context
.read()
- .getLocationsByCoordinates(locationData.latitude.toString(), locationData.longitude.toString());
+ .getLocationsByCoordinates(
+ locationData.latitude.toString(), locationData.longitude.toString());
final registrationCubit = context.read();
- registrationCubit.updateSheet(registrationCubit.state.sheet.copyWith(location: locations.first));
+ registrationCubit
+ .updateSheet(registrationCubit.state.sheet.copyWith(location: locations.first));
setState(() {
cityController.text = locations.first;
suggestionsController.suggestions = locations;
diff --git a/lib/generated/intl/messages_all.dart b/lib/generated/intl/messages_all.dart
index abae25a5..203415cc 100644
--- a/lib/generated/intl/messages_all.dart
+++ b/lib/generated/intl/messages_all.dart
@@ -17,20 +17,16 @@ import 'package:intl/message_lookup_by_library.dart';
import 'package:intl/src/intl_helpers.dart';
import 'messages_en.dart' as messages_en;
-import 'messages_ru.dart' as messages_ru;
typedef Future LibraryLoader();
Map _deferredLibraries = {
'en': () => new SynchronousFuture(null),
- 'ru': () => new SynchronousFuture(null),
};
MessageLookupByLibrary? _findExact(String localeName) {
switch (localeName) {
case 'en':
return messages_en.messages;
- case 'ru':
- return messages_ru.messages;
default:
return null;
}
diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart
index 3d320130..99f95108 100644
--- a/lib/generated/intl/messages_en.dart
+++ b/lib/generated/intl/messages_en.dart
@@ -22,157 +22,192 @@ class MessageLookup extends MessageLookupByLibrary {
final messages = _notInlinedMessages(_notInlinedMessages);
static Map _notInlinedMessages(_) => {
- "Moscow": MessageLookupByLibrary.simpleMessage("Moscow"),
- "Russia": MessageLookupByLibrary.simpleMessage("Russia"),
- "active": MessageLookupByLibrary.simpleMessage("Active"),
- "add_measure": MessageLookupByLibrary.simpleMessage("Add Measurement"),
+ "Moscow": MessageLookupByLibrary.simpleMessage("Москва"),
+ "Russia": MessageLookupByLibrary.simpleMessage("Россия"),
+ "about_diet": MessageLookupByLibrary.simpleMessage("Об этой диете"),
+ "active": MessageLookupByLibrary.simpleMessage("Активен"),
+ "add_measure": MessageLookupByLibrary.simpleMessage("Добавить замер"),
"additional_information":
- MessageLookupByLibrary.simpleMessage("Additional Information"),
- "admin": MessageLookupByLibrary.simpleMessage("Admin"),
+ MessageLookupByLibrary.simpleMessage("Дополнительная информация"),
+ "admin": MessageLookupByLibrary.simpleMessage("Админ"),
+ "alko_type": MessageLookupByLibrary.simpleMessage("Алкоголь"),
+ "alko_type_desc": MessageLookupByLibrary.simpleMessage(
+ "С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками."),
"allergies_presence":
- MessageLookupByLibrary.simpleMessage("Presence of Allergies"),
- "archived": MessageLookupByLibrary.simpleMessage("Archived"),
- "authentificate": MessageLookupByLibrary.simpleMessage("Log In"),
- "average_pressure":
- MessageLookupByLibrary.simpleMessage("Average Pressure Readings:"),
- "bodymass_chart": MessageLookupByLibrary.simpleMessage("BMI Chart"),
- "chat": MessageLookupByLibrary.simpleMessage("Chat"),
- "chest": MessageLookupByLibrary.simpleMessage("Chest"),
+ MessageLookupByLibrary.simpleMessage("Наличие аллергии"),
+ "another_form_of_comment":
+ MessageLookupByLibrary.simpleMessage("комментария"),
+ "another_form_of_day": MessageLookupByLibrary.simpleMessage("дня"),
+ "answer": MessageLookupByLibrary.simpleMessage("Ответить"),
+ "archived": MessageLookupByLibrary.simpleMessage("В архиве"),
+ "authentificate": MessageLookupByLibrary.simpleMessage("Войти"),
+ "average_pressure": MessageLookupByLibrary.simpleMessage(
+ "Средние показатели давления:"),
+ "bodymass_chart": MessageLookupByLibrary.simpleMessage("График ИМТ"),
+ "calories": MessageLookupByLibrary.simpleMessage("Калории"),
+ "carbohydrates": MessageLookupByLibrary.simpleMessage("Углеводы"),
+ "chat": MessageLookupByLibrary.simpleMessage("Чат"),
+ "chest": MessageLookupByLibrary.simpleMessage("Грудь"),
"chest_circumference":
- MessageLookupByLibrary.simpleMessage("Chest Circumference"),
+ MessageLookupByLibrary.simpleMessage("Обхват груди"),
"circumference_empty": MessageLookupByLibrary.simpleMessage(
- "All measurements are required"),
+ "Все замеры обязательны к заполнению"),
"circumference_is_not_a_number": MessageLookupByLibrary.simpleMessage(
- "All measurements must be numbers"),
+ "Все замеры должны быть числами"),
"circumferences_chart":
- MessageLookupByLibrary.simpleMessage("Circumference Chart"),
- "city": MessageLookupByLibrary.simpleMessage("City"),
+ MessageLookupByLibrary.simpleMessage("График обхватов"),
+ "city": MessageLookupByLibrary.simpleMessage("Город"),
"city_of_living":
- MessageLookupByLibrary.simpleMessage("City of Residence"),
- "continueButton": MessageLookupByLibrary.simpleMessage("Continue"),
- "country": MessageLookupByLibrary.simpleMessage("Country"),
- "date_of_birth": MessageLookupByLibrary.simpleMessage("Date of Birth"),
- "diary": MessageLookupByLibrary.simpleMessage("Diary"),
+ MessageLookupByLibrary.simpleMessage("Город проживания"),
+ "comment": MessageLookupByLibrary.simpleMessage("комментарий"),
+ "comments": MessageLookupByLibrary.simpleMessage("Комментарии"),
+ "comments_plural": MessageLookupByLibrary.simpleMessage("комментариев"),
+ "complain": MessageLookupByLibrary.simpleMessage("Пожаловаться"),
+ "continueButton": MessageLookupByLibrary.simpleMessage("Продолжить"),
+ "copy_link": MessageLookupByLibrary.simpleMessage("Скопировать ссылку"),
+ "corb_type": MessageLookupByLibrary.simpleMessage("Мучное"),
+ "corb_type_desc": MessageLookupByLibrary.simpleMessage(
+ "Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы."),
+ "country": MessageLookupByLibrary.simpleMessage("Страна"),
+ "date_of_birth": MessageLookupByLibrary.simpleMessage("Дата рождения"),
+ "day": MessageLookupByLibrary.simpleMessage("День"),
+ "days": MessageLookupByLibrary.simpleMessage("дней"),
+ "diary": MessageLookupByLibrary.simpleMessage("Дневник"),
+ "diet_author": MessageLookupByLibrary.simpleMessage("Автор диеты"),
+ "diet_plan": MessageLookupByLibrary.simpleMessage("План диеты"),
"do_you_have_hypertension_tendency":
- MessageLookupByLibrary.simpleMessage(
- "Do you have a tendency for hypertension?"),
+ MessageLookupByLibrary.simpleMessage("Есть ли у вас гипертония?"),
"do_you_have_hypotension_tendency":
- MessageLookupByLibrary.simpleMessage(
- "Do you have a tendency for hypotension?"),
+ MessageLookupByLibrary.simpleMessage("Есть ли у вас гипотония?"),
"do_you_take_pills": MessageLookupByLibrary.simpleMessage(
- "Do you take any medications or supplements?"),
+ "Принимаете ли вы лекарства или бады?"),
"down_pressure":
- MessageLookupByLibrary.simpleMessage("Lower Pressure Readings:"),
- "draft": MessageLookupByLibrary.simpleMessage("Draft"),
- "email": MessageLookupByLibrary.simpleMessage("Email"),
- "email_empty":
- MessageLookupByLibrary.simpleMessage("Email address is required"),
- "email_invalid":
- MessageLookupByLibrary.simpleMessage("Invalid email address"),
+ MessageLookupByLibrary.simpleMessage("Нижние показатели давления:"),
+ "draft": MessageLookupByLibrary.simpleMessage("Черновик"),
+ "email": MessageLookupByLibrary.simpleMessage("Элетронная почта"),
+ "email_empty": MessageLookupByLibrary.simpleMessage(
+ "Необходимо ввести адрес электронной почты"),
+ "email_invalid": MessageLookupByLibrary.simpleMessage(
+ "Некорректный адрес электронной почты"),
"enter_additional_information": MessageLookupByLibrary.simpleMessage(
- "Enter any additional information at your discretion:"),
+ "Введите любую дополнительную информацию на своё усмотрение:"),
"enter_information":
- MessageLookupByLibrary.simpleMessage("Enter information..."),
- "exit": MessageLookupByLibrary.simpleMessage("Log Out"),
+ MessageLookupByLibrary.simpleMessage("Введите информацию..."),
+ "exit": MessageLookupByLibrary.simpleMessage("Выйти"),
+ "expand": MessageLookupByLibrary.simpleMessage("Показать полностью"),
+ "fats": MessageLookupByLibrary.simpleMessage("Жиры"),
"favorite_foods":
- MessageLookupByLibrary.simpleMessage("Favorite Foods"),
+ MessageLookupByLibrary.simpleMessage("Любимые продукты"),
"favorite_unfavorite_foods": MessageLookupByLibrary.simpleMessage(
- "Your Favorite/Least Favorite Foods?"),
- "female": MessageLookupByLibrary.simpleMessage("Female"),
+ "Ваши любимые/нелюбимые продукты питания?"),
+ "female": MessageLookupByLibrary.simpleMessage("Женский"),
"fill_in_information":
- MessageLookupByLibrary.simpleMessage("Fill in the information:"),
- "finish": MessageLookupByLibrary.simpleMessage("Finish"),
- "first_name": MessageLookupByLibrary.simpleMessage("First Name"),
- "first_name_empty":
- MessageLookupByLibrary.simpleMessage("First name is required"),
+ MessageLookupByLibrary.simpleMessage("Заполните информацию:"),
+ "finish": MessageLookupByLibrary.simpleMessage("Завершить"),
+ "first_name": MessageLookupByLibrary.simpleMessage("Имя"),
+ "first_name_empty": MessageLookupByLibrary.simpleMessage(
+ "Имя обязательно для заполнения"),
"first_name_short": MessageLookupByLibrary.simpleMessage(
- "First name must be at least 1 character long"),
- "gr": MessageLookupByLibrary.simpleMessage("g"),
- "grams": MessageLookupByLibrary.simpleMessage("g"),
+ "В имени должен быть минимум 1 символ"),
+ "gr": MessageLookupByLibrary.simpleMessage("гр"),
+ "grams": MessageLookupByLibrary.simpleMessage("гр"),
"height_measurements":
- MessageLookupByLibrary.simpleMessage("Height Measurement"),
+ MessageLookupByLibrary.simpleMessage("Замер роста"),
+ "hide": MessageLookupByLibrary.simpleMessage("Свернуть"),
"hip_circumference":
- MessageLookupByLibrary.simpleMessage("Hip Circumference"),
- "hips": MessageLookupByLibrary.simpleMessage("Hips"),
- "in_progress": MessageLookupByLibrary.simpleMessage("In Progress"),
+ MessageLookupByLibrary.simpleMessage("Обхват бедер"),
+ "hips": MessageLookupByLibrary.simpleMessage("Бедра"),
+ "in_progress": MessageLookupByLibrary.simpleMessage("В процессе"),
"initial_measurements":
- MessageLookupByLibrary.simpleMessage("Initial Measurements"),
- "language": MessageLookupByLibrary.simpleMessage("Language"),
- "last_name": MessageLookupByLibrary.simpleMessage("Last Name"),
- "last_name_empty":
- MessageLookupByLibrary.simpleMessage("Last name is required"),
+ MessageLookupByLibrary.simpleMessage("Первичные замеры"),
+ "language": MessageLookupByLibrary.simpleMessage("Язык"),
+ "last_name": MessageLookupByLibrary.simpleMessage("Фамилия"),
+ "last_name_empty": MessageLookupByLibrary.simpleMessage(
+ "Фамилия обязательна для заполнения"),
"last_name_short": MessageLookupByLibrary.simpleMessage(
- "Last name must be at least 6 characters long"),
+ "В фамилии должен быть минимум 6 символов"),
"lbl_english": MessageLookupByLibrary.simpleMessage("English"),
- "loading": MessageLookupByLibrary.simpleMessage("Loading..."),
- "male": MessageLookupByLibrary.simpleMessage("Male"),
+ "link_was_copied":
+ MessageLookupByLibrary.simpleMessage("Ссылка успешно скопирована"),
+ "loading": MessageLookupByLibrary.simpleMessage("Загрузка..."),
+ "male": MessageLookupByLibrary.simpleMessage("Мужской"),
+ "meal": MessageLookupByLibrary.simpleMessage("Приём пищи"),
+ "meat_type": MessageLookupByLibrary.simpleMessage("С мясом"),
+ "meat_type_desc": MessageLookupByLibrary.simpleMessage(
+ "Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму."),
+ "milliliter": MessageLookupByLibrary.simpleMessage("мл"),
"msg_network_err":
- MessageLookupByLibrary.simpleMessage("Network error!"),
+ MessageLookupByLibrary.simpleMessage("Сетевая ошибка!"),
"msg_something_went_wrong":
- MessageLookupByLibrary.simpleMessage("Something went wrong!"),
- "my_blog": MessageLookupByLibrary.simpleMessage("My Blog"),
- "my_settings": MessageLookupByLibrary.simpleMessage("My Settings"),
- "name_empty":
- MessageLookupByLibrary.simpleMessage("Username is required"),
+ MessageLookupByLibrary.simpleMessage("Что то пошло не так!"),
+ "my_blog": MessageLookupByLibrary.simpleMessage("Мой блог"),
+ "my_settings": MessageLookupByLibrary.simpleMessage("Мои настройки"),
+ "name_empty": MessageLookupByLibrary.simpleMessage(
+ "Имя пользователя обязательно для заполнения"),
"name_short": MessageLookupByLibrary.simpleMessage(
- "Username must be at least 6 characters long"),
- "no": MessageLookupByLibrary.simpleMessage("No"),
+ "В имени пользователя должно быть минимум 6 символов"),
+ "no": MessageLookupByLibrary.simpleMessage("Нет"),
"no_account":
- MessageLookupByLibrary.simpleMessage("I do not have an account"),
- "password": MessageLookupByLibrary.simpleMessage("Password"),
+ MessageLookupByLibrary.simpleMessage("У меня нет аккаунта"),
+ "password": MessageLookupByLibrary.simpleMessage("Пароль"),
"password_confirmation":
- MessageLookupByLibrary.simpleMessage("Confirm Password"),
+ MessageLookupByLibrary.simpleMessage("Подтвердите пароль"),
"password_confirmation_mismatch":
- MessageLookupByLibrary.simpleMessage("Passwords do not match"),
- "password_empty":
- MessageLookupByLibrary.simpleMessage("Password is required"),
+ MessageLookupByLibrary.simpleMessage("Пароли не совпадают"),
+ "password_empty": MessageLookupByLibrary.simpleMessage(
+ "Пароль обязателен для заполнения"),
"password_short": MessageLookupByLibrary.simpleMessage(
- "Password must be at least 6 characters long"),
- "pcs": MessageLookupByLibrary.simpleMessage("pcs"),
+ "В пароле должно быть минимум 6 символов"),
+ "pcs": MessageLookupByLibrary.simpleMessage("шт"),
"place_of_living":
- MessageLookupByLibrary.simpleMessage("Place of Residence"),
+ MessageLookupByLibrary.simpleMessage("Место проживания"),
"plans_complete":
- MessageLookupByLibrary.simpleMessage("Completed Plans"),
- "preferred_language": MessageLookupByLibrary.simpleMessage(
- "Preferred Language of Communication"),
+ MessageLookupByLibrary.simpleMessage("Пройденные планы"),
+ "preferred_language":
+ MessageLookupByLibrary.simpleMessage("Предпочитаемый язык общения"),
"pressure_empty": MessageLookupByLibrary.simpleMessage(
- "All blood pressure readings are required"),
+ "Все показатели давления обязательны к заполнению"),
"pressure_is_not_a_number": MessageLookupByLibrary.simpleMessage(
- "All blood pressure readings must be numbers"),
- "profile": MessageLookupByLibrary.simpleMessage("Profile"),
- "save": MessageLookupByLibrary.simpleMessage("Save"),
- "settings": MessageLookupByLibrary.simpleMessage("Settings"),
- "skip": MessageLookupByLibrary.simpleMessage("Skip"),
+ "Все показатели давления должны быть числами"),
+ "profile": MessageLookupByLibrary.simpleMessage("Профиль"),
+ "proteins": MessageLookupByLibrary.simpleMessage("Белки"),
+ "save": MessageLookupByLibrary.simpleMessage("Сохранить"),
+ "settings": MessageLookupByLibrary.simpleMessage("Настройки"),
+ "share": MessageLookupByLibrary.simpleMessage("Поделиться"),
+ "skip": MessageLookupByLibrary.simpleMessage("Пропустить"),
+ "startDiet": MessageLookupByLibrary.simpleMessage("Начать диету"),
"tell_your_schedule": MessageLookupByLibrary.simpleMessage(
- "Describe your daily routine freely, such as when you wake up, eat, and go to bed:"),
+ "Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:"),
"unfavorite_foods":
- MessageLookupByLibrary.simpleMessage("Least Favorite Foods"),
- "up_pressure":
- MessageLookupByLibrary.simpleMessage("Upper Pressure Readings:"),
+ MessageLookupByLibrary.simpleMessage("Нелюбимые продукты"),
+ "up_pressure": MessageLookupByLibrary.simpleMessage(
+ "Верхние показатели давления:"),
"user_authorization":
- MessageLookupByLibrary.simpleMessage("Authentication"),
+ MessageLookupByLibrary.simpleMessage("Аутентификация"),
"user_registration":
- MessageLookupByLibrary.simpleMessage("User Registration"),
- "username": MessageLookupByLibrary.simpleMessage("Username"),
- "waist": MessageLookupByLibrary.simpleMessage("Waist"),
+ MessageLookupByLibrary.simpleMessage("Регистрация пользователя"),
+ "username": MessageLookupByLibrary.simpleMessage("Имя пользователя"),
+ "vegan_type": MessageLookupByLibrary.simpleMessage("Вегетарианская"),
+ "vegan_type_desc": MessageLookupByLibrary.simpleMessage(
+ "Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья."),
+ "waist": MessageLookupByLibrary.simpleMessage("Талия"),
"waist_circumference":
- MessageLookupByLibrary.simpleMessage("Waist Circumference"),
- "weight": MessageLookupByLibrary.simpleMessage("Weight"),
- "weight_chart": MessageLookupByLibrary.simpleMessage("Weight Chart"),
+ MessageLookupByLibrary.simpleMessage("Обхват талии"),
+ "weight": MessageLookupByLibrary.simpleMessage("Вес"),
+ "weight_chart": MessageLookupByLibrary.simpleMessage("График веса"),
"weight_measurements":
- MessageLookupByLibrary.simpleMessage("Weight Measurement"),
+ MessageLookupByLibrary.simpleMessage("Замер веса"),
"what_is_your_name":
- MessageLookupByLibrary.simpleMessage("What is your name?"),
- "wrong_credentials":
- MessageLookupByLibrary.simpleMessage("Invalid user credentials"),
+ MessageLookupByLibrary.simpleMessage("Как вас зовут?"),
+ "wrong_credentials": MessageLookupByLibrary.simpleMessage(
+ "Неверные данные пользователя"),
"your_blood_pressure":
- MessageLookupByLibrary.simpleMessage("Your Blood Pressure?"),
+ MessageLookupByLibrary.simpleMessage("Ваше артериальное давление?"),
"your_favorite_sports":
- MessageLookupByLibrary.simpleMessage("Your Favorite Sports?"),
- "your_gender": MessageLookupByLibrary.simpleMessage("Your Gender?"),
- "your_height": MessageLookupByLibrary.simpleMessage("Your Height:"),
- "your_schedule":
- MessageLookupByLibrary.simpleMessage("Your Daily Routine?"),
- "your_weight": MessageLookupByLibrary.simpleMessage("Your Weight:")
+ MessageLookupByLibrary.simpleMessage("Ваши спортивные увлечения?"),
+ "your_gender": MessageLookupByLibrary.simpleMessage("Ваш пол?"),
+ "your_height": MessageLookupByLibrary.simpleMessage("Ваш рост:"),
+ "your_schedule": MessageLookupByLibrary.simpleMessage("Ваш режим дня?"),
+ "your_weight": MessageLookupByLibrary.simpleMessage("Ваш вес:")
};
}
diff --git a/lib/generated/intl/messages_ru.dart b/lib/generated/intl/messages_ru.dart
deleted file mode 100644
index 9c4da5f8..00000000
--- a/lib/generated/intl/messages_ru.dart
+++ /dev/null
@@ -1,175 +0,0 @@
-// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
-// This is a library that provides messages for a ru locale. All the
-// messages from the main program should be duplicated here with the same
-// function name.
-
-// Ignore issues from commonly used lints in this file.
-// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
-// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
-// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
-// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
-// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
-
-import 'package:intl/intl.dart';
-import 'package:intl/message_lookup_by_library.dart';
-
-final messages = new MessageLookup();
-
-typedef String MessageIfAbsent(String messageStr, List args);
-
-class MessageLookup extends MessageLookupByLibrary {
- String get localeName => 'ru';
-
- final messages = _notInlinedMessages(_notInlinedMessages);
- static Map _notInlinedMessages(_) => {
- "Moscow": MessageLookupByLibrary.simpleMessage("Москва"),
- "Russia": MessageLookupByLibrary.simpleMessage("Россия"),
- "active": MessageLookupByLibrary.simpleMessage("Активен"),
- "add_measure": MessageLookupByLibrary.simpleMessage("Добавить замер"),
- "additional_information":
- MessageLookupByLibrary.simpleMessage("Дополнительная информация"),
- "admin": MessageLookupByLibrary.simpleMessage("Админ"),
- "allergies_presence":
- MessageLookupByLibrary.simpleMessage("Наличие аллергии"),
- "archived": MessageLookupByLibrary.simpleMessage("В архиве"),
- "authentificate": MessageLookupByLibrary.simpleMessage("Войти"),
- "average_pressure": MessageLookupByLibrary.simpleMessage(
- "Средние показатели давления:"),
- "bodymass_chart": MessageLookupByLibrary.simpleMessage("График ИМТ"),
- "chat": MessageLookupByLibrary.simpleMessage("Чат"),
- "chest": MessageLookupByLibrary.simpleMessage("Грудь"),
- "chest_circumference":
- MessageLookupByLibrary.simpleMessage("Обхват груди"),
- "circumference_empty": MessageLookupByLibrary.simpleMessage(
- "Все замеры обязательны к заполнению"),
- "circumference_is_not_a_number": MessageLookupByLibrary.simpleMessage(
- "Все замеры должны быть числами"),
- "circumferences_chart":
- MessageLookupByLibrary.simpleMessage("График обхватов"),
- "city": MessageLookupByLibrary.simpleMessage("Город"),
- "city_of_living":
- MessageLookupByLibrary.simpleMessage("Город проживания"),
- "continueButton": MessageLookupByLibrary.simpleMessage("Продолжить"),
- "country": MessageLookupByLibrary.simpleMessage("Страна"),
- "date_of_birth": MessageLookupByLibrary.simpleMessage("Дата рождения"),
- "diary": MessageLookupByLibrary.simpleMessage("Дневник"),
- "do_you_have_hypertension_tendency":
- MessageLookupByLibrary.simpleMessage("Есть ли у вас гипертония?"),
- "do_you_have_hypotension_tendency":
- MessageLookupByLibrary.simpleMessage("Есть ли у вас гипотония?"),
- "do_you_take_pills": MessageLookupByLibrary.simpleMessage(
- "Принимаете ли вы лекарства или бады?"),
- "down_pressure":
- MessageLookupByLibrary.simpleMessage("Нижние показатели давления:"),
- "draft": MessageLookupByLibrary.simpleMessage("Черновик"),
- "email": MessageLookupByLibrary.simpleMessage("Элетронная почта"),
- "email_empty": MessageLookupByLibrary.simpleMessage(
- "Необходимо ввести адрес электронной почты"),
- "email_invalid": MessageLookupByLibrary.simpleMessage(
- "Некорректный адрес электронной почты"),
- "enter_additional_information": MessageLookupByLibrary.simpleMessage(
- "Введите любую дополнительную информацию на своё усмотрение:"),
- "enter_information":
- MessageLookupByLibrary.simpleMessage("Введите информацию..."),
- "exit": MessageLookupByLibrary.simpleMessage("Выйти"),
- "favorite_foods":
- MessageLookupByLibrary.simpleMessage("Любимые продукты"),
- "favorite_unfavorite_foods": MessageLookupByLibrary.simpleMessage(
- "Ваши любимые/нелюбимые продукты питания?"),
- "female": MessageLookupByLibrary.simpleMessage("Женский"),
- "fill_in_information":
- MessageLookupByLibrary.simpleMessage("Заполните информацию:"),
- "finish": MessageLookupByLibrary.simpleMessage("Завершить"),
- "first_name": MessageLookupByLibrary.simpleMessage("Имя"),
- "first_name_empty": MessageLookupByLibrary.simpleMessage(
- "Имя обязательно для заполнения"),
- "first_name_short": MessageLookupByLibrary.simpleMessage(
- "В имени должен быть минимум 1 символ"),
- "gr": MessageLookupByLibrary.simpleMessage("гр"),
- "grams": MessageLookupByLibrary.simpleMessage("гр"),
- "height_measurements":
- MessageLookupByLibrary.simpleMessage("Замер роста"),
- "hip_circumference":
- MessageLookupByLibrary.simpleMessage("Обхват бедер"),
- "hips": MessageLookupByLibrary.simpleMessage("Бедра"),
- "in_progress": MessageLookupByLibrary.simpleMessage("В процессе"),
- "initial_measurements":
- MessageLookupByLibrary.simpleMessage("Первичные замеры"),
- "language": MessageLookupByLibrary.simpleMessage("Язык"),
- "last_name": MessageLookupByLibrary.simpleMessage("Фамилия"),
- "last_name_empty": MessageLookupByLibrary.simpleMessage(
- "Фамилия обязательна для заполнения"),
- "last_name_short": MessageLookupByLibrary.simpleMessage(
- "В фамилии должен быть минимум 6 символов"),
- "lbl_english": MessageLookupByLibrary.simpleMessage("English"),
- "loading": MessageLookupByLibrary.simpleMessage("Загрузка..."),
- "male": MessageLookupByLibrary.simpleMessage("Мужской"),
- "msg_network_err":
- MessageLookupByLibrary.simpleMessage("Сетевая ошибка!"),
- "msg_something_went_wrong":
- MessageLookupByLibrary.simpleMessage("Что то пошло не так!"),
- "my_blog": MessageLookupByLibrary.simpleMessage("Мой блог"),
- "my_settings": MessageLookupByLibrary.simpleMessage("Мои настройки"),
- "name_empty": MessageLookupByLibrary.simpleMessage(
- "Имя пользователя обязательно для заполнения"),
- "name_short": MessageLookupByLibrary.simpleMessage(
- "В имени пользователя должно быть минимум 6 символов"),
- "no": MessageLookupByLibrary.simpleMessage("Нет"),
- "no_account":
- MessageLookupByLibrary.simpleMessage("У меня нет аккаунта"),
- "password": MessageLookupByLibrary.simpleMessage("Пароль"),
- "password_confirmation":
- MessageLookupByLibrary.simpleMessage("Подтвердите пароль"),
- "password_confirmation_mismatch":
- MessageLookupByLibrary.simpleMessage("Пароли не совпадают"),
- "password_empty": MessageLookupByLibrary.simpleMessage(
- "Пароль обязателен для заполнения"),
- "password_short": MessageLookupByLibrary.simpleMessage(
- "В пароле должно быть минимум 6 символов"),
- "pcs": MessageLookupByLibrary.simpleMessage("шт"),
- "place_of_living":
- MessageLookupByLibrary.simpleMessage("Место проживания"),
- "plans_complete":
- MessageLookupByLibrary.simpleMessage("Пройденные планы"),
- "preferred_language":
- MessageLookupByLibrary.simpleMessage("Предпочитаемый язык общения"),
- "pressure_empty": MessageLookupByLibrary.simpleMessage(
- "Все показатели давления обязательны к заполнению"),
- "pressure_is_not_a_number": MessageLookupByLibrary.simpleMessage(
- "Все показатели давления должны быть числами"),
- "profile": MessageLookupByLibrary.simpleMessage("Профиль"),
- "save": MessageLookupByLibrary.simpleMessage("Сохранить"),
- "settings": MessageLookupByLibrary.simpleMessage("Настройки"),
- "skip": MessageLookupByLibrary.simpleMessage("Пропустить"),
- "tell_your_schedule": MessageLookupByLibrary.simpleMessage(
- "Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:"),
- "unfavorite_foods":
- MessageLookupByLibrary.simpleMessage("Нелюбимые продукты"),
- "up_pressure": MessageLookupByLibrary.simpleMessage(
- "Верхние показатели давления:"),
- "user_authorization":
- MessageLookupByLibrary.simpleMessage("Аутентификация"),
- "user_registration":
- MessageLookupByLibrary.simpleMessage("Регистрация пользователя"),
- "username": MessageLookupByLibrary.simpleMessage("Имя пользователя"),
- "waist": MessageLookupByLibrary.simpleMessage("Талия"),
- "waist_circumference":
- MessageLookupByLibrary.simpleMessage("Обхват талии"),
- "weight": MessageLookupByLibrary.simpleMessage("Вес"),
- "weight_chart": MessageLookupByLibrary.simpleMessage("График веса"),
- "weight_measurements":
- MessageLookupByLibrary.simpleMessage("Замер веса"),
- "what_is_your_name":
- MessageLookupByLibrary.simpleMessage("Как вас зовут?"),
- "wrong_credentials": MessageLookupByLibrary.simpleMessage(
- "Неверные данные пользователя"),
- "your_blood_pressure":
- MessageLookupByLibrary.simpleMessage("Ваше артериальное давление?"),
- "your_favorite_sports":
- MessageLookupByLibrary.simpleMessage("Ваши спортивные увлечения?"),
- "your_gender": MessageLookupByLibrary.simpleMessage("Ваш пол?"),
- "your_height": MessageLookupByLibrary.simpleMessage("Ваш рост:"),
- "your_schedule": MessageLookupByLibrary.simpleMessage("Ваш режим дня?"),
- "your_weight": MessageLookupByLibrary.simpleMessage("Ваш вес:")
- };
-}
diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart
index 1d48044a..52cfc313 100644
--- a/lib/generated/l10n.dart
+++ b/lib/generated/l10n.dart
@@ -50,430 +50,430 @@ class S {
return Localizations.of(context, S);
}
- /// `User Registration`
+ /// `Регистрация пользователя`
String get user_registration {
return Intl.message(
- 'User Registration',
+ 'Регистрация пользователя',
name: 'user_registration',
desc: '',
args: [],
);
}
- /// `Email`
+ /// `Элетронная почта`
String get email {
return Intl.message(
- 'Email',
+ 'Элетронная почта',
name: 'email',
desc: '',
args: [],
);
}
- /// `Username`
+ /// `Имя пользователя`
String get username {
return Intl.message(
- 'Username',
+ 'Имя пользователя',
name: 'username',
desc: '',
args: [],
);
}
- /// `Password`
+ /// `Пароль`
String get password {
return Intl.message(
- 'Password',
+ 'Пароль',
name: 'password',
desc: '',
args: [],
);
}
- /// `Confirm Password`
+ /// `Подтвердите пароль`
String get password_confirmation {
return Intl.message(
- 'Confirm Password',
+ 'Подтвердите пароль',
name: 'password_confirmation',
desc: '',
args: [],
);
}
- /// `Invalid user credentials`
+ /// `Неверные данные пользователя`
String get wrong_credentials {
return Intl.message(
- 'Invalid user credentials',
+ 'Неверные данные пользователя',
name: 'wrong_credentials',
desc: '',
args: [],
);
}
- /// `First Name`
+ /// `Имя`
String get first_name {
return Intl.message(
- 'First Name',
+ 'Имя',
name: 'first_name',
desc: '',
args: [],
);
}
- /// `Last Name`
+ /// `Фамилия`
String get last_name {
return Intl.message(
- 'Last Name',
+ 'Фамилия',
name: 'last_name',
desc: '',
args: [],
);
}
- /// `What is your name?`
+ /// `Как вас зовут?`
String get what_is_your_name {
return Intl.message(
- 'What is your name?',
+ 'Как вас зовут?',
name: 'what_is_your_name',
desc: '',
args: [],
);
}
- /// `Date of Birth`
+ /// `Дата рождения`
String get date_of_birth {
return Intl.message(
- 'Date of Birth',
+ 'Дата рождения',
name: 'date_of_birth',
desc: '',
args: [],
);
}
- /// `Country`
+ /// `Страна`
String get country {
return Intl.message(
- 'Country',
+ 'Страна',
name: 'country',
desc: '',
args: [],
);
}
- /// `Russia`
+ /// `Россия`
String get Russia {
return Intl.message(
- 'Russia',
+ 'Россия',
name: 'Russia',
desc: '',
args: [],
);
}
- /// `City`
+ /// `Город`
String get city {
return Intl.message(
- 'City',
+ 'Город',
name: 'city',
desc: '',
args: [],
);
}
- /// `Moscow`
+ /// `Москва`
String get Moscow {
return Intl.message(
- 'Moscow',
+ 'Москва',
name: 'Moscow',
desc: '',
args: [],
);
}
- /// `Place of Residence`
+ /// `Место проживания`
String get place_of_living {
return Intl.message(
- 'Place of Residence',
+ 'Место проживания',
name: 'place_of_living',
desc: '',
args: [],
);
}
- /// `Hip Circumference`
+ /// `Обхват бедер`
String get hip_circumference {
return Intl.message(
- 'Hip Circumference',
+ 'Обхват бедер',
name: 'hip_circumference',
desc: '',
args: [],
);
}
- /// `Chest Circumference`
+ /// `Обхват груди`
String get chest_circumference {
return Intl.message(
- 'Chest Circumference',
+ 'Обхват груди',
name: 'chest_circumference',
desc: '',
args: [],
);
}
- /// `Waist Circumference`
+ /// `Обхват талии`
String get waist_circumference {
return Intl.message(
- 'Waist Circumference',
+ 'Обхват талии',
name: 'waist_circumference',
desc: '',
args: [],
);
}
- /// `Initial Measurements`
+ /// `Первичные замеры`
String get initial_measurements {
return Intl.message(
- 'Initial Measurements',
+ 'Первичные замеры',
name: 'initial_measurements',
desc: '',
args: [],
);
}
- /// `Male`
+ /// `Мужской`
String get male {
return Intl.message(
- 'Male',
+ 'Мужской',
name: 'male',
desc: '',
args: [],
);
}
- /// `Female`
+ /// `Женский`
String get female {
return Intl.message(
- 'Female',
+ 'Женский',
name: 'female',
desc: '',
args: [],
);
}
- /// `Weight Measurement`
+ /// `Замер веса`
String get weight_measurements {
return Intl.message(
- 'Weight Measurement',
+ 'Замер веса',
name: 'weight_measurements',
desc: '',
args: [],
);
}
- /// `Your Weight:`
+ /// `Ваш вес:`
String get your_weight {
return Intl.message(
- 'Your Weight:',
+ 'Ваш вес:',
name: 'your_weight',
desc: '',
args: [],
);
}
- /// `Height Measurement`
+ /// `Замер роста`
String get height_measurements {
return Intl.message(
- 'Height Measurement',
+ 'Замер роста',
name: 'height_measurements',
desc: '',
args: [],
);
}
- /// `Your Height:`
+ /// `Ваш рост:`
String get your_height {
return Intl.message(
- 'Your Height:',
+ 'Ваш рост:',
name: 'your_height',
desc: '',
args: [],
);
}
- /// `Presence of Allergies`
+ /// `Наличие аллергии`
String get allergies_presence {
return Intl.message(
- 'Presence of Allergies',
+ 'Наличие аллергии',
name: 'allergies_presence',
desc: '',
args: [],
);
}
- /// `Do you take any medications or supplements?`
+ /// `Принимаете ли вы лекарства или бады?`
String get do_you_take_pills {
return Intl.message(
- 'Do you take any medications or supplements?',
+ 'Принимаете ли вы лекарства или бады?',
name: 'do_you_take_pills',
desc: '',
args: [],
);
}
- /// `Your Gender?`
+ /// `Ваш пол?`
String get your_gender {
return Intl.message(
- 'Your Gender?',
+ 'Ваш пол?',
name: 'your_gender',
desc: '',
args: [],
);
}
- /// `No`
+ /// `Нет`
String get no {
return Intl.message(
- 'No',
+ 'Нет',
name: 'no',
desc: '',
args: [],
);
}
- /// `Do you have a tendency for hypertension?`
+ /// `Есть ли у вас гипертония?`
String get do_you_have_hypertension_tendency {
return Intl.message(
- 'Do you have a tendency for hypertension?',
+ 'Есть ли у вас гипертония?',
name: 'do_you_have_hypertension_tendency',
desc: '',
args: [],
);
}
- /// `Your Blood Pressure?`
+ /// `Ваше артериальное давление?`
String get your_blood_pressure {
return Intl.message(
- 'Your Blood Pressure?',
+ 'Ваше артериальное давление?',
name: 'your_blood_pressure',
desc: '',
args: [],
);
}
- /// `Average Pressure Readings:`
+ /// `Средние показатели давления:`
String get average_pressure {
return Intl.message(
- 'Average Pressure Readings:',
+ 'Средние показатели давления:',
name: 'average_pressure',
desc: '',
args: [],
);
}
- /// `Upper Pressure Readings:`
+ /// `Верхние показатели давления:`
String get up_pressure {
return Intl.message(
- 'Upper Pressure Readings:',
+ 'Верхние показатели давления:',
name: 'up_pressure',
desc: '',
args: [],
);
}
- /// `Lower Pressure Readings:`
+ /// `Нижние показатели давления:`
String get down_pressure {
return Intl.message(
- 'Lower Pressure Readings:',
+ 'Нижние показатели давления:',
name: 'down_pressure',
desc: '',
args: [],
);
}
- /// `Do you have a tendency for hypotension?`
+ /// `Есть ли у вас гипотония?`
String get do_you_have_hypotension_tendency {
return Intl.message(
- 'Do you have a tendency for hypotension?',
+ 'Есть ли у вас гипотония?',
name: 'do_you_have_hypotension_tendency',
desc: '',
args: [],
);
}
- /// `Your Favorite Sports?`
+ /// `Ваши спортивные увлечения?`
String get your_favorite_sports {
return Intl.message(
- 'Your Favorite Sports?',
+ 'Ваши спортивные увлечения?',
name: 'your_favorite_sports',
desc: '',
args: [],
);
}
- /// `Favorite Foods`
+ /// `Любимые продукты`
String get favorite_foods {
return Intl.message(
- 'Favorite Foods',
+ 'Любимые продукты',
name: 'favorite_foods',
desc: '',
args: [],
);
}
- /// `Your Favorite/Least Favorite Foods?`
+ /// `Ваши любимые/нелюбимые продукты питания?`
String get favorite_unfavorite_foods {
return Intl.message(
- 'Your Favorite/Least Favorite Foods?',
+ 'Ваши любимые/нелюбимые продукты питания?',
name: 'favorite_unfavorite_foods',
desc: '',
args: [],
);
}
- /// `Least Favorite Foods`
+ /// `Нелюбимые продукты`
String get unfavorite_foods {
return Intl.message(
- 'Least Favorite Foods',
+ 'Нелюбимые продукты',
name: 'unfavorite_foods',
desc: '',
args: [],
);
}
- /// `Your Daily Routine?`
+ /// `Ваш режим дня?`
String get your_schedule {
return Intl.message(
- 'Your Daily Routine?',
+ 'Ваш режим дня?',
name: 'your_schedule',
desc: '',
args: [],
);
}
- /// `Describe your daily routine freely, such as when you wake up, eat, and go to bed:`
+ /// `Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:`
String get tell_your_schedule {
return Intl.message(
- 'Describe your daily routine freely, such as when you wake up, eat, and go to bed:',
+ 'Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:',
name: 'tell_your_schedule',
desc: '',
args: [],
);
}
- /// `Additional Information`
+ /// `Дополнительная информация`
String get additional_information {
return Intl.message(
- 'Additional Information',
+ 'Дополнительная информация',
name: 'additional_information',
desc: '',
args: [],
);
}
- /// `Enter any additional information at your discretion:`
+ /// `Введите любую дополнительную информацию на своё усмотрение:`
String get enter_additional_information {
return Intl.message(
- 'Enter any additional information at your discretion:',
+ 'Введите любую дополнительную информацию на своё усмотрение:',
name: 'enter_additional_information',
desc: '',
args: [],
@@ -490,545 +490,865 @@ class S {
);
}
- /// `Finish`
+ /// `Завершить`
String get finish {
return Intl.message(
- 'Finish',
+ 'Завершить',
name: 'finish',
desc: '',
args: [],
);
}
- /// `Preferred Language of Communication`
+ /// `Предпочитаемый язык общения`
String get preferred_language {
return Intl.message(
- 'Preferred Language of Communication',
+ 'Предпочитаемый язык общения',
name: 'preferred_language',
desc: '',
args: [],
);
}
- /// `Continue`
+ /// `Продолжить`
String get continueButton {
return Intl.message(
- 'Continue',
+ 'Продолжить',
name: 'continueButton',
desc: '',
args: [],
);
}
- /// `Skip`
+ /// `Пропустить`
String get skip {
return Intl.message(
- 'Skip',
+ 'Пропустить',
name: 'skip',
desc: '',
args: [],
);
}
- /// `Fill in the information:`
+ /// `Заполните информацию:`
String get fill_in_information {
return Intl.message(
- 'Fill in the information:',
+ 'Заполните информацию:',
name: 'fill_in_information',
desc: '',
args: [],
);
}
- /// `Enter information...`
+ /// `Введите информацию...`
String get enter_information {
return Intl.message(
- 'Enter information...',
+ 'Введите информацию...',
name: 'enter_information',
desc: '',
args: [],
);
}
- /// `Network error!`
+ /// `Сетевая ошибка!`
String get msg_network_err {
return Intl.message(
- 'Network error!',
+ 'Сетевая ошибка!',
name: 'msg_network_err',
desc: '',
args: [],
);
}
- /// `Something went wrong!`
+ /// `Что то пошло не так!`
String get msg_something_went_wrong {
return Intl.message(
- 'Something went wrong!',
+ 'Что то пошло не так!',
name: 'msg_something_went_wrong',
desc: '',
args: [],
);
}
- /// `Email address is required`
+ /// `Необходимо ввести адрес электронной почты`
String get email_empty {
return Intl.message(
- 'Email address is required',
+ 'Необходимо ввести адрес электронной почты',
name: 'email_empty',
desc: '',
args: [],
);
}
- /// `Invalid email address`
+ /// `Некорректный адрес электронной почты`
String get email_invalid {
return Intl.message(
- 'Invalid email address',
+ 'Некорректный адрес электронной почты',
name: 'email_invalid',
desc: '',
args: [],
);
}
- /// `Password is required`
+ /// `Пароль обязателен для заполнения`
String get password_empty {
return Intl.message(
- 'Password is required',
+ 'Пароль обязателен для заполнения',
name: 'password_empty',
desc: '',
args: [],
);
}
- /// `Password must be at least 6 characters long`
+ /// `В пароле должно быть минимум 6 символов`
String get password_short {
return Intl.message(
- 'Password must be at least 6 characters long',
+ 'В пароле должно быть минимум 6 символов',
name: 'password_short',
desc: '',
args: [],
);
}
- /// `Username is required`
+ /// `Имя пользователя обязательно для заполнения`
String get name_empty {
return Intl.message(
- 'Username is required',
+ 'Имя пользователя обязательно для заполнения',
name: 'name_empty',
desc: '',
args: [],
);
}
- /// `Username must be at least 6 characters long`
+ /// `В имени пользователя должно быть минимум 6 символов`
String get name_short {
return Intl.message(
- 'Username must be at least 6 characters long',
+ 'В имени пользователя должно быть минимум 6 символов',
name: 'name_short',
desc: '',
args: [],
);
}
- /// `Passwords do not match`
+ /// `Пароли не совпадают`
String get password_confirmation_mismatch {
return Intl.message(
- 'Passwords do not match',
+ 'Пароли не совпадают',
name: 'password_confirmation_mismatch',
desc: '',
args: [],
);
}
- /// `First name is required`
+ /// `Имя обязательно для заполнения`
String get first_name_empty {
return Intl.message(
- 'First name is required',
+ 'Имя обязательно для заполнения',
name: 'first_name_empty',
desc: '',
args: [],
);
}
- /// `First name must be at least 1 character long`
+ /// `В имени должен быть минимум 1 символ`
String get first_name_short {
return Intl.message(
- 'First name must be at least 1 character long',
+ 'В имени должен быть минимум 1 символ',
name: 'first_name_short',
desc: '',
args: [],
);
}
- /// `Last name is required`
+ /// `Фамилия обязательна для заполнения`
String get last_name_empty {
return Intl.message(
- 'Last name is required',
+ 'Фамилия обязательна для заполнения',
name: 'last_name_empty',
desc: '',
args: [],
);
}
- /// `Last name must be at least 6 characters long`
+ /// `В фамилии должен быть минимум 6 символов`
String get last_name_short {
return Intl.message(
- 'Last name must be at least 6 characters long',
+ 'В фамилии должен быть минимум 6 символов',
name: 'last_name_short',
desc: '',
args: [],
);
}
- /// `All measurements are required`
+ /// `Все замеры обязательны к заполнению`
String get circumference_empty {
return Intl.message(
- 'All measurements are required',
+ 'Все замеры обязательны к заполнению',
name: 'circumference_empty',
desc: '',
args: [],
);
}
- /// `All measurements must be numbers`
+ /// `Все замеры должны быть числами`
String get circumference_is_not_a_number {
return Intl.message(
- 'All measurements must be numbers',
+ 'Все замеры должны быть числами',
name: 'circumference_is_not_a_number',
desc: '',
args: [],
);
}
- /// `All blood pressure readings are required`
+ /// `Все показатели давления обязательны к заполнению`
String get pressure_empty {
return Intl.message(
- 'All blood pressure readings are required',
+ 'Все показатели давления обязательны к заполнению',
name: 'pressure_empty',
desc: '',
args: [],
);
}
- /// `All blood pressure readings must be numbers`
+ /// `Все показатели давления должны быть числами`
String get pressure_is_not_a_number {
return Intl.message(
- 'All blood pressure readings must be numbers',
+ 'Все показатели давления должны быть числами',
name: 'pressure_is_not_a_number',
desc: '',
args: [],
);
}
- /// `I do not have an account`
+ /// `У меня нет аккаунта`
String get no_account {
return Intl.message(
- 'I do not have an account',
+ 'У меня нет аккаунта',
name: 'no_account',
desc: '',
args: [],
);
}
- /// `Log In`
+ /// `Войти`
String get authentificate {
return Intl.message(
- 'Log In',
+ 'Войти',
name: 'authentificate',
desc: '',
args: [],
);
}
- /// `Authentication`
+ /// `Аутентификация`
String get user_authorization {
return Intl.message(
- 'Authentication',
+ 'Аутентификация',
name: 'user_authorization',
desc: '',
args: [],
);
}
- /// `Loading...`
+ /// `Загрузка...`
String get loading {
return Intl.message(
- 'Loading...',
+ 'Загрузка...',
name: 'loading',
desc: '',
args: [],
);
}
- /// `Weight Chart`
+ /// `График веса`
String get weight_chart {
return Intl.message(
- 'Weight Chart',
+ 'График веса',
name: 'weight_chart',
desc: '',
args: [],
);
}
- /// `Circumference Chart`
+ /// `График обхватов`
String get circumferences_chart {
return Intl.message(
- 'Circumference Chart',
+ 'График обхватов',
name: 'circumferences_chart',
desc: '',
args: [],
);
}
- /// `City of Residence`
+ /// `Город проживания`
String get city_of_living {
return Intl.message(
- 'City of Residence',
+ 'Город проживания',
name: 'city_of_living',
desc: '',
args: [],
);
}
- /// `BMI Chart`
+ /// `График ИМТ`
String get bodymass_chart {
return Intl.message(
- 'BMI Chart',
+ 'График ИМТ',
name: 'bodymass_chart',
desc: '',
args: [],
);
}
- /// `Chest`
+ /// `Грудь`
String get chest {
return Intl.message(
- 'Chest',
+ 'Грудь',
name: 'chest',
desc: '',
args: [],
);
}
- /// `Waist`
+ /// `Талия`
String get waist {
return Intl.message(
- 'Waist',
+ 'Талия',
name: 'waist',
desc: '',
args: [],
);
}
- /// `Hips`
+ /// `Бедра`
String get hips {
return Intl.message(
- 'Hips',
+ 'Бедра',
name: 'hips',
desc: '',
args: [],
);
}
- /// `Log Out`
+ /// `Выйти`
String get exit {
return Intl.message(
- 'Log Out',
+ 'Выйти',
name: 'exit',
desc: '',
args: [],
);
}
- /// `Active`
+ /// `Активен`
String get active {
return Intl.message(
- 'Active',
+ 'Активен',
name: 'active',
desc: '',
args: [],
);
}
- /// `Archived`
+ /// `В архиве`
String get archived {
return Intl.message(
- 'Archived',
+ 'В архиве',
name: 'archived',
desc: '',
args: [],
);
}
- /// `Draft`
+ /// `Черновик`
String get draft {
return Intl.message(
- 'Draft',
+ 'Черновик',
name: 'draft',
desc: '',
args: [],
);
}
- /// `My Blog`
+ /// `Мой блог`
String get my_blog {
return Intl.message(
- 'My Blog',
+ 'Мой блог',
name: 'my_blog',
desc: '',
args: [],
);
}
- /// `Language`
+ /// `Язык`
String get language {
return Intl.message(
- 'Language',
+ 'Язык',
name: 'language',
desc: '',
args: [],
);
}
- /// `In Progress`
+ /// `В процессе`
String get in_progress {
return Intl.message(
- 'In Progress',
+ 'В процессе',
name: 'in_progress',
desc: '',
args: [],
);
}
- /// `Add Measurement`
+ /// `Добавить замер`
String get add_measure {
return Intl.message(
- 'Add Measurement',
+ 'Добавить замер',
name: 'add_measure',
desc: '',
args: [],
);
}
- /// `Weight`
+ /// `Вес`
String get weight {
return Intl.message(
- 'Weight',
+ 'Вес',
name: 'weight',
desc: '',
args: [],
);
}
- /// `Completed Plans`
+ /// `Пройденные планы`
String get plans_complete {
return Intl.message(
- 'Completed Plans',
+ 'Пройденные планы',
name: 'plans_complete',
desc: '',
args: [],
);
}
- /// `My Settings`
+ /// `Мои настройки`
String get my_settings {
return Intl.message(
- 'My Settings',
+ 'Мои настройки',
name: 'my_settings',
desc: '',
args: [],
);
}
- /// `Settings`
+ /// `Настройки`
String get settings {
return Intl.message(
- 'Settings',
+ 'Настройки',
name: 'settings',
desc: '',
args: [],
);
}
- /// `Profile`
+ /// `Профиль`
String get profile {
return Intl.message(
- 'Profile',
+ 'Профиль',
name: 'profile',
desc: '',
args: [],
);
}
- /// `Chat`
+ /// `Чат`
String get chat {
return Intl.message(
- 'Chat',
+ 'Чат',
name: 'chat',
desc: '',
args: [],
);
}
- /// `Admin`
+ /// `Админ`
String get admin {
return Intl.message(
- 'Admin',
+ 'Админ',
name: 'admin',
desc: '',
args: [],
);
}
- /// `Diary`
+ /// `Дневник`
String get diary {
return Intl.message(
- 'Diary',
+ 'Дневник',
name: 'diary',
desc: '',
args: [],
);
}
- /// `Save`
+ /// `Сохранить`
String get save {
return Intl.message(
- 'Save',
+ 'Сохранить',
name: 'save',
desc: '',
args: [],
);
}
- /// `pcs`
+ /// `шт`
String get pcs {
return Intl.message(
- 'pcs',
+ 'шт',
name: 'pcs',
desc: '',
args: [],
);
}
- /// `g`
+ /// `гр`
String get gr {
return Intl.message(
- 'g',
+ 'гр',
name: 'gr',
desc: '',
args: [],
);
}
- /// `g`
+ /// `мл`
+ String get milliliter {
+ return Intl.message(
+ 'мл',
+ name: 'milliliter',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `гр`
String get grams {
return Intl.message(
- 'g',
+ 'гр',
name: 'grams',
desc: '',
args: [],
);
}
+
+ /// `Начать диету`
+ String get startDiet {
+ return Intl.message(
+ 'Начать диету',
+ name: 'startDiet',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Комментарии`
+ String get comments {
+ return Intl.message(
+ 'Комментарии',
+ name: 'comments',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `комментарий`
+ String get comment {
+ return Intl.message(
+ 'комментарий',
+ name: 'comment',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `комментария`
+ String get another_form_of_comment {
+ return Intl.message(
+ 'комментария',
+ name: 'another_form_of_comment',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Об этой диете`
+ String get about_diet {
+ return Intl.message(
+ 'Об этой диете',
+ name: 'about_diet',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `дней`
+ String get days {
+ return Intl.message(
+ 'дней',
+ name: 'days',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `День`
+ String get day {
+ return Intl.message(
+ 'День',
+ name: 'day',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `дня`
+ String get another_form_of_day {
+ return Intl.message(
+ 'дня',
+ name: 'another_form_of_day',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `комментариев`
+ String get comments_plural {
+ return Intl.message(
+ 'комментариев',
+ name: 'comments_plural',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Приём пищи`
+ String get meal {
+ return Intl.message(
+ 'Приём пищи',
+ name: 'meal',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Автор диеты`
+ String get diet_author {
+ return Intl.message(
+ 'Автор диеты',
+ name: 'diet_author',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Свернуть`
+ String get hide {
+ return Intl.message(
+ 'Свернуть',
+ name: 'hide',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Показать полностью`
+ String get expand {
+ return Intl.message(
+ 'Показать полностью',
+ name: 'expand',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Скопировать ссылку`
+ String get copy_link {
+ return Intl.message(
+ 'Скопировать ссылку',
+ name: 'copy_link',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Поделиться`
+ String get share {
+ return Intl.message(
+ 'Поделиться',
+ name: 'share',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Пожаловаться`
+ String get complain {
+ return Intl.message(
+ 'Пожаловаться',
+ name: 'complain',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Вегетарианская`
+ String get vegan_type {
+ return Intl.message(
+ 'Вегетарианская',
+ name: 'vegan_type',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Алкоголь`
+ String get alko_type {
+ return Intl.message(
+ 'Алкоголь',
+ name: 'alko_type',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `С мясом`
+ String get meat_type {
+ return Intl.message(
+ 'С мясом',
+ name: 'meat_type',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Мучное`
+ String get corb_type {
+ return Intl.message(
+ 'Мучное',
+ name: 'corb_type',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья.`
+ String get vegan_type_desc {
+ return Intl.message(
+ 'Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья.',
+ name: 'vegan_type_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками.`
+ String get alko_type_desc {
+ return Intl.message(
+ 'С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками.',
+ name: 'alko_type_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы.`
+ String get corb_type_desc {
+ return Intl.message(
+ 'Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы.',
+ name: 'corb_type_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму.`
+ String get meat_type_desc {
+ return Intl.message(
+ 'Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму.',
+ name: 'meat_type_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `План диеты`
+ String get diet_plan {
+ return Intl.message(
+ 'План диеты',
+ name: 'diet_plan',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Калории`
+ String get calories {
+ return Intl.message(
+ 'Калории',
+ name: 'calories',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Белки`
+ String get proteins {
+ return Intl.message(
+ 'Белки',
+ name: 'proteins',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Жиры`
+ String get fats {
+ return Intl.message(
+ 'Жиры',
+ name: 'fats',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Углеводы`
+ String get carbohydrates {
+ return Intl.message(
+ 'Углеводы',
+ name: 'carbohydrates',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Ответить`
+ String get answer {
+ return Intl.message(
+ 'Ответить',
+ name: 'answer',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Ссылка успешно скопирована`
+ String get link_was_copied {
+ return Intl.message(
+ 'Ссылка успешно скопирована',
+ name: 'link_was_copied',
+ desc: '',
+ args: [],
+ );
+ }
}
class AppLocalizationDelegate extends LocalizationsDelegate {
@@ -1037,7 +1357,6 @@ class AppLocalizationDelegate extends LocalizationsDelegate {
List get supportedLocales {
return const [
Locale.fromSubtags(languageCode: 'en'),
- Locale.fromSubtags(languageCode: 'ru'),
];
}
diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb
index a204a347..bb9f8e9d 100644
--- a/lib/l10n/intl_en.arb
+++ b/lib/l10n/intl_en.arb
@@ -1,100 +1,132 @@
{
- "user_registration": "User Registration",
- "email": "Email",
- "username": "Username",
- "password": "Password",
- "password_confirmation": "Confirm Password",
- "wrong_credentials": "Invalid user credentials",
- "first_name": "First Name",
- "last_name": "Last Name",
- "what_is_your_name": "What is your name?",
- "date_of_birth": "Date of Birth",
- "country": "Country",
- "Russia": "Russia",
- "city": "City",
- "Moscow": "Moscow",
- "place_of_living": "Place of Residence",
- "hip_circumference": "Hip Circumference",
- "chest_circumference": "Chest Circumference",
- "waist_circumference": "Waist Circumference",
- "initial_measurements": "Initial Measurements",
- "male": "Male",
- "female": "Female",
- "weight_measurements": "Weight Measurement",
- "your_weight": "Your Weight:",
- "height_measurements": "Height Measurement",
- "your_height": "Your Height:",
- "allergies_presence": "Presence of Allergies",
- "do_you_take_pills": "Do you take any medications or supplements?",
- "your_gender": "Your Gender?",
- "no": "No",
- "do_you_have_hypertension_tendency": "Do you have a tendency for hypertension?",
- "your_blood_pressure": "Your Blood Pressure?",
- "average_pressure": "Average Pressure Readings:",
- "up_pressure": "Upper Pressure Readings:",
- "down_pressure": "Lower Pressure Readings:",
- "do_you_have_hypotension_tendency": "Do you have a tendency for hypotension?",
- "your_favorite_sports": "Your Favorite Sports?",
- "favorite_foods": "Favorite Foods",
- "favorite_unfavorite_foods": "Your Favorite/Least Favorite Foods?",
- "unfavorite_foods": "Least Favorite Foods",
- "your_schedule": "Your Daily Routine?",
- "tell_your_schedule": "Describe your daily routine freely, such as when you wake up, eat, and go to bed:",
- "additional_information": "Additional Information",
- "enter_additional_information": "Enter any additional information at your discretion:",
+ "user_registration": "Регистрация пользователя",
+ "email": "Элетронная почта",
+ "username": "Имя пользователя",
+ "password": "Пароль",
+ "password_confirmation": "Подтвердите пароль",
+ "wrong_credentials": "Неверные данные пользователя",
+ "first_name": "Имя",
+ "last_name": "Фамилия",
+ "what_is_your_name": "Как вас зовут?",
+ "date_of_birth": "Дата рождения",
+ "country": "Страна",
+ "Russia": "Россия",
+ "city": "Город",
+ "Moscow": "Москва",
+ "place_of_living": "Место проживания",
+ "hip_circumference": "Обхват бедер",
+ "chest_circumference": "Обхват груди",
+ "waist_circumference": "Обхват талии",
+ "initial_measurements": "Первичные замеры",
+ "male": "Мужской",
+ "female": "Женский",
+ "weight_measurements": "Замер веса",
+ "your_weight": "Ваш вес:",
+ "height_measurements": "Замер роста",
+ "your_height": "Ваш рост:",
+ "allergies_presence": "Наличие аллергии",
+ "do_you_take_pills": "Принимаете ли вы лекарства или бады?",
+ "your_gender": "Ваш пол?",
+ "no": "Нет",
+ "do_you_have_hypertension_tendency": "Есть ли у вас гипертония?",
+ "your_blood_pressure": "Ваше артериальное давление?",
+ "average_pressure": "Средние показатели давления:",
+ "up_pressure": "Верхние показатели давления:",
+ "down_pressure": "Нижние показатели давления:",
+ "do_you_have_hypotension_tendency": "Есть ли у вас гипотония?",
+ "your_favorite_sports": "Ваши спортивные увлечения?",
+ "favorite_foods": "Любимые продукты",
+ "favorite_unfavorite_foods": "Ваши любимые/нелюбимые продукты питания?",
+ "unfavorite_foods": "Нелюбимые продукты",
+ "your_schedule": "Ваш режим дня?",
+ "tell_your_schedule": "Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:",
+ "additional_information": "Дополнительная информация",
+ "enter_additional_information": "Введите любую дополнительную информацию на своё усмотрение:",
"lbl_english": "English",
- "finish": "Finish",
- "preferred_language": "Preferred Language of Communication",
- "continueButton": "Continue",
- "skip": "Skip",
- "fill_in_information": "Fill in the information:",
- "enter_information": "Enter information...",
- "msg_network_err": "Network error!",
- "msg_something_went_wrong": "Something went wrong!",
- "email_empty": "Email address is required",
- "email_invalid": "Invalid email address",
- "password_empty": "Password is required",
- "password_short": "Password must be at least 6 characters long",
- "name_empty": "Username is required",
- "name_short": "Username must be at least 6 characters long",
- "password_confirmation_mismatch": "Passwords do not match",
- "first_name_empty": "First name is required",
- "first_name_short": "First name must be at least 1 character long",
- "last_name_empty": "Last name is required",
- "last_name_short": "Last name must be at least 6 characters long",
- "circumference_empty": "All measurements are required",
- "circumference_is_not_a_number": "All measurements must be numbers",
- "pressure_empty": "All blood pressure readings are required",
- "pressure_is_not_a_number": "All blood pressure readings must be numbers",
- "no_account": "I do not have an account",
- "authentificate": "Log In",
- "user_authorization": "Authentication",
- "loading": "Loading...",
- "weight_chart": "Weight Chart",
- "circumferences_chart": "Circumference Chart",
- "city_of_living": "City of Residence",
- "bodymass_chart": "BMI Chart",
- "chest": "Chest",
- "waist": "Waist",
- "hips": "Hips",
- "exit": "Log Out",
- "active": "Active",
- "archived": "Archived",
- "draft": "Draft",
- "my_blog": "My Blog",
- "language": "Language",
- "in_progress": "In Progress",
- "add_measure": "Add Measurement",
- "weight": "Weight",
- "plans_complete": "Completed Plans",
- "my_settings": "My Settings",
- "settings": "Settings",
- "profile": "Profile",
- "chat": "Chat",
- "admin": "Admin",
- "diary": "Diary",
- "save": "Save",
- "pcs": "pcs",
- "gr": "g",
- "grams": "g"
+ "finish": "Завершить",
+ "preferred_language": "Предпочитаемый язык общения",
+ "continueButton": "Продолжить",
+ "skip": "Пропустить",
+ "fill_in_information": "Заполните информацию:",
+ "enter_information": "Введите информацию...",
+ "msg_network_err": "Сетевая ошибка!",
+ "msg_something_went_wrong": "Что то пошло не так!",
+ "email_empty": "Необходимо ввести адрес электронной почты",
+ "email_invalid": "Некорректный адрес электронной почты",
+ "password_empty": "Пароль обязателен для заполнения",
+ "password_short": "В пароле должно быть минимум 6 символов",
+ "name_empty": "Имя пользователя обязательно для заполнения",
+ "name_short": "В имени пользователя должно быть минимум 6 символов",
+ "password_confirmation_mismatch": "Пароли не совпадают",
+ "first_name_empty": "Имя обязательно для заполнения",
+ "first_name_short": "В имени должен быть минимум 1 символ",
+ "last_name_empty": "Фамилия обязательна для заполнения",
+ "last_name_short": "В фамилии должен быть минимум 6 символов",
+ "circumference_empty": "Все замеры обязательны к заполнению",
+ "circumference_is_not_a_number": "Все замеры должны быть числами",
+ "pressure_empty": "Все показатели давления обязательны к заполнению",
+ "pressure_is_not_a_number": "Все показатели давления должны быть числами",
+ "no_account": "У меня нет аккаунта",
+ "authentificate": "Войти",
+ "user_authorization": "Аутентификация",
+ "loading": "Загрузка...",
+ "weight_chart": "График веса",
+ "circumferences_chart": "График обхватов",
+ "city_of_living": "Город проживания",
+ "bodymass_chart": "График ИМТ",
+ "chest": "Грудь",
+ "waist": "Талия",
+ "hips": "Бедра",
+ "exit": "Выйти",
+ "active": "Активен",
+ "archived": "В архиве",
+ "draft": "Черновик",
+ "my_blog": "Мой блог",
+ "language": "Язык",
+ "in_progress": "В процессе",
+ "add_measure": "Добавить замер",
+ "weight": "Вес",
+ "plans_complete": "Пройденные планы",
+ "my_settings": "Мои настройки",
+ "settings": "Настройки",
+ "profile": "Профиль",
+ "chat": "Чат",
+ "admin": "Админ",
+ "diary": "Дневник",
+ "save": "Сохранить",
+ "pcs": "шт",
+ "gr": "гр",
+ "milliliter": "мл",
+ "grams": "гр",
+ "startDiet": "Начать диету",
+ "comments": "Комментарии",
+ "comment": "комментарий",
+ "another_form_of_comment": "комментария",
+ "about_diet": "Об этой диете",
+ "days": "дней",
+ "day": "День",
+ "another_form_of_day": "дня",
+ "comments_plural": "комментариев",
+ "meal": "Приём пищи",
+ "diet_author": "Автор диеты",
+ "hide": "Свернуть",
+ "expand": "Показать полностью",
+ "copy_link": "Скопировать ссылку",
+ "share": "Поделиться",
+ "complain": "Пожаловаться",
+ "vegan_type": "Вегетарианская",
+ "alko_type": "Алкоголь",
+ "meat_type": "С мясом",
+ "corb_type": "Мучное",
+ "vegan_type_desc": "Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья.",
+ "alko_type_desc": "С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками.",
+ "corb_type_desc": "Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы.",
+ "meat_type_desc": "Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму.",
+ "diet_plan": "План диеты",
+ "calories": "Калории",
+ "proteins": "Белки",
+ "fats": "Жиры",
+ "carbohydrates": "Углеводы",
+ "answer": "Ответить",
+ "link_was_copied": "Ссылка успешно скопирована"
}
diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb
deleted file mode 100644
index 8d2d512c..00000000
--- a/lib/l10n/intl_ru.arb
+++ /dev/null
@@ -1,100 +0,0 @@
-{
- "user_registration": "Регистрация пользователя",
- "email": "Элетронная почта",
- "username": "Имя пользователя",
- "password": "Пароль",
- "password_confirmation": "Подтвердите пароль",
- "wrong_credentials": "Неверные данные пользователя",
- "first_name": "Имя",
- "last_name": "Фамилия",
- "what_is_your_name": "Как вас зовут?",
- "date_of_birth": "Дата рождения",
- "country": "Страна",
- "Russia": "Россия",
- "city": "Город",
- "Moscow": "Москва",
- "place_of_living": "Место проживания",
- "hip_circumference": "Обхват бедер",
- "chest_circumference": "Обхват груди",
- "waist_circumference": "Обхват талии",
- "initial_measurements": "Первичные замеры",
- "male": "Мужской",
- "female": "Женский",
- "weight_measurements": "Замер веса",
- "your_weight": "Ваш вес:",
- "height_measurements": "Замер роста",
- "your_height": "Ваш рост:",
- "allergies_presence": "Наличие аллергии",
- "do_you_take_pills": "Принимаете ли вы лекарства или бады?",
- "your_gender": "Ваш пол?",
- "no": "Нет",
- "do_you_have_hypertension_tendency": "Есть ли у вас гипертония?",
- "your_blood_pressure": "Ваше артериальное давление?",
- "average_pressure": "Средние показатели давления:",
- "up_pressure": "Верхние показатели давления:",
- "down_pressure": "Нижние показатели давления:",
- "do_you_have_hypotension_tendency": "Есть ли у вас гипотония?",
- "your_favorite_sports": "Ваши спортивные увлечения?",
- "favorite_foods": "Любимые продукты",
- "favorite_unfavorite_foods": "Ваши любимые/нелюбимые продукты питания?",
- "unfavorite_foods": "Нелюбимые продукты",
- "your_schedule": "Ваш режим дня?",
- "tell_your_schedule": "Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:",
- "additional_information": "Дополнительная информация",
- "enter_additional_information": "Введите любую дополнительную информацию на своё усмотрение:",
- "lbl_english": "English",
- "finish": "Завершить",
- "preferred_language": "Предпочитаемый язык общения",
- "continueButton": "Продолжить",
- "skip": "Пропустить",
- "fill_in_information": "Заполните информацию:",
- "enter_information": "Введите информацию...",
- "msg_network_err": "Сетевая ошибка!",
- "msg_something_went_wrong": "Что то пошло не так!",
- "email_empty": "Необходимо ввести адрес электронной почты",
- "email_invalid": "Некорректный адрес электронной почты",
- "password_empty": "Пароль обязателен для заполнения",
- "password_short": "В пароле должно быть минимум 6 символов",
- "name_empty": "Имя пользователя обязательно для заполнения",
- "name_short": "В имени пользователя должно быть минимум 6 символов",
- "password_confirmation_mismatch": "Пароли не совпадают",
- "first_name_empty": "Имя обязательно для заполнения",
- "first_name_short": "В имени должен быть минимум 1 символ",
- "last_name_empty": "Фамилия обязательна для заполнения",
- "last_name_short": "В фамилии должен быть минимум 6 символов",
- "circumference_empty": "Все замеры обязательны к заполнению",
- "circumference_is_not_a_number": "Все замеры должны быть числами",
- "pressure_empty": "Все показатели давления обязательны к заполнению",
- "pressure_is_not_a_number": "Все показатели давления должны быть числами",
- "no_account": "У меня нет аккаунта",
- "authentificate": "Войти",
- "user_authorization": "Аутентификация",
- "loading": "Загрузка...",
- "weight_chart": "График веса",
- "circumferences_chart": "График обхватов",
- "city_of_living": "Город проживания",
- "bodymass_chart": "График ИМТ",
- "chest": "Грудь",
- "waist": "Талия",
- "hips": "Бедра",
- "exit": "Выйти",
- "active": "Активен",
- "archived": "В архиве",
- "draft": "Черновик",
- "my_blog": "Мой блог",
- "language": "Язык",
- "in_progress": "В процессе",
- "add_measure": "Добавить замер",
- "weight": "Вес",
- "plans_complete": "Пройденные планы",
- "my_settings": "Мои настройки",
- "settings": "Настройки",
- "profile": "Профиль",
- "chat": "Чат",
- "admin": "Админ",
- "diary": "Дневник",
- "save": "Сохранить",
- "pcs": "шт",
- "gr": "гр",
- "grams": "гр"
-}
\ No newline at end of file
diff --git a/lib/main.dart b/lib/main.dart
index ce09857f..4bb339cd 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -9,6 +9,7 @@ import 'package:eatvio_app/theme/theme_helper.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
+import 'package:flutter_portal/flutter_portal.dart';
import 'package:keyboard_dismisser/keyboard_dismisser.dart';
Future main() async {
@@ -26,18 +27,20 @@ class MyApp extends StatelessWidget {
BlocProvider(create: (context) => sl()),
BlocProvider(create: (context) => sl()),
],
- child: KeyboardDismisser(
- child: MaterialApp.router(
- theme: ThemeHelper().themeData(),
- routerConfig: AppRouter.appRouter,
- debugShowCheckedModeBanner: false,
- localizationsDelegates: const [
- S.delegate,
- GlobalMaterialLocalizations.delegate,
- GlobalWidgetsLocalizations.delegate,
- GlobalCupertinoLocalizations.delegate,
- ],
- supportedLocales: S.delegate.supportedLocales,
+ child: Portal(
+ child: KeyboardDismisser(
+ child: MaterialApp.router(
+ theme: ThemeHelper().themeData(),
+ routerConfig: AppRouter.appRouter,
+ debugShowCheckedModeBanner: false,
+ localizationsDelegates: const [
+ S.delegate,
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ GlobalCupertinoLocalizations.delegate,
+ ],
+ supportedLocales: S.delegate.supportedLocales,
+ ),
),
),
);
diff --git a/lib/theme/custom_text_style.dart b/lib/theme/custom_text_style.dart
index 7cf7b69e..59f10924 100644
--- a/lib/theme/custom_text_style.dart
+++ b/lib/theme/custom_text_style.dart
@@ -165,6 +165,8 @@ class CustomTextStyles {
static get titleSmallSegoeUIOnPrimary => theme.textTheme.titleSmall!.segoeUI.copyWith(
color: theme.colorScheme.onPrimary,
);
+
+
}
extension on TextStyle {
@@ -176,3 +178,5 @@ extension on TextStyle {
return copyWith();
}
}
+
+
diff --git a/lib/theme/theme_helper.dart b/lib/theme/theme_helper.dart
index ab5c1d2d..0841f960 100644
--- a/lib/theme/theme_helper.dart
+++ b/lib/theme/theme_helper.dart
@@ -164,6 +164,12 @@ class PrimaryColors {
Color get whiteA700 => Color(0XFFFFFFFF);
Color get backgroundAvatar => Color(0xFFEBF4FF);
+
+ Color get cardBackground => Color(0xFFF7FAFF);
+
+ Color get dividerColor => Color(0xFFF1F2F6);
+
+ Color get grey => Color(0xFF6D6F71);
}
PrimaryColors get appTheme => ThemeHelper().themeColor();
diff --git a/pubspec.yaml b/pubspec.yaml
index b589dd00..5ace4bf8 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -50,6 +50,8 @@ dependencies:
rive: ^0.13.15
mask_text_input_formatter: ^2.9.0
lottie: ^3.1.3
+ flutter_portal: ^1.1.4
+ fluttertoast: ^8.2.8
dev_dependencies:
build_runner: ^2.4.13