From a778257215ab1ff822224f01ef400904be00c64b Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Mon, 12 Jan 2026 16:31:22 +0300 Subject: [PATCH 01/10] chore: enhance markdown processing and UI adjustments in comments input --- .../presentation/pages/blog_post_screen.dart | 181 +++++++++--------- .../presentation/pages/about_diet_screen.dart | 5 +- .../presentation/widgets/expandable_text.dart | 121 +++++++++++- .../widgets/blog_post_widget.dart | 110 ++++++++--- .../presentation/widgets/diets_widget.dart | 12 +- .../presentation/widgets/plan_widget.dart | 12 +- .../presentation/widgets/recipes_widget.dart | 12 +- .../presentation/widgets/my_diet_widget.dart | 12 +- .../presentation/widgets/my_plan_widget.dart | 12 +- .../presentation/pages/about_plan_screen.dart | 7 +- .../widgets/profile_blog_post_widget.dart | 110 ++++++++--- .../pages/about_recipe_screen.dart | 174 ++++++++--------- .../widgets/my_recipe_widget.dart | 12 +- pubspec.yaml | 2 +- 14 files changed, 516 insertions(+), 266 deletions(-) diff --git a/lib/features/blog_post/presentation/pages/blog_post_screen.dart b/lib/features/blog_post/presentation/pages/blog_post_screen.dart index 139f9d10..193fa9e2 100644 --- a/lib/features/blog_post/presentation/pages/blog_post_screen.dart +++ b/lib/features/blog_post/presentation/pages/blog_post_screen.dart @@ -79,98 +79,99 @@ class _BlogPostScreenState extends State { resizeToAvoidBottomInset: true, bottomSheet: Container( padding: EdgeInsets.only( - top: 12, - bottom: 12 + MediaQuery.of(context).padding.bottom + 56, // 56 - высота bottomNavigationBar + bottom: MediaQuery.of(context).padding.bottom + 8, ), decoration: BoxDecoration( color: Colors.white, border: Border(top: BorderSide(color: Colors.black.withValues(alpha: 0.1))), ), - child: 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: const Icon(Icons.close_rounded, size: 18, color: Colors.white), - ), - ), - if (replyId != null) const SizedBox(width: 8), - SizedBox( - width: MediaQuery.of(context).size.width - (replyId == null ? 64 : 104), - child: ConstrainedBox( - constraints: const BoxConstraints(minHeight: 52), - child: TextFormField( - textCapitalization: TextCapitalization.sentences, - onChanged: (_) { - setState(() {}); + child: Padding( + padding: const EdgeInsets.fromLTRB(16, 12, 16, 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (replyId != null) + GestureDetector( + onTap: () { + context.read().setReplyId(null); + setState(() { + replyId = null; + textEditingController.clear(); + }); + FocusManager.instance.primaryFocus?.unfocus(); }, - controller: textEditingController, - maxLines: 5, - minLines: 1, - keyboardType: TextInputType.multiline, - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: Colors.black, height: 1.2), - decoration: InputDecoration( - isDense: false, - // убираем true, чтобы padding учитывался корректно - contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), - // вертикальный паддинг увеличен - hintText: 'Комментарий', - hintStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, height: 1.2, color: Color(0xFFAEAEB2)), - filled: true, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(16), - borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(16), - borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(16), - borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), + child: Container( + decoration: BoxDecoration(color: appTheme.blueA400, shape: BoxShape.circle), + height: 32, + width: 32, + child: const Icon(Icons.close_rounded, size: 18, color: Colors.white), + ), + ), + if (replyId != null) const SizedBox(width: 8), + Expanded( + child: ConstrainedBox( + constraints: const BoxConstraints(minHeight: 52), + child: TextFormField( + textCapitalization: TextCapitalization.sentences, + onChanged: (_) { + setState(() {}); + }, + controller: textEditingController, + maxLines: 5, + minLines: 1, + keyboardType: TextInputType.multiline, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: Colors.black, height: 1.2), + decoration: InputDecoration( + isDense: false, + // убираем true, чтобы padding учитывался корректно + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + // вертикальный паддинг увеличен + hintText: 'Комментарий', + hintStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, height: 1.2, color: Color(0xFFAEAEB2)), + filled: true, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(16), + borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(16), + borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(16), + borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), + ), ), ), ), ), - ), - const SizedBox(width: 8), - GestureDetector( - onTap: () { - if (textEditingController.text.length > 2) { - commentsCubit.sendComment( - id: widget.id.toString(), - commentText: textEditingController.text, - parentCommentId: replyId, - commentSourceType: CommentSourceType.blogPost, - ); - 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: const Icon(Icons.send_rounded, size: 18, color: Colors.white), + const SizedBox(width: 8), + GestureDetector( + onTap: () { + if (textEditingController.text.length > 2) { + commentsCubit.sendComment( + id: widget.id.toString(), + commentText: textEditingController.text, + parentCommentId: replyId, + commentSourceType: CommentSourceType.blogPost, + ); + 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: const Icon(Icons.send_rounded, size: 18, color: Colors.white), + ), ), - ), - ], + ], + ), ), ), appBar: AppBar( @@ -285,15 +286,23 @@ class _BlogPostScreenState extends State { description = result; - final htmlData = md.markdownToHtml(description.replaceAll('\n', '
'), extensionSet: md.ExtensionSet.commonMark); - debugPrint('Markdown input: ${blogPostState.blogPostModel!.description}'); - debugPrint('Processed markdown: $description'); - debugPrint('HTML output: $htmlData'); + // Гарантируем, что жирный текст будет распознан + // Заменяем **текст** на текст вручную для надежности + final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); + description = description.replaceAllMapped(boldRegex, (match) { + return '${match.group(1)}'; + }); + + final htmlData = md.markdownToHtml( + description, + extensionSet: md.ExtensionSet.gitHubFlavored, + ); return Html( data: htmlData, style: { - "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5)), + "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5), color: Colors.black87), "p": Style(margin: Margins.only(bottom: 12), color: Colors.black87), + "b, strong": Style(fontWeight: FontWeight.bold, color: Colors.black), "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: Colors.black, fontWeight: FontWeight.bold), "h1": Style(fontSize: FontSize(24)), "h2": Style(fontSize: FontSize(20)), diff --git a/lib/features/diets/presentation/pages/about_diet_screen.dart b/lib/features/diets/presentation/pages/about_diet_screen.dart index 82ab3144..54d74215 100644 --- a/lib/features/diets/presentation/pages/about_diet_screen.dart +++ b/lib/features/diets/presentation/pages/about_diet_screen.dart @@ -106,15 +106,14 @@ class _AboutDietScreenState extends State { resizeToAvoidBottomInset: true, bottomSheet: Container( padding: EdgeInsets.only( - top: 12, - bottom: 12 + MediaQuery.of(context).padding.bottom + 56, // 56 - высота bottomNavigationBar + bottom: MediaQuery.of(context).padding.bottom + 8, ), decoration: BoxDecoration( color: Colors.white, border: Border(top: BorderSide(color: Colors.black.withValues(alpha: 0.1))), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.fromLTRB(16, 12, 16, 0), child: Column( mainAxisSize: MainAxisSize.min, children: [ diff --git a/lib/features/diets/presentation/widgets/expandable_text.dart b/lib/features/diets/presentation/widgets/expandable_text.dart index 5832ec86..cf1c98ce 100644 --- a/lib/features/diets/presentation/widgets/expandable_text.dart +++ b/lib/features/diets/presentation/widgets/expandable_text.dart @@ -5,6 +5,9 @@ import 'package:eatvio_app/core/theme/custom_text_style.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:markdown/markdown.dart' as md; +import 'package:url_launcher/url_launcher.dart'; class ExpandableText extends StatefulWidget { final String text; @@ -35,7 +38,9 @@ class _ExpandableTextState extends State { void _checkTextOverflow() { final textRenderObject = _textKey.currentContext?.findRenderObject(); if (textRenderObject is RenderBox) { - final maxLinesHeight = widget.maxLines * TextStyles.textMMediumAuto.fontSize! * 1.2; + final fontSize = TextStyles.textMMediumAuto.fontSize ?? 16; + final lineHeight = fontSize * 1.5; + final maxLinesHeight = widget.maxLines * lineHeight; final actualHeight = textRenderObject.size.height; if (actualHeight > maxLinesHeight && !showExpandButton) { @@ -52,9 +57,61 @@ class _ExpandableTextState extends State { }); } + String _processMarkdown(String text) { + // Автоматически преобразуем URL в markdown ссылки + // Сначала исправляем неправильный синтаксис markdown ссылок + final wrongLinkRegex = RegExp(r'\[(https?://[^\]]+|www\.[^\]]+)\]\(([^\)]+)\)'); + text = text.replaceAllMapped(wrongLinkRegex, (match) { + final urlInText = match.group(1)!; + if (!urlInText.startsWith('http://') && !urlInText.startsWith('https://') && !urlInText.startsWith('www.')) { + return match.group(0)!; + } + final fullUrl = urlInText.startsWith('www.') ? 'https://$urlInText' : urlInText; + return '[$urlInText]($fullUrl)'; + }); + + final linkRegex = RegExp(r'\[([^\]]+)\]\(([^\)]+)\)'); + final existingLinks = <_LinkRange>[]; + for (final linkMatch in linkRegex.allMatches(text)) { + existingLinks.add(_LinkRange(linkMatch.start, linkMatch.end)); + } + final urlRegex = RegExp(r'(https?://[^\s\)]+|www\.[^\s\)]+)', caseSensitive: false); + String result = text; + int offset = 0; + for (final urlMatch in urlRegex.allMatches(text)) { + bool isInsideLink = existingLinks.any((link) => + urlMatch.start >= link.start && urlMatch.end <= link.end); + if (!isInsideLink) { + final url = urlMatch.group(0)!; + final fullUrl = url.startsWith('www.') ? 'https://$url' : url; + final replacement = '[$url]($fullUrl)'; + result = result.replaceRange( + urlMatch.start + offset, + urlMatch.end + offset, + replacement, + ); + offset += replacement.length - url.length; + } + } + + // Гарантируем, что жирный текст будет распознан + final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); + result = result.replaceAllMapped(boldRegex, (match) { + return '${match.group(1)}'; + }); + + return result; + } + @override Widget build(BuildContext context) { final s = S.of(context); + final processedText = _processMarkdown(widget.text); + final htmlData = md.markdownToHtml( + processedText, + extensionSet: md.ExtensionSet.gitHubFlavored, + ); + return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -65,12 +122,56 @@ class _ExpandableTextState extends State { curve: Curves.easeInOut, child: Stack( children: [ - Text( - widget.text, - key: _textKey, - style: TextStyles.textMMediumAuto.copyWith(color: appTheme.black), - maxLines: isExpanded ? null : widget.maxLines, - overflow: TextOverflow.clip, + ClipRect( + child: ConstrainedBox( + constraints: BoxConstraints( + maxHeight: isExpanded ? double.infinity : (widget.maxLines * (TextStyles.textMMediumAuto.fontSize ?? 16) * 1.5), + ), + child: Html( + key: _textKey, + data: htmlData, + style: { + "body": Style( + margin: Margins.zero, + padding: HtmlPaddings.zero, + fontSize: FontSize(TextStyles.textMMediumAuto.fontSize ?? 16), + lineHeight: const LineHeight(1.5), + ), + "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), + "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), + "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), + "h1": Style(fontSize: FontSize(24)), + "h2": Style(fontSize: FontSize(20)), + "h3": Style(fontSize: FontSize(18)), + "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), + "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black), + "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black), + "em, i": Style(fontStyle: FontStyle.italic), + "code": Style( + backgroundColor: Colors.grey.shade100, + padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), + fontFamily: 'monospace', + ), + "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), + "blockquote": Style( + padding: HtmlPaddings.only(left: 16), + margin: Margins.only(left: 8, bottom: 12), + fontStyle: FontStyle.italic, + color: Colors.grey.shade700, + ), + "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), + "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), + }, + onLinkTap: (url, attributes, element) async { + if (url != null) { + final uri = Uri.parse(url); + if (await canLaunchUrl(uri)) { + await launchUrl(uri, mode: LaunchMode.externalApplication); + } + } + }, + ), + ), ), if (!isExpanded && showExpandButton) Positioned.fill( @@ -121,3 +222,9 @@ class _ExpandableTextState extends State { ); } } + +class _LinkRange { + final int start; + final int end; + _LinkRange(this.start, this.end); +} diff --git a/lib/features/feed/presentation/widgets/blog_post_widget.dart b/lib/features/feed/presentation/widgets/blog_post_widget.dart index baebe3a5..a7334b3e 100644 --- a/lib/features/feed/presentation/widgets/blog_post_widget.dart +++ b/lib/features/feed/presentation/widgets/blog_post_widget.dart @@ -125,37 +125,85 @@ class _BlogPostWidgetState extends State { if (state.feedBlogPostList[widget.index].description.isNotEmpty) Padding( padding: const EdgeInsets.symmetric(horizontal: 12), - child: Html( - data: md.markdownToHtml( - (state.feedBlogPostList[widget.index].description.length > 200 - ? state.feedBlogPostList[widget.index].description.substring(0, 200).replaceAll('\n', '
') - : state.feedBlogPostList[widget.index].description.replaceAll('\n', '
')), - ), - style: { - "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5)), - "p": Style(margin: Margins.only(bottom: 12), color: Colors.black87), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: Colors.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: Colors.black87), - "strong, b": Style(fontWeight: FontWeight.bold, color: Colors.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), + child: Builder( + builder: (context) { + String description = state.feedBlogPostList[widget.index].description; + final isLong = description.length > 200; + + if (isLong) { + // Умная обрезка: обрезаем markdown текст, не ломая синтаксис + int cutPoint = 200; + + // Проверяем, есть ли незакрытые markdown теги + String preview = description.substring(0, cutPoint); + + // Считаем открывающие и закрывающие теги + int boldOpen = (preview.split('**').length - 1) ~/ 2; + int boldClose = preview.split('**').length - 1 - boldOpen * 2; + bool hasUnclosedBold = boldOpen > boldClose; + + // Если есть незакрытый bold, ищем закрытие + if (hasUnclosedBold) { + int searchEnd = (cutPoint + 100).clamp(0, description.length); + int boldClosePos = description.indexOf('**', cutPoint); + if (boldClosePos != -1 && boldClosePos < searchEnd) { + cutPoint = boldClosePos + 2; + } else { + // Если не нашли, обрезаем до последнего пробела + cutPoint = description.lastIndexOf(' ', 200); + if (cutPoint == -1 || cutPoint < 150) cutPoint = 200; + } + } else { + // Обрезаем до последнего пробела для красоты + cutPoint = description.lastIndexOf(' ', cutPoint); + if (cutPoint == -1 || cutPoint < 150) cutPoint = 200; + } + + description = description.substring(0, cutPoint); + } + + // Гарантируем, что жирный текст будет распознан + final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); + description = description.replaceAllMapped(boldRegex, (match) { + return '${match.group(1)}'; + }); + + // Конвертируем markdown в HTML + String htmlData = md.markdownToHtml( + description, + extensionSet: md.ExtensionSet.gitHubFlavored, + ); + + return Html( + data: htmlData, + style: { + "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5), color: Colors.black87), + "p": Style(margin: Margins.only(bottom: 12), color: Colors.black87), + "b, strong": Style(fontWeight: FontWeight.bold, color: Colors.black), + "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: Colors.black, fontWeight: FontWeight.bold), + "h1": Style(fontSize: FontSize(24)), + "h2": Style(fontSize: FontSize(20)), + "h3": Style(fontSize: FontSize(18)), + "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), + "li": Style(margin: Margins.only(bottom: 4), color: Colors.black87), + "strong, b": Style(fontWeight: FontWeight.bold, color: Colors.black), + "em, i": Style(fontStyle: FontStyle.italic), + "code": Style( + backgroundColor: Colors.grey.shade100, + padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), + fontFamily: 'monospace', + ), + "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), + "blockquote": Style( + padding: HtmlPaddings.only(left: 16), + margin: Margins.only(left: 8, bottom: 12), + fontStyle: FontStyle.italic, + color: Colors.grey.shade700, + ), + "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), + "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), + }, + ); }, ), ), diff --git a/lib/features/feed/presentation/widgets/diets_widget.dart b/lib/features/feed/presentation/widgets/diets_widget.dart index 095de75c..4b3428e6 100644 --- a/lib/features/feed/presentation/widgets/diets_widget.dart +++ b/lib/features/feed/presentation/widgets/diets_widget.dart @@ -153,10 +153,17 @@ class _DietsWidgetState extends State { } } details = result; + + // Гарантируем, что жирный текст будет распознан + final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); + details = details.replaceAllMapped(boldRegex, (match) { + return '${match.group(1)}'; + }); + return Html( data: md.markdownToHtml( - details.replaceAll('\n', '
'), - extensionSet: md.ExtensionSet.commonMark, + details, + extensionSet: md.ExtensionSet.gitHubFlavored, ), style: { "body": Style( @@ -166,6 +173,7 @@ class _DietsWidgetState extends State { lineHeight: const LineHeight(1.5), ), "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), + "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), "h1": Style(fontSize: FontSize(24)), "h2": Style(fontSize: FontSize(20)), diff --git a/lib/features/feed/presentation/widgets/plan_widget.dart b/lib/features/feed/presentation/widgets/plan_widget.dart index 054cee40..8f5a4bc2 100644 --- a/lib/features/feed/presentation/widgets/plan_widget.dart +++ b/lib/features/feed/presentation/widgets/plan_widget.dart @@ -158,14 +158,22 @@ class _PlanWidgetState extends State { } } details = result; + + // Гарантируем, что жирный текст будет распознан + final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); + details = details.replaceAllMapped(boldRegex, (match) { + return '${match.group(1)}'; + }); + return Html( data: md.markdownToHtml( - details.replaceAll('\n', '
'), - extensionSet: md.ExtensionSet.commonMark, + details, + extensionSet: md.ExtensionSet.gitHubFlavored, ), style: { "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5)), "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), + "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), "h1": Style(fontSize: FontSize(24)), "h2": Style(fontSize: FontSize(20)), diff --git a/lib/features/feed/presentation/widgets/recipes_widget.dart b/lib/features/feed/presentation/widgets/recipes_widget.dart index 347ab8cd..ed89b183 100644 --- a/lib/features/feed/presentation/widgets/recipes_widget.dart +++ b/lib/features/feed/presentation/widgets/recipes_widget.dart @@ -193,10 +193,17 @@ class _RecipesWidgetState extends State { } } description = result; + + // Гарантируем, что жирный текст будет распознан + final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); + description = description.replaceAllMapped(boldRegex, (match) { + return '${match.group(1)}'; + }); + return Html( data: md.markdownToHtml( - description.replaceAll('\n', '
'), - extensionSet: md.ExtensionSet.commonMark, + description, + extensionSet: md.ExtensionSet.gitHubFlavored, ), style: { "body": Style( @@ -206,6 +213,7 @@ class _RecipesWidgetState extends State { lineHeight: const LineHeight(1.5), ), "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), + "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), "h1": Style(fontSize: FontSize(24)), "h2": Style(fontSize: FontSize(20)), diff --git a/lib/features/my_diets/presentation/widgets/my_diet_widget.dart b/lib/features/my_diets/presentation/widgets/my_diet_widget.dart index a3b8fced..f655b8b9 100644 --- a/lib/features/my_diets/presentation/widgets/my_diet_widget.dart +++ b/lib/features/my_diets/presentation/widgets/my_diet_widget.dart @@ -122,10 +122,17 @@ class _MyDietWidgetState extends State { } } details = result; + + // Гарантируем, что жирный текст будет распознан + final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); + details = details.replaceAllMapped(boldRegex, (match) { + return '${match.group(1)}'; + }); + return Html( data: md.markdownToHtml( - details.replaceAll('\n', '
'), - extensionSet: md.ExtensionSet.commonMark, + details, + extensionSet: md.ExtensionSet.gitHubFlavored, ), style: { "body": Style( @@ -135,6 +142,7 @@ class _MyDietWidgetState extends State { lineHeight: const LineHeight(1.5), ), "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), + "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), "h1": Style(fontSize: FontSize(24)), "h2": Style(fontSize: FontSize(20)), diff --git a/lib/features/my_plans/presentation/widgets/my_plan_widget.dart b/lib/features/my_plans/presentation/widgets/my_plan_widget.dart index f9ee70d2..5a53d76c 100644 --- a/lib/features/my_plans/presentation/widgets/my_plan_widget.dart +++ b/lib/features/my_plans/presentation/widgets/my_plan_widget.dart @@ -114,10 +114,17 @@ class _MyPlanWidgetState extends State { } } details = result; + + // Гарантируем, что жирный текст будет распознан + final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); + details = details.replaceAllMapped(boldRegex, (match) { + return '${match.group(1)}'; + }); + return Html( data: md.markdownToHtml( - details.replaceAll('\n', '
'), - extensionSet: md.ExtensionSet.commonMark, + details, + extensionSet: md.ExtensionSet.gitHubFlavored, ), style: { "body": Style( @@ -127,6 +134,7 @@ class _MyPlanWidgetState extends State { lineHeight: const LineHeight(1.5), ), "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), + "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), "h1": Style(fontSize: FontSize(24)), "h2": Style(fontSize: FontSize(20)), diff --git a/lib/features/plans/presentation/pages/about_plan_screen.dart b/lib/features/plans/presentation/pages/about_plan_screen.dart index 1fc6dba2..03e94814 100644 --- a/lib/features/plans/presentation/pages/about_plan_screen.dart +++ b/lib/features/plans/presentation/pages/about_plan_screen.dart @@ -153,16 +153,13 @@ class _AboutPlanScreenState extends State { backgroundColor: appTheme.gray100, resizeToAvoidBottomInset: true, bottomSheet: Container( - padding: EdgeInsets.only( - top: 12, - bottom: 12 + MediaQuery.of(context).padding.bottom + 56, // 56 - высота bottomNavigationBar - ), + padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom + 8), decoration: BoxDecoration( color: Colors.white, border: Border(top: BorderSide(color: Colors.black.withValues(alpha: 0.1))), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.fromLTRB(16, 12, 16, 0), child: Column( mainAxisSize: MainAxisSize.min, children: [ diff --git a/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart b/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart index d0714314..43f05f43 100644 --- a/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart +++ b/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart @@ -107,37 +107,85 @@ class _ProfileBlogPostWidgetState extends State { if (state.blogPosts[widget.index].description.isNotEmpty) Padding( padding: const EdgeInsets.symmetric(horizontal: 12), - child: Html( - data: md.markdownToHtml( - state.blogPosts[widget.index].description.length > 200 - ? state.blogPosts[widget.index].description.substring(0, 200).replaceAll('\n', '
') - : state.blogPosts[widget.index].description.replaceAll('\n', '
'), - ), - style: { - "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5)), - "p": Style(margin: Margins.only(bottom: 12), color: Colors.black87), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: Colors.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: Colors.black87), - "strong, b": Style(fontWeight: FontWeight.bold, color: Colors.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), + child: Builder( + builder: (context) { + String description = state.blogPosts[widget.index].description; + final isLong = description.length > 200; + + if (isLong) { + // Умная обрезка: обрезаем markdown текст, не ломая синтаксис + int cutPoint = 200; + + // Проверяем, есть ли незакрытые markdown теги + String preview = description.substring(0, cutPoint); + + // Считаем открывающие и закрывающие теги + int boldOpen = (preview.split('**').length - 1) ~/ 2; + int boldClose = preview.split('**').length - 1 - boldOpen * 2; + bool hasUnclosedBold = boldOpen > boldClose; + + // Если есть незакрытый bold, ищем закрытие + if (hasUnclosedBold) { + int searchEnd = (cutPoint + 100).clamp(0, description.length); + int boldClosePos = description.indexOf('**', cutPoint); + if (boldClosePos != -1 && boldClosePos < searchEnd) { + cutPoint = boldClosePos + 2; + } else { + // Если не нашли, обрезаем до последнего пробела + cutPoint = description.lastIndexOf(' ', 200); + if (cutPoint == -1 || cutPoint < 150) cutPoint = 200; + } + } else { + // Обрезаем до последнего пробела для красоты + cutPoint = description.lastIndexOf(' ', cutPoint); + if (cutPoint == -1 || cutPoint < 150) cutPoint = 200; + } + + description = description.substring(0, cutPoint); + } + + // Гарантируем, что жирный текст будет распознан + final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); + description = description.replaceAllMapped(boldRegex, (match) { + return '${match.group(1)}'; + }); + + // Конвертируем markdown в HTML + String htmlData = md.markdownToHtml( + description, + extensionSet: md.ExtensionSet.gitHubFlavored, + ); + + return Html( + data: htmlData, + style: { + "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5), color: Colors.black87), + "p": Style(margin: Margins.only(bottom: 12), color: Colors.black87), + "b, strong": Style(fontWeight: FontWeight.bold, color: Colors.black), + "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: Colors.black, fontWeight: FontWeight.bold), + "h1": Style(fontSize: FontSize(24)), + "h2": Style(fontSize: FontSize(20)), + "h3": Style(fontSize: FontSize(18)), + "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), + "li": Style(margin: Margins.only(bottom: 4), color: Colors.black87), + "strong, b": Style(fontWeight: FontWeight.bold, color: Colors.black), + "em, i": Style(fontStyle: FontStyle.italic), + "code": Style( + backgroundColor: Colors.grey.shade100, + padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), + fontFamily: 'monospace', + ), + "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), + "blockquote": Style( + padding: HtmlPaddings.only(left: 16), + margin: Margins.only(left: 8, bottom: 12), + fontStyle: FontStyle.italic, + color: Colors.grey.shade700, + ), + "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), + "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), + }, + ); }, ), ), diff --git a/lib/features/recipe/presentation/pages/about_recipe_screen.dart b/lib/features/recipe/presentation/pages/about_recipe_screen.dart index 209cb873..b74a4201 100644 --- a/lib/features/recipe/presentation/pages/about_recipe_screen.dart +++ b/lib/features/recipe/presentation/pages/about_recipe_screen.dart @@ -99,108 +99,102 @@ class _AboutRecipeScreenState extends State { resizeToAvoidBottomInset: true, bottomSheet: Container( padding: EdgeInsets.only( - top: 12, - bottom: 12 + MediaQuery.of(context).padding.bottom + 56, // 56 - высота bottomNavigationBar + bottom: MediaQuery.of(context).padding.bottom + 8, ), decoration: BoxDecoration( color: Colors.white, border: Border(top: BorderSide(color: Colors.black.withValues(alpha: 0.1))), ), child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Column( - mainAxisSize: MainAxisSize.min, + padding: const EdgeInsets.fromLTRB(16, 12, 16, 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ - 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: const Icon(Icons.close_rounded, size: 18, color: Colors.white), - ), - ), - if (replyId != null) const SizedBox(width: 8), - Expanded( - child: ConstrainedBox( - constraints: const BoxConstraints(minHeight: 52), - child: TextFormField( - textCapitalization: TextCapitalization.sentences, - onChanged: (_) { - setState(() {}); - }, - controller: textEditingController, - maxLines: 5, - minLines: 1, - keyboardType: TextInputType.multiline, - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: Colors.black, height: 1.2), - decoration: InputDecoration( - isDense: false, - // убираем true, чтобы padding учитывался корректно - contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), - // вертикальный паддинг увеличен - hintText: 'Комментарий', - hintStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, height: 1.2, color: Color(0xFFAEAEB2)), - filled: true, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(16), - borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(16), - borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(16), - borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), - ), - ), - ), - ), + 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: const Icon(Icons.close_rounded, size: 18, color: Colors.white), ), - const SizedBox(width: 8), - GestureDetector( - onTap: () { - if (textEditingController.text.length > 2) { - commentsCubit.sendComment( - id: widget.recipeSlug, - commentText: textEditingController.text, - parentCommentId: replyId, - commentSourceType: CommentSourceType.recipe, - ); - context.read().setReplyId(null); - setState(() { - textEditingController.clear(); - replyId = null; - }); - Future.delayed(const Duration(milliseconds: 500), () { - recipeCubit.getRecipe(widget.recipeSlug, index: widget.index); - }); - FocusManager.instance.primaryFocus?.unfocus(); - } + ), + if (replyId != null) const SizedBox(width: 8), + Expanded( + child: ConstrainedBox( + constraints: const BoxConstraints(minHeight: 52), + child: TextFormField( + textCapitalization: TextCapitalization.sentences, + onChanged: (_) { + setState(() {}); }, - child: Container( - decoration: BoxDecoration( - color: textEditingController.text.length > 2 ? appTheme.blueA400 : Colors.grey, - shape: BoxShape.circle, + controller: textEditingController, + maxLines: 5, + minLines: 1, + keyboardType: TextInputType.multiline, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: Colors.black, height: 1.2), + decoration: InputDecoration( + isDense: false, + // убираем true, чтобы padding учитывался корректно + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + // вертикальный паддинг увеличен + hintText: 'Комментарий', + hintStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, height: 1.2, color: Color(0xFFAEAEB2)), + filled: true, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(16), + borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(16), + borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(16), + borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1), ), - height: 32, - width: 32, - child: const Icon(Icons.send_rounded, size: 18, color: Colors.white), ), ), - ], + ), + ), + const SizedBox(width: 8), + GestureDetector( + onTap: () { + if (textEditingController.text.length > 2) { + commentsCubit.sendComment( + id: widget.recipeSlug, + commentText: textEditingController.text, + parentCommentId: replyId, + commentSourceType: CommentSourceType.recipe, + ); + context.read().setReplyId(null); + setState(() { + textEditingController.clear(); + replyId = null; + }); + Future.delayed(const Duration(milliseconds: 500), () { + recipeCubit.getRecipe(widget.recipeSlug, index: widget.index); + }); + 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: const Icon(Icons.send_rounded, size: 18, color: Colors.white), + ), ), ], ), diff --git a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart index 71e2da04..e253756d 100644 --- a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart +++ b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart @@ -136,10 +136,17 @@ class _MyRecipeWidgetState extends State { } } description = result; + + // Гарантируем, что жирный текст будет распознан + final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); + description = description.replaceAllMapped(boldRegex, (match) { + return '${match.group(1)}'; + }); + return Html( data: md.markdownToHtml( - description.replaceAll('\n', '
'), - extensionSet: md.ExtensionSet.commonMark, + description, + extensionSet: md.ExtensionSet.gitHubFlavored, ), style: { "body": Style( @@ -149,6 +156,7 @@ class _MyRecipeWidgetState extends State { lineHeight: const LineHeight(1.5), ), "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), + "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), "h1": Style(fontSize: FontSize(24)), "h2": Style(fontSize: FontSize(20)), diff --git a/pubspec.yaml b/pubspec.yaml index dd30e1cc..35a43397 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: eatvio_app description: A new Flutter project. -version: 1.3.11+92 +version: 1.3.12+93 publish_to: 'none' environment: From d206e7ec12409ed082899131d7189d2b2c0786a6 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Tue, 13 Jan 2026 12:22:22 +0300 Subject: [PATCH 02/10] refactor: implement lazy initialization for global BlocProviders and enhance Firebase initialization with timeout handling --- lib/core/app_config.dart | 15 ++++----- lib/core/app_initializer.dart | 16 ++++++++-- lib/core/di/external_registrations.dart | 10 ++++-- lib/core/firebase_api.dart | 31 +++++++++++++++++-- lib/core/locator_service.dart | 4 +++ lib/core/routing/auth_routes.dart | 8 ++--- lib/core/routing/main_navigation_routes.dart | 9 ++++++ lib/core/routing/other_routes.dart | 27 ++++++++++++++-- lib/core/token_storage.dart | 23 +++++++++----- .../bloc/auth_cubit/auth_cubit.dart | 29 ++++++++++------- .../chat/presentation/pages/chats_screen.dart | 13 ++++++++ .../feed/presentation/pages/feed_screen.dart | 9 ++++++ .../presentation/notifications_screen.dart | 8 +++++ 13 files changed, 161 insertions(+), 41 deletions(-) diff --git a/lib/core/app_config.dart b/lib/core/app_config.dart index afe814e0..df87d259 100644 --- a/lib/core/app_config.dart +++ b/lib/core/app_config.dart @@ -33,15 +33,16 @@ class AppConfig { } /// Список глобальных BlocProvider'ов + /// Используются lazy: true для отложенной инициализации, чтобы не блокировать старт приложения List get globalBlocProviders => [ - BlocProvider(create: (context) => sl()), - BlocProvider(create: (context) => sl()..getNotifications()), - BlocProvider(create: (context) => sl()..loadFeedBlogPostList()), - BlocProvider(create: (context) => sl()..getMyProfile()), - BlocProvider(create: (context) => sl()..getChatRoomsWithLoading()), - BlocProvider(create: (context) => sl()), + BlocProvider(lazy: true, create: (context) => sl()), + BlocProvider(lazy: true, create: (context) => sl()), + BlocProvider(lazy: true, create: (context) => sl()), + BlocProvider(lazy: true, create: (context) => sl()), + BlocProvider(lazy: true, create: (context) => sl()), + BlocProvider(lazy: true, create: (context) => sl()), BlocProvider(lazy: false, create: (context) => sl()), - BlocProvider(create: (context) => sl()), + BlocProvider(lazy: true, create: (context) => sl()), ]; /// Делегаты локализации diff --git a/lib/core/app_initializer.dart b/lib/core/app_initializer.dart index ea0b8f5d..193aa7e3 100644 --- a/lib/core/app_initializer.dart +++ b/lib/core/app_initializer.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:io' as io; import 'package:eatvio_app/core/app_config.dart'; import 'package:eatvio_app/core/env_config.dart'; @@ -37,9 +38,20 @@ class AppInitializer { /// Инициализация Firebase static Future _initializeFirebase() async { - await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); + await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform).timeout( + const Duration(seconds: 10), + onTimeout: () { + throw TimeoutException('Firebase initialization timeout'); + }, + ); if (sl().buildType == AppBuildType.prod) { - await FirebaseMessaging.instance.requestPermission(); + try { + await FirebaseMessaging.instance.requestPermission().timeout( + const Duration(seconds: 5), + ); + } catch (e) { + // Разрешение не критично, продолжаем работу + } } } diff --git a/lib/core/di/external_registrations.dart b/lib/core/di/external_registrations.dart index dcff4441..aecd2707 100644 --- a/lib/core/di/external_registrations.dart +++ b/lib/core/di/external_registrations.dart @@ -20,13 +20,19 @@ class ExternalRegistrations { static void _registerDio() { sl.registerLazySingleton( () => - Dio(BaseOptions(baseUrl: sl().baseUrl, headers: {'accept': 'application/json', 'content-type': 'application/json'})) + Dio(BaseOptions( + baseUrl: sl().baseUrl, + headers: {'accept': 'application/json', 'content-type': 'application/json'}, + connectTimeout: const Duration(seconds: 10), + receiveTimeout: const Duration(seconds: 10), + sendTimeout: const Duration(seconds: 10), + )) ..interceptors.addAll([TokenInterceptor(), PhoneVerifyErrorInterceptor()]), ); } /// Регистрация Prefs static void _registerPrefs() { - sl.registerSingletonAsync(()async => Prefs(await SharedPreferences.getInstance())); + sl.registerSingletonAsync(() async => Prefs(await SharedPreferences.getInstance())); } } diff --git a/lib/core/firebase_api.dart b/lib/core/firebase_api.dart index 089d7846..887b7137 100644 --- a/lib/core/firebase_api.dart +++ b/lib/core/firebase_api.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:developer'; import 'dart:io'; import 'package:eatvio_app/core/app_config.dart'; @@ -19,12 +20,24 @@ class FirebaseApi { String? token; if (await _isHuaweiDevice()) { - token = await _getHuaweiPushTokenNative(); + token = await _getHuaweiPushTokenNative().timeout( + const Duration(seconds: 5), + onTimeout: () => null, + ); } else { if ((sl().buildType == AppBuildType.prod)) { - await _firebaseMessaging.requestPermission(); + try { + await _firebaseMessaging.requestPermission().timeout( + const Duration(seconds: 5), + ); + } catch (e) { + // Разрешение не критично, продолжаем + } } - token = await _firebaseMessaging.getToken(); + token = await _firebaseMessaging.getToken().timeout( + const Duration(seconds: 5), + onTimeout: () => null, + ); } return token; } @@ -39,9 +52,15 @@ class FirebaseApi { 'hw_id': Platform.isIOS ? (await deviceInfo.iosInfo).identifierForVendor : (await deviceInfo.androidInfo).id, 'token': await getToken(), }, + ).timeout( + const Duration(seconds: 10), + onTimeout: () { + throw TimeoutException('registerAnonymousPushToken timeout'); + }, ); } catch (e, st) { log(e.toString(), stackTrace: st); + // Не пробрасываем ошибку дальше, так как это не критичная операция } } @@ -57,9 +76,15 @@ class FirebaseApi { 'hw_id': Platform.isIOS ? (await deviceInfo.iosInfo).identifierForVendor : (await deviceInfo.androidInfo).id, 'token': await getToken(), }, + ).timeout( + const Duration(seconds: 10), + onTimeout: () { + throw TimeoutException('registerPushToken timeout'); + }, ); } catch (e, st) { log(e.toString(), stackTrace: st); + // Не пробрасываем ошибку дальше, так как это не критичная операция } } } diff --git a/lib/core/locator_service.dart b/lib/core/locator_service.dart index d3ed9b95..2f457269 100644 --- a/lib/core/locator_service.dart +++ b/lib/core/locator_service.dart @@ -4,6 +4,7 @@ import 'package:eatvio_app/core/di/cubit_registrations.dart'; import 'package:eatvio_app/core/di/external_registrations.dart'; import 'package:eatvio_app/core/di/repository_registrations.dart'; import 'package:eatvio_app/core/di/service_registrations.dart'; +import 'package:eatvio_app/core/prefs.dart'; import 'package:eatvio_app/core/websockets/ws_manager.dart'; import 'package:get_it/get_it.dart'; @@ -18,6 +19,9 @@ Future init({required AppBuildType buildType}) async { // Регистрация внешних зависимостей (Dio, etc.) ExternalRegistrations.registerAll(); + // Ожидание инициализации асинхронных зависимостей + await sl.getAsync(); + // Регистрация сервисов ServiceRegistrations.registerAll(); diff --git a/lib/core/routing/auth_routes.dart b/lib/core/routing/auth_routes.dart index 2ac62618..772cd2eb 100644 --- a/lib/core/routing/auth_routes.dart +++ b/lib/core/routing/auth_routes.dart @@ -1,5 +1,3 @@ -import 'package:eatvio_app/core/firebase_api.dart'; -import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/routing/route_constants.dart'; import 'package:eatvio_app/features/auth/entities/auth_result_entity.dart'; import 'package:eatvio_app/features/auth/presentation/pages/auth_screen.dart'; @@ -21,10 +19,8 @@ class AuthRoutes { path: RouteConstants.authScreen, name: 'authScreen', builder: (context, state) => const AuthScreen(), - redirect: (context, state) { - sl().registerAnonymousPushToken(); - return null; - }, + // registerAnonymousPushToken вызывается в AuthCubit.initializeUser() + // и не должен блокировать навигацию routes: [ GoRoute(path: RouteConstants.registrationScreen, name: 'registrationScreen', builder: (context, state) => const RegistrationScreen()), GoRoute(path: RouteConstants.registrationScreenV2, name: 'registrationScreenV2', builder: (context, state) => const RegistrationV2Page()), diff --git a/lib/core/routing/main_navigation_routes.dart b/lib/core/routing/main_navigation_routes.dart index 818f625c..d6a4978e 100644 --- a/lib/core/routing/main_navigation_routes.dart +++ b/lib/core/routing/main_navigation_routes.dart @@ -23,6 +23,15 @@ class MainNavigationRoutes { return [ ShellRoute( builder: (context, state, child) { + // Инициализация ProfileAvatarCubit при первом использовании ShellRoute + final profileAvatarCubit = context.read(); + if (profileAvatarCubit.state is ProfileAvatarStateLoading) { + // Вызываем getMyProfile() только если состояние loading (первый запуск) + WidgetsBinding.instance.addPostFrameCallback((_) { + profileAvatarCubit.getMyProfile(); + }); + } + return BlocBuilder( builder: (BuildContext context, ProfileAvatarState state) { if (state is ProfileAvatarStateLoaded) { diff --git a/lib/core/routing/other_routes.dart b/lib/core/routing/other_routes.dart index 28d85d36..9b29ad98 100644 --- a/lib/core/routing/other_routes.dart +++ b/lib/core/routing/other_routes.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'package:dio/dio.dart'; import 'package:eatvio_app/core/app_config.dart'; import 'package:eatvio_app/core/locator_service.dart'; @@ -56,7 +57,8 @@ class OtherRoutes { builder: (context, state) => const WelcomeScreen(), redirect: (context, state) async { try { - final prefs = sl(); + // Prefs уже инициализирован в locator_service, но на всякий случай проверяем + final prefs = await sl.getAsync(); final welcomeScreenWasShowed = prefs.getBool(PrefsKeys.welcomeScreenWasShowed) ?? false; if (!welcomeScreenWasShowed) { return null; @@ -74,7 +76,27 @@ class OtherRoutes { builder: (context, state) => const UpdateScreen(), redirect: (context, state) async { try { - final versions = (await sl().get('${sl().baseUrl}/api/app_versions')).data; + // Проверка версии с таймаутом, чтобы не блокировать запуск приложения + final versions = await sl() + .get('${sl().baseUrl}/api/app_versions') + .timeout( + const Duration(seconds: 5), + onTimeout: () { + // При таймауте пропускаем проверку и идем дальше + throw TimeoutException('Version check timeout'); + }, + ) + .then((response) => response.data) + .catchError((e) { + // При любой ошибке пропускаем проверку версии + return null; + }); + + if (versions == null) { + // Если проверка не удалась, пропускаем экран обновления + return RouteConstants.welcomeScreen; + } + PackageInfo packageInfo = await PackageInfo.fromPlatform(); String version = packageInfo.version; Version currentVersion = Version.parse(version); @@ -85,6 +107,7 @@ class OtherRoutes { return RouteConstants.welcomeScreen; } } catch (e) { + // При любой ошибке пропускаем экран обновления return RouteConstants.welcomeScreen; } }, diff --git a/lib/core/token_storage.dart b/lib/core/token_storage.dart index f67e919c..871140c7 100644 --- a/lib/core/token_storage.dart +++ b/lib/core/token_storage.dart @@ -1,9 +1,16 @@ import 'package:shared_preferences/shared_preferences.dart'; abstract class TokenStorage { + static SharedPreferences? _cachedPrefs; + + static Future _getPrefs() async { + _cachedPrefs ??= await SharedPreferences.getInstance(); + return _cachedPrefs!; + } + static Future haveTokenInStorage() async { - final sharedPreferences = await SharedPreferences.getInstance(); try { + final sharedPreferences = await _getPrefs(); if (sharedPreferences.getString('token') == null) { return false; } else { @@ -15,25 +22,25 @@ abstract class TokenStorage { } static Future getTokenFromStorage() async { - final sharedPreferences = await SharedPreferences.getInstance(); + final sharedPreferences = await _getPrefs(); return sharedPreferences.getString('token'); } static Future saveTokenInStorage(String token) async { - final sharedPreferences = await SharedPreferences.getInstance(); + final sharedPreferences = await _getPrefs(); await sharedPreferences.setString('token', token); } static Future removeTokenInStorage() async { - final sharedPreferences = await SharedPreferences.getInstance(); + final sharedPreferences = await _getPrefs(); await sharedPreferences.remove('token'); } } abstract class SocketIdStorage { static Future haveSocketIdInStorage() async { - final sharedPreferences = await SharedPreferences.getInstance(); try { + final sharedPreferences = await TokenStorage._getPrefs(); if (sharedPreferences.getString('socketId') == null) { return false; } else { @@ -45,17 +52,17 @@ abstract class SocketIdStorage { } static Future getSocketIdFromStorage() async { - final sharedPreferences = await SharedPreferences.getInstance(); + final sharedPreferences = await TokenStorage._getPrefs(); return sharedPreferences.getString('socketId'); } static Future saveSocketIdInStorage(String socketId) async { - final sharedPreferences = await SharedPreferences.getInstance(); + final sharedPreferences = await TokenStorage._getPrefs(); await sharedPreferences.setString('socketId', socketId); } static Future removeSocketIdInStorage() async { - final sharedPreferences = await SharedPreferences.getInstance(); + final sharedPreferences = await TokenStorage._getPrefs(); await sharedPreferences.remove('socketId'); } } diff --git a/lib/features/auth/presentation/bloc/auth_cubit/auth_cubit.dart b/lib/features/auth/presentation/bloc/auth_cubit/auth_cubit.dart index 4e3c7db9..c80daada 100644 --- a/lib/features/auth/presentation/bloc/auth_cubit/auth_cubit.dart +++ b/lib/features/auth/presentation/bloc/auth_cubit/auth_cubit.dart @@ -38,18 +38,25 @@ class AuthCubit extends Cubit { } Future initializeUser() async { - await registerAnonymousPushToken(); - if (await TokenStorage.haveTokenInStorage()) { - final profile = await profileRepository.getMyProfile(); - if (profile.emailVerifiedAt != null) { - await registerPushToken(); - AppRouter.navigatorKey.currentContext?.go(RouteConstants.feedScreen); - return; - } - AppRouter.navigatorKey.currentContext?.go(RouteConstants.verifyEmailScreen); - } else { + try { await registerAnonymousPushToken(); - FlutterNativeSplash.remove(); + if (await TokenStorage.haveTokenInStorage()) { + final profile = await profileRepository.getMyProfile(); + if (profile.emailVerifiedAt != null) { + await registerPushToken(); + FlutterNativeSplash.remove(); + AppRouter.navigatorKey.currentContext?.go(RouteConstants.feedScreen); + return; + } + FlutterNativeSplash.remove(); + AppRouter.navigatorKey.currentContext?.go(RouteConstants.verifyEmailScreen); + } else { + FlutterNativeSplash.remove(); + } + } catch (e) { + log('Error in initializeUser: $e'); + FlutterNativeSplash.remove(); // Убираем сплэш даже при ошибке + rethrow; } } diff --git a/lib/features/chat/presentation/pages/chats_screen.dart b/lib/features/chat/presentation/pages/chats_screen.dart index befaa00f..539e971c 100644 --- a/lib/features/chat/presentation/pages/chats_screen.dart +++ b/lib/features/chat/presentation/pages/chats_screen.dart @@ -20,6 +20,19 @@ class ChatsScreen extends StatefulWidget { class _ChatsScreenState extends State { final searchController = TextEditingController(); + @override + void initState() { + super.initState(); + // Инициализация ChatsCubit при первом открытии экрана + WidgetsBinding.instance.addPostFrameCallback((_) { + final cubit = context.read(); + final state = cubit.state; + if (state.state == BaseState.initial) { + cubit.getChatRoomsWithLoading(); + } + }); + } + @override Widget build(BuildContext context) { return BlocBuilder( diff --git a/lib/features/feed/presentation/pages/feed_screen.dart b/lib/features/feed/presentation/pages/feed_screen.dart index 47447e49..0c9dca9d 100644 --- a/lib/features/feed/presentation/pages/feed_screen.dart +++ b/lib/features/feed/presentation/pages/feed_screen.dart @@ -11,6 +11,7 @@ import 'package:eatvio_app/features/create_plan/presentation/create_plan_screen. import 'package:eatvio_app/features/feed/presentation/bloc/consultants_cubit/consultants_cubit.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/diets_cubit/diets_cubit.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart'; +import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_state.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/profile_cubit/profile_cubit.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/profile_cubit/profile_state.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/recipes_cubit/recipes_cubit.dart'; @@ -74,6 +75,14 @@ class _FeedScreenContentState extends State { chipsLabelList = hidePlans ? ['Все', 'Рецепты', 'Диеты', 'Консультанты'] : ['Все', 'Рецепты', 'Диеты', 'Планы питания', 'Консультанты']; consultantsScrollController.addListener(_onScrollConsultants); _checkRegistrationDate(context); + // Инициализация глобальных кубитов при первом открытии экрана + WidgetsBinding.instance.addPostFrameCallback((_) { + final feedCubit = context.read(); + final state = feedCubit.state; + if (state is! FeedStateLoaded && state is! FeedStateLoading) { + feedCubit.loadFeedBlogPostList(); + } + }); super.initState(); } diff --git a/lib/features/notifications/presentation/notifications_screen.dart b/lib/features/notifications/presentation/notifications_screen.dart index 58e3c65f..afb8e122 100644 --- a/lib/features/notifications/presentation/notifications_screen.dart +++ b/lib/features/notifications/presentation/notifications_screen.dart @@ -24,6 +24,14 @@ class _NotificationsScreenState extends State { void initState() { super.initState(); _scrollController.addListener(_onScroll); + // Инициализация NotificationsCubit при первом открытии экрана + WidgetsBinding.instance.addPostFrameCallback((_) { + final cubit = context.read(); + final state = cubit.state; + if (state is! NotificationsStateLoaded && state is! NotificationsStateError) { + cubit.getNotifications(); + } + }); } @override From bf2ba1fbda73233377aa89929ea72aa84738fb11 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Tue, 13 Jan 2026 12:36:12 +0300 Subject: [PATCH 03/10] feat: integrate MarkdownHtmlWidget for improved markdown rendering in blog and diet components --- lib/core/utils/markdown_utils.dart | 67 + lib/core/widgets/markdown_html_widget.dart | 124 ++ .../presentation/pages/blog_post_screen.dart | 124 +- .../presentation/widgets/expandable_text.dart | 108 +- .../widgets/blog_post_widget.dart | 46 +- .../presentation/widgets/plan_widget.dart | 105 +- lib/generated/intl/messages_all.dart | 23 +- lib/generated/intl/messages_en.dart | 1381 ++++++----------- lib/generated/intl/messages_ru.dart | 578 +++---- lib/generated/l10n.dart | 1122 +++++++++++-- lib/l10n/intl_en.arb | 3 +- lib/l10n/intl_ru.arb | 3 +- 12 files changed, 1877 insertions(+), 1807 deletions(-) create mode 100644 lib/core/utils/markdown_utils.dart create mode 100644 lib/core/widgets/markdown_html_widget.dart diff --git a/lib/core/utils/markdown_utils.dart b/lib/core/utils/markdown_utils.dart new file mode 100644 index 00000000..0cb0c4a2 --- /dev/null +++ b/lib/core/utils/markdown_utils.dart @@ -0,0 +1,67 @@ +/// Утилиты для обработки markdown текста +class MarkdownUtils { + /// Обрабатывает markdown текст: + /// - Исправляет неправильный синтаксис markdown ссылок + /// - Автоматически преобразует URL в markdown ссылки + /// - Преобразует **текст** в текст для надежного отображения жирного текста + static String processMarkdown(String text) { + // Сначала исправляем неправильный синтаксис markdown ссылок + // Например: [http://example.com](url) -> [http://example.com](http://example.com) + final wrongLinkRegex = RegExp(r'\[(https?://[^\]]+|www\.[^\]]+)\]\(([^\)]+)\)'); + text = text.replaceAllMapped(wrongLinkRegex, (match) { + final urlInText = match.group(1)!; + if (!urlInText.startsWith('http://') && !urlInText.startsWith('https://') && !urlInText.startsWith('www.')) { + return match.group(0)!; + } + final fullUrl = urlInText.startsWith('www.') ? 'https://$urlInText' : urlInText; + return '[$urlInText]($fullUrl)'; + }); + + // Находим все существующие markdown ссылки и их позиции + final linkRegex = RegExp(r'\[([^\]]+)\]\(([^\)]+)\)'); + final existingLinks = <_LinkRange>[]; + for (final linkMatch in linkRegex.allMatches(text)) { + existingLinks.add(_LinkRange(linkMatch.start, linkMatch.end)); + } + + // Регулярное выражение для поиска URL (http://, https://, www.) + final urlRegex = RegExp(r'(https?://[^\s\)]+|www\.[^\s\)]+)', caseSensitive: false); + + // Заменяем URL на markdown ссылки, если они еще не являются ссылками + String result = text; + int offset = 0; + for (final urlMatch in urlRegex.allMatches(text)) { + // Проверяем, не находится ли URL внутри существующей markdown ссылки + bool isInsideLink = existingLinks.any((link) => + urlMatch.start >= link.start && urlMatch.end <= link.end); + if (!isInsideLink) { + final url = urlMatch.group(0)!; + final fullUrl = url.startsWith('www.') ? 'https://$url' : url; + final replacement = '[$url]($fullUrl)'; + result = result.replaceRange( + urlMatch.start + offset, + urlMatch.end + offset, + replacement, + ); + offset += replacement.length - url.length; + } + } + + // Гарантируем, что жирный текст будет распознан + // Заменяем **текст** на текст вручную для надежности + final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); + result = result.replaceAllMapped(boldRegex, (match) { + return '${match.group(1)}'; + }); + + return result; + } +} + +/// Вспомогательный класс для хранения диапазона позиций ссылки +class _LinkRange { + final int start; + final int end; + + _LinkRange(this.start, this.end); +} diff --git a/lib/core/widgets/markdown_html_widget.dart b/lib/core/widgets/markdown_html_widget.dart new file mode 100644 index 00000000..53e7c770 --- /dev/null +++ b/lib/core/widgets/markdown_html_widget.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:markdown/markdown.dart' as md; +import 'package:url_launcher/url_launcher.dart'; +import 'package:eatvio_app/core/utils/markdown_utils.dart'; + +/// Переиспользуемый виджет для отображения HTML из markdown текста +class MarkdownHtmlWidget extends StatelessWidget { + /// Markdown текст для отображения + final String markdownText; + + /// Ширина изображений (по умолчанию ширина экрана минус 32) + final double? imageWidth; + + /// Цвет текста для body и параграфов + final Color? textColor; + + /// Размер шрифта (по умолчанию 16) + final double? fontSize; + + /// Callback для обработки нажатий на ссылки + final OnTap? onLinkTap; + + const MarkdownHtmlWidget({ + super.key, + required this.markdownText, + this.imageWidth, + this.textColor, + this.fontSize, + this.onLinkTap, + }); + + @override + Widget build(BuildContext context) { + // Обрабатываем markdown текст + final processedText = MarkdownUtils.processMarkdown(markdownText); + + // Конвертируем markdown в HTML + final htmlData = md.markdownToHtml( + processedText, + extensionSet: md.ExtensionSet.gitHubFlavored, + ); + + final screenWidth = MediaQuery.of(context).size.width; + final defaultImageWidth = imageWidth ?? (screenWidth - 32); + final defaultTextColor = textColor ?? Colors.black87; + final defaultFontSize = fontSize ?? 16.0; + + return Html( + data: htmlData, + style: { + "body": Style( + margin: Margins.zero, + padding: HtmlPaddings.zero, + fontSize: FontSize(defaultFontSize), + lineHeight: const LineHeight(1.5), + color: defaultTextColor, + ), + "p": Style( + margin: Margins.only(bottom: 12), + color: defaultTextColor, + ), + "b, strong": Style( + fontWeight: FontWeight.bold, + color: Colors.black, + ), + "h1, h2, h3, h4, h5, h6": Style( + margin: Margins.only(top: 16, bottom: 8), + color: Colors.black, + fontWeight: FontWeight.bold, + ), + "h1": Style(fontSize: FontSize(24)), + "h2": Style(fontSize: FontSize(20)), + "h3": Style(fontSize: FontSize(18)), + "ul, ol": Style( + margin: Margins.only(bottom: 12), + padding: HtmlPaddings.only(left: 16), + ), + "li": Style( + margin: Margins.only(bottom: 4), + color: defaultTextColor, + ), + "strong, b": Style( + fontWeight: FontWeight.bold, + color: Colors.black, + ), + "em, i": Style(fontStyle: FontStyle.italic), + "code": Style( + backgroundColor: Colors.grey.shade100, + padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), + fontFamily: 'monospace', + ), + "pre": Style( + backgroundColor: Colors.grey.shade100, + padding: HtmlPaddings.all(12), + margin: Margins.only(bottom: 12), + ), + "blockquote": Style( + padding: HtmlPaddings.only(left: 16), + margin: Margins.only(left: 8, bottom: 12), + fontStyle: FontStyle.italic, + color: Colors.grey.shade700, + ), + "a": Style( + color: Colors.blue, + textDecoration: TextDecoration.underline, + ), + "img": Style(width: Width(defaultImageWidth)), + }, + onLinkTap: onLinkTap ?? ((url, attributes, element) async { + if (url != null) { + try { + final uri = Uri.parse(url); + if (await canLaunchUrl(uri)) { + await launchUrl(uri, mode: LaunchMode.externalApplication); + } + } catch (e) { + debugPrint('Error launching URL: $e'); + } + } + }) as OnTap, + ); + } +} diff --git a/lib/features/blog_post/presentation/pages/blog_post_screen.dart b/lib/features/blog_post/presentation/pages/blog_post_screen.dart index 193fa9e2..ea4ccb97 100644 --- a/lib/features/blog_post/presentation/pages/blog_post_screen.dart +++ b/lib/features/blog_post/presentation/pages/blog_post_screen.dart @@ -4,6 +4,7 @@ import 'package:eatvio_app/core/enums/complained_content.dart'; import 'package:eatvio_app/core/utils/date_time_utils.dart'; import 'package:eatvio_app/core/widgets/custom_popup.dart'; import 'package:eatvio_app/core/widgets/loader.dart'; +import 'package:eatvio_app/core/widgets/markdown_html_widget.dart'; import 'package:eatvio_app/features/blog_post/presentation/cubit/blog_post_cubit.dart'; import 'package:eatvio_app/features/blog_post/presentation/cubit/blog_post_state.dart'; import 'package:eatvio_app/core/comments/comments_cubit/comments_cubit.dart'; @@ -12,13 +13,11 @@ import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit import 'package:eatvio_app/features/feed/presentation/widgets/comments_widget.dart'; import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/generated/l10n.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:share_plus/share_plus.dart'; -import 'package:markdown/markdown.dart' as md; -import 'package:url_launcher/url_launcher.dart'; class BlogPostScreen extends StatefulWidget { final int id; @@ -126,7 +125,7 @@ class _BlogPostScreenState extends State { // убираем true, чтобы padding учитывался корректно contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), // вертикальный паддинг увеличен - hintText: 'Комментарий', + hintText: S.of(context).comment_hint, hintStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, height: 1.2, color: Color(0xFFAEAEB2)), filled: true, border: OutlineInputBorder( @@ -237,111 +236,11 @@ class _BlogPostScreenState extends State { if (blogPostState.blogPostModel?.description.isNotEmpty ?? false) Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - child: Builder( - builder: (context) { - // Автоматически преобразуем URL в markdown ссылки - String description = blogPostState.blogPostModel!.description; - - // Сначала исправляем неправильный синтаксис markdown ссылок, где URL в тексте, а не в href - // Например: [http://example.com](url) -> [http://example.com](http://example.com) - final wrongLinkRegex = RegExp(r'\[(https?://[^\]]+|www\.[^\]]+)\]\(([^\)]+)\)'); - description = description.replaceAllMapped(wrongLinkRegex, (match) { - final urlInText = match.group(1)!; - // Если текст ссылки является URL, используем его как href - if (!urlInText.startsWith('http://') && !urlInText.startsWith('https://') && !urlInText.startsWith('www.')) { - return match.group(0)!; // Оставляем как есть, если это не URL - } - final fullUrl = urlInText.startsWith('www.') ? 'https://$urlInText' : urlInText; - // Используем URL как href, а текст ссылки - это сам URL - return '[$urlInText]($fullUrl)'; - }); - - // Теперь находим все существующие markdown ссылки и их позиции - final linkRegex = RegExp(r'\[([^\]]+)\]\(([^\)]+)\)'); - final existingLinks = <_LinkRange>[]; - - for (final linkMatch in linkRegex.allMatches(description)) { - existingLinks.add(_LinkRange(linkMatch.start, linkMatch.end)); - } - - // Регулярное выражение для поиска URL (http://, https://, www.) - final urlRegex = RegExp(r'(https?://[^\s\)]+|www\.[^\s\)]+)', caseSensitive: false); - - // Заменяем URL на markdown ссылки, если они еще не являются ссылками - String result = description; - int offset = 0; - - for (final urlMatch in urlRegex.allMatches(description)) { - // Проверяем, не находится ли URL внутри существующей markdown ссылки - bool isInsideLink = existingLinks.any((link) => urlMatch.start >= link.start && urlMatch.end <= link.end); - - if (!isInsideLink) { - final url = urlMatch.group(0)!; - final fullUrl = url.startsWith('www.') ? 'https://$url' : url; - final replacement = '[$url]($fullUrl)'; - result = result.replaceRange(urlMatch.start + offset, urlMatch.end + offset, replacement); - offset += replacement.length - url.length; - } - } - - description = result; - - // Гарантируем, что жирный текст будет распознан - // Заменяем **текст** на текст вручную для надежности - final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); - description = description.replaceAllMapped(boldRegex, (match) { - return '${match.group(1)}'; - }); - - final htmlData = md.markdownToHtml( - description, - extensionSet: md.ExtensionSet.gitHubFlavored, - ); - return Html( - data: htmlData, - style: { - "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5), color: Colors.black87), - "p": Style(margin: Margins.only(bottom: 12), color: Colors.black87), - "b, strong": Style(fontWeight: FontWeight.bold, color: Colors.black), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: Colors.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: Colors.black87), - "strong, b": Style(fontWeight: FontWeight.bold, color: Colors.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), - }, - onLinkTap: (url, attributes, element) async { - debugPrint('Link tapped: $url'); - if (url != null) { - try { - final uri = Uri.parse(url); - if (await canLaunchUrl(uri)) { - await launchUrl(uri, mode: LaunchMode.externalApplication); - } else { - debugPrint('Cannot launch URL: $url'); - } - } catch (e) { - debugPrint('Error launching URL: $e'); - } - } - }, - ); + child: MarkdownHtmlWidget( + markdownText: blogPostState.blogPostModel!.description, + onLinkTap: (url, attributes, element) { + debugPrint('Link tapped: $url'); + return; }, ), ), @@ -445,10 +344,3 @@ class _BlogPostScreenState extends State { ); } } - -class _LinkRange { - final int start; - final int end; - - _LinkRange(this.start, this.end); -} diff --git a/lib/features/diets/presentation/widgets/expandable_text.dart b/lib/features/diets/presentation/widgets/expandable_text.dart index cf1c98ce..d9816685 100644 --- a/lib/features/diets/presentation/widgets/expandable_text.dart +++ b/lib/features/diets/presentation/widgets/expandable_text.dart @@ -3,11 +3,10 @@ import 'dart:math' as math; import 'package:eatvio_app/generated/l10n.dart'; import 'package:eatvio_app/core/theme/custom_text_style.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/utils/markdown_utils.dart'; +import 'package:eatvio_app/core/widgets/markdown_html_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:flutter_html/flutter_html.dart'; -import 'package:markdown/markdown.dart' as md; -import 'package:url_launcher/url_launcher.dart'; class ExpandableText extends StatefulWidget { final String text; @@ -57,60 +56,9 @@ class _ExpandableTextState extends State { }); } - String _processMarkdown(String text) { - // Автоматически преобразуем URL в markdown ссылки - // Сначала исправляем неправильный синтаксис markdown ссылок - final wrongLinkRegex = RegExp(r'\[(https?://[^\]]+|www\.[^\]]+)\]\(([^\)]+)\)'); - text = text.replaceAllMapped(wrongLinkRegex, (match) { - final urlInText = match.group(1)!; - if (!urlInText.startsWith('http://') && !urlInText.startsWith('https://') && !urlInText.startsWith('www.')) { - return match.group(0)!; - } - final fullUrl = urlInText.startsWith('www.') ? 'https://$urlInText' : urlInText; - return '[$urlInText]($fullUrl)'; - }); - - final linkRegex = RegExp(r'\[([^\]]+)\]\(([^\)]+)\)'); - final existingLinks = <_LinkRange>[]; - for (final linkMatch in linkRegex.allMatches(text)) { - existingLinks.add(_LinkRange(linkMatch.start, linkMatch.end)); - } - final urlRegex = RegExp(r'(https?://[^\s\)]+|www\.[^\s\)]+)', caseSensitive: false); - String result = text; - int offset = 0; - for (final urlMatch in urlRegex.allMatches(text)) { - bool isInsideLink = existingLinks.any((link) => - urlMatch.start >= link.start && urlMatch.end <= link.end); - if (!isInsideLink) { - final url = urlMatch.group(0)!; - final fullUrl = url.startsWith('www.') ? 'https://$url' : url; - final replacement = '[$url]($fullUrl)'; - result = result.replaceRange( - urlMatch.start + offset, - urlMatch.end + offset, - replacement, - ); - offset += replacement.length - url.length; - } - } - - // Гарантируем, что жирный текст будет распознан - final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); - result = result.replaceAllMapped(boldRegex, (match) { - return '${match.group(1)}'; - }); - - return result; - } - @override Widget build(BuildContext context) { final s = S.of(context); - final processedText = _processMarkdown(widget.text); - final htmlData = md.markdownToHtml( - processedText, - extensionSet: md.ExtensionSet.gitHubFlavored, - ); return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -127,49 +75,11 @@ class _ExpandableTextState extends State { constraints: BoxConstraints( maxHeight: isExpanded ? double.infinity : (widget.maxLines * (TextStyles.textMMediumAuto.fontSize ?? 16) * 1.5), ), - child: Html( + child: MarkdownHtmlWidget( key: _textKey, - data: htmlData, - style: { - "body": Style( - margin: Margins.zero, - padding: HtmlPaddings.zero, - fontSize: FontSize(TextStyles.textMMediumAuto.fontSize ?? 16), - lineHeight: const LineHeight(1.5), - ), - "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), - "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black), - "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), - }, - onLinkTap: (url, attributes, element) async { - if (url != null) { - final uri = Uri.parse(url); - if (await canLaunchUrl(uri)) { - await launchUrl(uri, mode: LaunchMode.externalApplication); - } - } - }, + markdownText: widget.text, + fontSize: TextStyles.textMMediumAuto.fontSize ?? 16, + textColor: appTheme.black, ), ), ), @@ -222,9 +132,3 @@ class _ExpandableTextState extends State { ); } } - -class _LinkRange { - final int start; - final int end; - _LinkRange(this.start, this.end); -} diff --git a/lib/features/feed/presentation/widgets/blog_post_widget.dart b/lib/features/feed/presentation/widgets/blog_post_widget.dart index a7334b3e..4192aaff 100644 --- a/lib/features/feed/presentation/widgets/blog_post_widget.dart +++ b/lib/features/feed/presentation/widgets/blog_post_widget.dart @@ -7,17 +7,16 @@ import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/utils/date_time_utils.dart'; import 'package:eatvio_app/core/widgets/custom_popup.dart'; import 'package:eatvio_app/core/widgets/feed_icon_button.dart'; +import 'package:eatvio_app/core/widgets/markdown_html_widget.dart'; import 'package:eatvio_app/features/chat/presentation/pages/photo_view_screen.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_state.dart'; import 'package:eatvio_app/features/feed/presentation/widgets/subscribe_button_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:markdown/markdown.dart' as md; class BlogPostWidget extends StatefulWidget { final int index; @@ -162,47 +161,8 @@ class _BlogPostWidgetState extends State { description = description.substring(0, cutPoint); } - // Гарантируем, что жирный текст будет распознан - final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); - description = description.replaceAllMapped(boldRegex, (match) { - return '${match.group(1)}'; - }); - - // Конвертируем markdown в HTML - String htmlData = md.markdownToHtml( - description, - extensionSet: md.ExtensionSet.gitHubFlavored, - ); - - return Html( - data: htmlData, - style: { - "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5), color: Colors.black87), - "p": Style(margin: Margins.only(bottom: 12), color: Colors.black87), - "b, strong": Style(fontWeight: FontWeight.bold, color: Colors.black), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: Colors.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: Colors.black87), - "strong, b": Style(fontWeight: FontWeight.bold, color: Colors.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), - }, + return MarkdownHtmlWidget( + markdownText: description, ); }, ), diff --git a/lib/features/feed/presentation/widgets/plan_widget.dart b/lib/features/feed/presentation/widgets/plan_widget.dart index 8f5a4bc2..9b0a3f3d 100644 --- a/lib/features/feed/presentation/widgets/plan_widget.dart +++ b/lib/features/feed/presentation/widgets/plan_widget.dart @@ -7,6 +7,7 @@ import 'package:eatvio_app/core/widgets/bookmark_button.dart'; import 'package:eatvio_app/core/widgets/custom_popup.dart'; import 'package:eatvio_app/core/widgets/info_row.dart'; import 'package:eatvio_app/core/widgets/feed_icon_button.dart'; +import 'package:eatvio_app/core/widgets/markdown_html_widget.dart'; import 'package:eatvio_app/features/diets/presentation/widgets/info_bouble.dart'; import 'package:eatvio_app/features/feed/models/plan_pagination_model.dart'; import 'package:eatvio_app/core/theme/custom_text_style.dart'; @@ -15,12 +16,9 @@ import 'package:eatvio_app/features/feed/presentation/bloc/plans_cubit/plans_cub import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:markdown/markdown.dart' as md; -import 'package:url_launcher/url_launcher.dart'; class PlanWidget extends StatefulWidget { final PlanModel plan; @@ -117,96 +115,11 @@ class _PlanWidgetState extends State { const SizedBox(height: 12), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), - child: Builder( - builder: (context) { - String details = widget.plan.details.length > 200 - ? '${widget.plan.details.substring(0, 200)}...' - : widget.plan.details; - // Автоматически преобразуем URL в markdown ссылки - // Сначала исправляем неправильный синтаксис markdown ссылок - final wrongLinkRegex = RegExp(r'\[(https?://[^\]]+|www\.[^\]]+)\]\(([^\)]+)\)'); - details = details.replaceAllMapped(wrongLinkRegex, (match) { - final urlInText = match.group(1)!; - if (!urlInText.startsWith('http://') && !urlInText.startsWith('https://') && !urlInText.startsWith('www.')) { - return match.group(0)!; - } - final fullUrl = urlInText.startsWith('www.') ? 'https://$urlInText' : urlInText; - return '[$urlInText]($fullUrl)'; - }); - - final linkRegex = RegExp(r'\[([^\]]+)\]\(([^\)]+)\)'); - final existingLinks = <_LinkRange>[]; - for (final linkMatch in linkRegex.allMatches(details)) { - existingLinks.add(_LinkRange(linkMatch.start, linkMatch.end)); - } - final urlRegex = RegExp(r'(https?://[^\s\)]+|www\.[^\s\)]+)', caseSensitive: false); - String result = details; - int offset = 0; - for (final urlMatch in urlRegex.allMatches(details)) { - bool isInsideLink = existingLinks.any((link) => - urlMatch.start >= link.start && urlMatch.end <= link.end); - if (!isInsideLink) { - final url = urlMatch.group(0)!; - final fullUrl = url.startsWith('www.') ? 'https://$url' : url; - final replacement = '[$url]($fullUrl)'; - result = result.replaceRange( - urlMatch.start + offset, - urlMatch.end + offset, - replacement, - ); - offset += replacement.length - url.length; - } - } - details = result; - - // Гарантируем, что жирный текст будет распознан - final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); - details = details.replaceAllMapped(boldRegex, (match) { - return '${match.group(1)}'; - }); - - return Html( - data: md.markdownToHtml( - details, - extensionSet: md.ExtensionSet.gitHubFlavored, - ), - style: { - "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5)), - "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), - "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black), - "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), - }, - onLinkTap: (url, attributes, element) async { - if (url != null) { - final uri = Uri.parse(url); - if (await canLaunchUrl(uri)) { - await launchUrl(uri, mode: LaunchMode.externalApplication); - } - } - }, - ); - }, + child: MarkdownHtmlWidget( + markdownText: widget.plan.details.length > 200 + ? '${widget.plan.details.substring(0, 200)}...' + : widget.plan.details, + textColor: appTheme.black, ), ), if (widget.plan.details.length > 200) @@ -320,9 +233,3 @@ class _PlanWidgetState extends State { ); } } - -class _LinkRange { - final int start; - final int end; - _LinkRange(this.start, this.end); -} diff --git a/lib/generated/intl/messages_all.dart b/lib/generated/intl/messages_all.dart index 3139e159..e3c9099c 100644 --- a/lib/generated/intl/messages_all.dart +++ b/lib/generated/intl/messages_all.dart @@ -11,7 +11,6 @@ import 'dart:async'; -import 'package:flutter/foundation.dart'; import 'package:intl/intl.dart'; import 'package:intl/message_lookup_by_library.dart'; import 'package:intl/src/intl_helpers.dart'; @@ -21,8 +20,8 @@ import 'messages_ru.dart' as messages_ru; typedef Future LibraryLoader(); Map _deferredLibraries = { - 'en': () => new SynchronousFuture(null), - 'ru': () => new SynchronousFuture(null), + 'en': () => new Future.value(null), + 'ru': () => new Future.value(null), }; MessageLookupByLibrary? _findExact(String localeName) { @@ -37,20 +36,19 @@ MessageLookupByLibrary? _findExact(String localeName) { } /// User programs should call this before using [localeName] for messages. -Future initializeMessages(String localeName) { +Future initializeMessages(String localeName) async { var availableLocale = Intl.verifiedLocale( localeName, (locale) => _deferredLibraries[locale] != null, - onFailure: (_) => null, - ); + onFailure: (_) => null); if (availableLocale == null) { - return new SynchronousFuture(false); + return new Future.value(false); } var lib = _deferredLibraries[availableLocale]; - lib == null ? new SynchronousFuture(false) : lib(); + await (lib == null ? new Future.value(false) : lib()); initializeInternalMessageLookup(() => new CompositeMessageLookup()); messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor); - return new SynchronousFuture(true); + return new Future.value(true); } bool _messagesExistFor(String locale) { @@ -62,11 +60,8 @@ bool _messagesExistFor(String locale) { } MessageLookupByLibrary? _findGeneratedMessagesFor(String locale) { - var actualLocale = Intl.verifiedLocale( - locale, - _messagesExistFor, - onFailure: (_) => null, - ); + var actualLocale = Intl.verifiedLocale(locale, _messagesExistFor, + onFailure: (_) => null); if (actualLocale == null) return null; return _findExact(actualLocale); } diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart index 28705dcb..c9b03cf4 100644 --- a/lib/generated/intl/messages_en.dart +++ b/lib/generated/intl/messages_en.dart @@ -7,8 +7,7 @@ // 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 +// ignore_for_file:unused_import, file_names import 'package:intl/intl.dart'; import 'package:intl/message_lookup_by_library.dart'; @@ -20,914 +19,496 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'en'; - static String m0(date) => "Консультант прокомментировал день ${date}"; + static m0(date) => "Консультант прокомментировал день ${date}"; - static String m1(planName) => "План «${planName}» начался"; + static m1(planName) => "План «${planName}» начался"; - static String m2(planName, name) => - "План «${planName}» с пользователем ${name} начался"; + static m2(planName, name) => "План «${planName}» с пользователем ${name} начался"; - static String m3(step) => "шаг ${step} из 2"; + static m3(step) => "шаг ${step} из 2"; - static String m4(planName, name) => - "Завтра начинается план «${planName}» с пользователем ${name}"; + static m4(planName, name) => "Завтра начинается план «${planName}» с пользователем ${name}"; - static String m5(planName) => - "Завтра начнется прохождение плана «${planName}»"; + static m5(planName) => "Завтра начнется прохождение плана «${planName}»"; - static String m6(name, planName) => - "Пользователь ${name} отменил подписку на план «${planName}»"; + static m6(name, planName) => "Пользователь ${name} отменил подписку на план «${planName}»"; - static String m7(name, planName) => - "Пользователь ${name} оплатил план «${planName}»"; + static m7(name, planName) => "Пользователь ${name} оплатил план «${planName}»"; - static String m8(name, planName) => - "Пользователь ${name} подписался на план «${planName}»"; + static m8(name, planName) => "Пользователь ${name} подписался на план «${planName}»"; - static String m9(planName) => "Вы отменили подписку на план «${planName}»"; + static m9(planName) => "Вы отменили подписку на план «${planName}»"; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { - "Moscow": MessageLookupByLibrary.simpleMessage("Москва"), - "Russia": MessageLookupByLibrary.simpleMessage("Россия"), - "about_diet": MessageLookupByLibrary.simpleMessage("Об этой диете"), - "about_plan": MessageLookupByLibrary.simpleMessage("Об этом плане"), - "about_recipe": MessageLookupByLibrary.simpleMessage("Об этом рецепте"), - "acc_has_been_created": MessageLookupByLibrary.simpleMessage( - "Ваш аккаунт создан. Для входа используйте этот пароль:", - ), - "acc_has_been_created_btn": MessageLookupByLibrary.simpleMessage( - "Войти в аккаунт", - ), - "accountDeleting": MessageLookupByLibrary.simpleMessage( - "Удаление аккаунта", - ), - "active": MessageLookupByLibrary.simpleMessage("Активен"), - "active_consultations_count": MessageLookupByLibrary.simpleMessage( - "Кол-во активных консультаций", - ), - "active_diet_state": MessageLookupByLibrary.simpleMessage("Активная"), - "activity_fifth_value": MessageLookupByLibrary.simpleMessage( - "1,9 — экстремальный (несколько интенсивных тренировок в день)", - ), - "activity_first_value": MessageLookupByLibrary.simpleMessage( - "1,2 — минимальный (сидячая работа, отсутствие физических нагрузок)", - ), - "activity_fourth_value": MessageLookupByLibrary.simpleMessage( - "1,7 — высокий (тренировки 30–60 мин 5–7 раза в неделю; тяжёлая физическая работа)", - ), - "activity_second_value": MessageLookupByLibrary.simpleMessage( - "1,375 — низкий (тренировки не менее 20 мин 1–3 раза в неделю)", - ), - "activity_third_value": MessageLookupByLibrary.simpleMessage( - "1,55 — умеренный (тренировки 30–60 мин 3–4 раза в неделю)", - ), - "add": MessageLookupByLibrary.simpleMessage("Добавить"), - "addAtLeastOneItem": MessageLookupByLibrary.simpleMessage( - "Добавьте хотя бы одину опцию", - ), - "add_card": MessageLookupByLibrary.simpleMessage("Привязать карту"), - "add_cover": MessageLookupByLibrary.simpleMessage("Добавьте обложку"), - "add_measure": MessageLookupByLibrary.simpleMessage("Добавить замер"), - "added_products_in_glossary": MessageLookupByLibrary.simpleMessage( - "Кол-во продуктов добавленных в глоссарий", - ), - "adding_plan": MessageLookupByLibrary.simpleMessage("Добавление плана"), - "additional_information": MessageLookupByLibrary.simpleMessage( - "Дополнительная информация", - ), - "admin": MessageLookupByLibrary.simpleMessage("Админ"), - "alcohol": MessageLookupByLibrary.simpleMessage("Алкоголь"), - "all": MessageLookupByLibrary.simpleMessage("Все"), - "allergies_presence": MessageLookupByLibrary.simpleMessage( - "Наличие аллергии", - ), - "allowAccess": MessageLookupByLibrary.simpleMessage("Разрешить доступ"), - "allowAccessToCamera": MessageLookupByLibrary.simpleMessage( - "Разрешите доступ к камере", - ), - "allowAccessToCameraDescription": MessageLookupByLibrary.simpleMessage( - "Предоставление доступа позволит вам делать фотографии и добавлять к записям", - ), - "allowAcessToGalery": MessageLookupByLibrary.simpleMessage( - "Разрешите доступ к фото", - ), - "allowAcessToGaleryDescription": MessageLookupByLibrary.simpleMessage( - "Предоставление доступа позволит вам добавлять фото к записям", - ), - "another_form_of_comment": MessageLookupByLibrary.simpleMessage( - "комментария", - ), - "another_form_of_day": MessageLookupByLibrary.simpleMessage("дня"), - "another_form_of_hour": MessageLookupByLibrary.simpleMessage("часа"), - "another_form_of_minute": MessageLookupByLibrary.simpleMessage("минут"), - "another_form_of_stage": MessageLookupByLibrary.simpleMessage("этапа"), - "answer": MessageLookupByLibrary.simpleMessage("Ответить"), - "archived": MessageLookupByLibrary.simpleMessage("В архиве"), - "atLeast3Symbols": MessageLookupByLibrary.simpleMessage( - "Минимум 3 символа", - ), - "authentificate": MessageLookupByLibrary.simpleMessage("Войти"), - "average_pressure": MessageLookupByLibrary.simpleMessage( - "Средние показатели давления:", - ), - "back_to_chat": MessageLookupByLibrary.simpleMessage("Вернуться в чат"), - "bodymass_chart": MessageLookupByLibrary.simpleMessage("График ИМТ"), - "by_default": MessageLookupByLibrary.simpleMessage("По умолчанию"), - "calls_for_bullying": MessageLookupByLibrary.simpleMessage( - "Призывы к травле", - ), - "calories": MessageLookupByLibrary.simpleMessage("Калории"), - "can_not_choose_start_date": MessageLookupByLibrary.simpleMessage( - "Дату старта плана невозможно выбрать, пока Вы не привяжите карту", - ), - "can_not_load_data_please_try_again": MessageLookupByLibrary.simpleMessage( - "Не удалось загрузить данные. Попробуйте обновить страницу", - ), - "can_not_see_next_day": MessageLookupByLibrary.simpleMessage( - "Просмотр последующего дня возможен только при прохождении диеты", - ), - "cancel": MessageLookupByLibrary.simpleMessage("Отменить"), - "cancelConsultation": MessageLookupByLibrary.simpleMessage( - "Отменить консультацию", - ), - "cancel_diet": MessageLookupByLibrary.simpleMessage("Отменить диету?"), - "cancel_order": MessageLookupByLibrary.simpleMessage("Отменить заказ"), - "cannotDeleteAccount": MessageLookupByLibrary.simpleMessage( - "Не получилось удалить ваш аккаунт", - ), - "carb_type": MessageLookupByLibrary.simpleMessage("Мучное"), - "carb_type_desc": MessageLookupByLibrary.simpleMessage( - "Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы.", - ), - "carbohydrates": MessageLookupByLibrary.simpleMessage("Углеводы"), - "changeDiet": MessageLookupByLibrary.simpleMessage("Заменить диету"), - "chargeApproved": MessageLookupByLibrary.simpleMessage("Выплата одобрена"), - "chargeCollectionFailed": MessageLookupByLibrary.simpleMessage( - "Не удалось оформить выплату", - ), - "chat": MessageLookupByLibrary.simpleMessage("Чат"), - "check_out_video_recipe": MessageLookupByLibrary.simpleMessage( - "Посмотреть видео рецепт", - ), - "chest": MessageLookupByLibrary.simpleMessage("Грудь"), - "chest_circumference": MessageLookupByLibrary.simpleMessage("Обхват груди"), - "choose_date": MessageLookupByLibrary.simpleMessage("Выбрать дату"), - "choose_diet_duration": MessageLookupByLibrary.simpleMessage( - "Выберите срок диеты", - ), - "choose_plan_duration": MessageLookupByLibrary.simpleMessage( - "Выберите срок плана", - ), - "choose_plan_start_date": MessageLookupByLibrary.simpleMessage( - "Выберите дату старта плана питания", - ), - "choose_plan_start_date_with_personal_diet": - MessageLookupByLibrary.simpleMessage( - "Выберите дату старта плана питания с учетом составления персональной диеты", - ), - "choose_start_diet_date": MessageLookupByLibrary.simpleMessage( - "Выберите дату старты диеты. Она отобразиться у Вас в дневнике", - ), - "chosePlanType": MessageLookupByLibrary.simpleMessage("Выберите тип плана"), - "chose_plan_start_date_2": MessageLookupByLibrary.simpleMessage( - "Выберите дату старты плана. Она отобразиться в дневнике пользователя", - ), - "chosenPlanStartDateDescr": 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("Город проживания"), - "collectCharge": MessageLookupByLibrary.simpleMessage("Получить выплату"), - "comfort": MessageLookupByLibrary.simpleMessage("Комфорт"), - "comment": MessageLookupByLibrary.simpleMessage("комментарий"), - "commentForMeal": MessageLookupByLibrary.simpleMessage( - "Прокомментировать прием пищи", - ), - "comments": MessageLookupByLibrary.simpleMessage("Комментарии"), - "comments_plural": MessageLookupByLibrary.simpleMessage("комментариев"), - "complain": MessageLookupByLibrary.simpleMessage("Пожаловаться"), - "complaint": MessageLookupByLibrary.simpleMessage("Жалоба"), - "complaint_question": MessageLookupByLibrary.simpleMessage( - "Что именно в этом материале Вы считаете неприемлемым и нарушающим правила?", - ), - "complaint_sent": MessageLookupByLibrary.simpleMessage( - "Жалоба успешно отправлена", - ), - "complaint_sent_description": MessageLookupByLibrary.simpleMessage( - "Ваше обращение принято! Мы рассмотрим его в ближайшее время и примем необходимые меры. Спасибо за вашу бдительность и помощь в улучшении нашего сервиса.", - ), - "confirm": MessageLookupByLibrary.simpleMessage("Подтвердить"), - "congratsYouHaveFinishedPlan": MessageLookupByLibrary.simpleMessage( - "Поздравляем, Вы закончили план", - ), - "congratulations": MessageLookupByLibrary.simpleMessage("Поздравляем!"), - "consultantLeftComment": m0, - "consultations_count": MessageLookupByLibrary.simpleMessage( - "Кол-во проведенных консулдьтаций", - ), - "contactSupport": MessageLookupByLibrary.simpleMessage( - "Обратитесь в поддержку", - ), - "continueButton": MessageLookupByLibrary.simpleMessage("Продолжить"), - "continue_": MessageLookupByLibrary.simpleMessage("Продолжить"), - "copied": MessageLookupByLibrary.simpleMessage("cкопирован"), - "copied2": MessageLookupByLibrary.simpleMessage("Скопировано!"), - "copy": MessageLookupByLibrary.simpleMessage("Скопировать"), - "copy_link": MessageLookupByLibrary.simpleMessage("Скопировать ссылку"), - "copy_referral_link": MessageLookupByLibrary.simpleMessage( - "Скопировать пригласительную ссылку", - ), - "couldNotCancelOrder": MessageLookupByLibrary.simpleMessage( - "Не удалось отменить заказ", - ), - "could_not_cancel_diet": MessageLookupByLibrary.simpleMessage( - "Не удалось отменить диету", - ), - "could_not_delete_blog_post": MessageLookupByLibrary.simpleMessage( - "Не удалось удалить пост", - ), - "could_not_launch_video": MessageLookupByLibrary.simpleMessage( - "Не удалось запустить видео", - ), - "could_not_publish_blog_post": MessageLookupByLibrary.simpleMessage( - "Не удалось опубликовать пост", - ), - "could_not_publish_diet": MessageLookupByLibrary.simpleMessage( - "Не удалось опубликовать диету", - ), - "could_not_publish_recipe": MessageLookupByLibrary.simpleMessage( - "Не удалось опубликовать рецепт", - ), - "could_not_send_complain": MessageLookupByLibrary.simpleMessage( - "Не удалось отправить жалобу", - ), - "could_not_update_blog_post": MessageLookupByLibrary.simpleMessage( - "Не удалось обновить пост", - ), - "could_not_update_diet": MessageLookupByLibrary.simpleMessage( - "Не удалось обновить диету", - ), - "country": MessageLookupByLibrary.simpleMessage("Страна"), - "createPersonalDiet": MessageLookupByLibrary.simpleMessage( - "Составьте персональную диету", - ), - "create_diet": MessageLookupByLibrary.simpleMessage("Создание диеты"), - "cunsutation_was_paid_successfully": MessageLookupByLibrary.simpleMessage( - "Поздравляем, консультация успешно оплачена", - ), - "customer": MessageLookupByLibrary.simpleMessage("Покупатель"), - "customer_price": MessageLookupByLibrary.simpleMessage( - "Цена для покупателя", - ), - "date_has_ben_set": MessageLookupByLibrary.simpleMessage( - "Дата старта начала консультации установлена", - ), - "date_of_birth": MessageLookupByLibrary.simpleMessage("Дата рождения"), - "date_of_birth_error": MessageLookupByLibrary.simpleMessage( - "Некорректная дата рождения", - ), - "day": MessageLookupByLibrary.simpleMessage("День"), - "dayComment": MessageLookupByLibrary.simpleMessage( - "Комментарий ко всему дню", - ), - "dayCommentTitle": MessageLookupByLibrary.simpleMessage( - "Прокомментировать день", - ), - "days": MessageLookupByLibrary.simpleMessage("дней"), - "deception": MessageLookupByLibrary.simpleMessage("Обман"), - "delete": MessageLookupByLibrary.simpleMessage("Удалить"), - "deleteComment": MessageLookupByLibrary.simpleMessage( - "Удалить комментарий", - ), - "deleted": MessageLookupByLibrary.simpleMessage("Удалена"), - "diary": MessageLookupByLibrary.simpleMessage("Дневник"), - "diet": MessageLookupByLibrary.simpleMessage("Диета"), - "dietSuggestion": MessageLookupByLibrary.simpleMessage("Предложение диеты"), - "diet_author": MessageLookupByLibrary.simpleMessage("Автор диеты"), - "diet_has_been_sent_to_draft": MessageLookupByLibrary.simpleMessage( - "снята с публикации и перенесена в черновик", - ), - "diet_plan": MessageLookupByLibrary.simpleMessage("План диеты"), - "diet_started": MessageLookupByLibrary.simpleMessage("Диета уже начата"), - "diet_state": MessageLookupByLibrary.simpleMessage("Статус диеты"), - "diet_type": MessageLookupByLibrary.simpleMessage("Тип диеты"), - "do_you_have_hypertension_tendency": MessageLookupByLibrary.simpleMessage( - "Есть ли у вас гипертония?", - ), - "do_you_have_hypotension_tendency": MessageLookupByLibrary.simpleMessage( - "Есть ли у вас гипотония?", - ), - "do_you_take_pills": MessageLookupByLibrary.simpleMessage( - "Принимаете ли вы лекарства или бады?", - ), - "done": MessageLookupByLibrary.simpleMessage("Завершен"), - "down_pressure": MessageLookupByLibrary.simpleMessage( - "Нижние показатели давления:", - ), - "draft": MessageLookupByLibrary.simpleMessage("Черновик"), - "drafted": MessageLookupByLibrary.simpleMessage("Черновики"), - "drugs": MessageLookupByLibrary.simpleMessage("Наркотики"), - "eating_behavior": MessageLookupByLibrary.simpleMessage( - "Пищевое поведение", - ), - "eating_behavior_type": MessageLookupByLibrary.simpleMessage( - "Формирование пищевого поведения", - ), - "eating_behavior_type_desc": MessageLookupByLibrary.simpleMessage( - "Формирование здорового пищевого поведения — это процесс, который включает в себя изменение привычек и отношения к еде. Он направлен на то, чтобы помочь людям научиться правильно питаться и поддерживать здоровый образ жизни.Основные принципы формирования здорового пищевого поведения: \n● Разнообразие продуктов; \n● Сбалансированный рацион; \n● Питьевой режим; \n● Ограничение вредных продуктов; \n● Регулярные приёмы пищи; \n● Умеренность;Осознанное питание; \n● Физическая активность;", - ), - "eatvioIsAHelthyHabbit": MessageLookupByLibrary.simpleMessage( - "Итвио — это полезная привычка", - ), - "economy": MessageLookupByLibrary.simpleMessage("Эконом"), - "edit": MessageLookupByLibrary.simpleMessage("Редактировать"), - "email": MessageLookupByLibrary.simpleMessage("Электронная почта"), - "email_empty": MessageLookupByLibrary.simpleMessage( - "Необходимо ввести адрес электронной почты", - ), - "email_error": MessageLookupByLibrary.simpleMessage( - "Некорректный адрес электронной почты", - ), - "email_invalid": MessageLookupByLibrary.simpleMessage( - "Некорректный адрес электронной почты", - ), - "end_previous_plan": MessageLookupByLibrary.simpleMessage( - "Закончите прохождение предыдущего плана", - ), - "enter_additional_information": MessageLookupByLibrary.simpleMessage( - "Введите любую дополнительную информацию на своё усмотрение:", - ), - "enter_diet_description": MessageLookupByLibrary.simpleMessage( - "Введите описание диеты", - ), - "enter_diet_name": MessageLookupByLibrary.simpleMessage( - "Выведите название диеты", - ), - "enter_information": MessageLookupByLibrary.simpleMessage( - "Введите информацию...", - ), - "error_desc": MessageLookupByLibrary.simpleMessage( - "Произошла ошибка. Мы уже работаем над её устранением. Попробуйте позже", - ), - "exit": MessageLookupByLibrary.simpleMessage("Выйти"), - "expand": MessageLookupByLibrary.simpleMessage("Показать полностью"), - "explainResonOfCancelation": MessageLookupByLibrary.simpleMessage( - "Опишите причину отказа", - ), - "explicitImage": MessageLookupByLibrary.simpleMessage( - "Откровенное изображение", - ), - "explicitImages": MessageLookupByLibrary.simpleMessage( - "Откровенные изображения", - ), - "explicitImagesDescription": MessageLookupByLibrary.simpleMessage( - "Отправьте жалобу, если кто-то разместил откровенные изображения", - ), - "extremism": MessageLookupByLibrary.simpleMessage("Экстремизм"), - "fake_documents": MessageLookupByLibrary.simpleMessage( - "Поддельные документы", - ), - "fats": MessageLookupByLibrary.simpleMessage("Жиры"), - "favorite_foods": MessageLookupByLibrary.simpleMessage("Любимые продукты"), - "favorite_unfavorite_foods": MessageLookupByLibrary.simpleMessage( - "Ваши любимые/нелюбимые продукты питания?", - ), - "female": MessageLookupByLibrary.simpleMessage("Женский"), - "female_short": MessageLookupByLibrary.simpleMessage("Ж"), - "fillYasterday": 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 символ", - ), - "first_name_validation_error": MessageLookupByLibrary.simpleMessage( - "Имя обязательно к заполнению", - ), - "fit_type": MessageLookupByLibrary.simpleMessage("Поддержание формы"), - "fit_type_desc": MessageLookupByLibrary.simpleMessage( - "План питания для поддержания формы сбалансированный и разнообразный, чтобы обеспечить организм всеми необходимыми питательными веществами. Общие принципы: \n● Дробное питание; \n● Разнообразие продуктов; \n● Контроль порций; \n● Питьевой режим; \n● Ограничение вредных продуктов;", - ), - "fitness": MessageLookupByLibrary.simpleMessage("Поддержка формы"), - "for_a_month": MessageLookupByLibrary.simpleMessage("За месяц"), - "for_a_week": MessageLookupByLibrary.simpleMessage("За неделю"), - "for_a_year": MessageLookupByLibrary.simpleMessage("За год"), - "for_whole_period_of_time": MessageLookupByLibrary.simpleMessage( - "За всё время", - ), - "fourteenDays": MessageLookupByLibrary.simpleMessage("14 дней"), - "fraud": MessageLookupByLibrary.simpleMessage("Мошенничество"), - "fraud_description": MessageLookupByLibrary.simpleMessage( - "Мошенничество с целью наживы. Если вас обманули, пожалуйста, сообщите об этом в правоохранительные органы.", - ), - "from": MessageLookupByLibrary.simpleMessage("от"), - "from_a_to_z": MessageLookupByLibrary.simpleMessage("Название: А-Я"), - "from_z_to_a": MessageLookupByLibrary.simpleMessage("Название: Я-А"), - "gallery": MessageLookupByLibrary.simpleMessage("Галерея"), - "gender_error": MessageLookupByLibrary.simpleMessage("Выберите пол"), - "general_info": MessageLookupByLibrary.simpleMessage("Общая информация"), - "goToMyDiets": MessageLookupByLibrary.simpleMessage( - "Перейти к моим диетам", - ), - "go_to_diary": MessageLookupByLibrary.simpleMessage("Перейти в дневник"), - "gr": MessageLookupByLibrary.simpleMessage("гр"), - "grams": MessageLookupByLibrary.simpleMessage("гр"), - "has_alergy": MessageLookupByLibrary.simpleMessage("Наличие аллергии"), - "has_hyper": MessageLookupByLibrary.simpleMessage( - "Склонность к гипертонии", - ), - "has_hypo": MessageLookupByLibrary.simpleMessage("Склонность к гипотонии"), - "has_not_filled_it_yet": MessageLookupByLibrary.simpleMessage( - "ещё не закончил(a) этот день", - ), - "hatred": MessageLookupByLibrary.simpleMessage("Оскорбление"), - "hatred_description": MessageLookupByLibrary.simpleMessage( - "Враждебные высказывания", - ), - "height": MessageLookupByLibrary.simpleMessage("Рост"), - "height_error": MessageLookupByLibrary.simpleMessage("Введите рост"), - "height_measurements": MessageLookupByLibrary.simpleMessage("Замер роста"), - "hide": MessageLookupByLibrary.simpleMessage("Свернуть"), - "hip_circumference": MessageLookupByLibrary.simpleMessage("Обхват бедер"), - "hips": MessageLookupByLibrary.simpleMessage("Бедра"), - "hour": MessageLookupByLibrary.simpleMessage("час"), - "hours": MessageLookupByLibrary.simpleMessage("часов"), - "in_progress": MessageLookupByLibrary.simpleMessage("В процессе"), - "inactive_diet_state": MessageLookupByLibrary.simpleMessage("Черновик"), - "infoAboutOrder": MessageLookupByLibrary.simpleMessage( - "Информация о заказе", - ), - "ingredients": MessageLookupByLibrary.simpleMessage("Ингредиенты"), - "initial_measurements": MessageLookupByLibrary.simpleMessage( - "Первичные замеры", - ), - "invite": MessageLookupByLibrary.simpleMessage("Пригласить"), - "invited_people_count": MessageLookupByLibrary.simpleMessage( - "Количество приглашенных", - ), - "itCantBeRecovered": MessageLookupByLibrary.simpleMessage( - "Его нельзя будет восстановить", - ), - "label": MessageLookupByLibrary.simpleMessage("Название"), - "language": MessageLookupByLibrary.simpleMessage("Язык"), - "last_name": MessageLookupByLibrary.simpleMessage("Фамилия"), - "last_name_empty": MessageLookupByLibrary.simpleMessage( - "Фамилия обязательна для заполнения", - ), - "last_name_error": MessageLookupByLibrary.simpleMessage( - "Фамилия обязательна для заполнения", - ), - "last_name_short": MessageLookupByLibrary.simpleMessage( - "В фамилии должен быть минимум 6 символов", - ), - "last_step": MessageLookupByLibrary.simpleMessage("Последний шаг"), - "lawViolation": MessageLookupByLibrary.simpleMessage( - "Нарушение законодательства", - ), - "lbl_english": MessageLookupByLibrary.simpleMessage("English"), - "leaveComplainRequest": MessageLookupByLibrary.simpleMessage( - "Подать жалобу", - ), - "letsInvite": MessageLookupByLibrary.simpleMessage( - "Давайте пригласим близких в итвио", - ), - "light_type": MessageLookupByLibrary.simpleMessage("Легкая"), - "light_type_desc": MessageLookupByLibrary.simpleMessage( - "С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками.", - ), - "liked_groceries": MessageLookupByLibrary.simpleMessage("Любимые продукты"), - "link_was_copied": MessageLookupByLibrary.simpleMessage( - "Ссылка успешно скопирована", - ), - "loading": MessageLookupByLibrary.simpleMessage("Загрузка..."), - "login": MessageLookupByLibrary.simpleMessage("Войти в аккаунт"), - "lower": MessageLookupByLibrary.simpleMessage("Нижнее"), - "mail_was_copied": MessageLookupByLibrary.simpleMessage( - "Почта успешно скопирована", - ), - "male": MessageLookupByLibrary.simpleMessage("Мужской"), - "male_short": MessageLookupByLibrary.simpleMessage("М"), - "markAsRead": MessageLookupByLibrary.simpleMessage( - "Отметить всё прочитанным", - ), - "meal": MessageLookupByLibrary.simpleMessage("Приём пищи"), - "mealComment": MessageLookupByLibrary.simpleMessage( - "Комментарий к приему пищи", - ), - "meat": MessageLookupByLibrary.simpleMessage("Мясо"), - "meat_type": MessageLookupByLibrary.simpleMessage("С мясом"), - "meat_type_desc": MessageLookupByLibrary.simpleMessage( - "Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму.", - ), - "milliliter": MessageLookupByLibrary.simpleMessage("мл"), - "minPlanPrice": MessageLookupByLibrary.simpleMessage( - "Минимальная сумма 1200₽", - ), - "minimal_customer_price": MessageLookupByLibrary.simpleMessage( - "Минимальная цена для покупателя: 1200₽", - ), - "minute": MessageLookupByLibrary.simpleMessage("минута"), - "minutes": MessageLookupByLibrary.simpleMessage("минуты"), - "misrepresentation": MessageLookupByLibrary.simpleMessage( - "Введение в заблуждение", - ), - "misrepresentation_description": MessageLookupByLibrary.simpleMessage( - "Новости, которые могут вызвать широкий резонанс или несут угрозу, распространяемые с целью введения людей в заблуждение.", - ), - "moneySentToCard": MessageLookupByLibrary.simpleMessage( - "Средства отправлены на карту", - ), - "more_about_order": MessageLookupByLibrary.simpleMessage( - "Подробнее о заказе", - ), - "most_new": MessageLookupByLibrary.simpleMessage("Самые новые"), - "most_old": MessageLookupByLibrary.simpleMessage("Самые старые"), - "msg_network_err": MessageLookupByLibrary.simpleMessage("Сетевая ошибка!"), - "msg_something_went_wrong": MessageLookupByLibrary.simpleMessage( - "Что то пошло не так!", - ), - "my_blog": MessageLookupByLibrary.simpleMessage("Мой блог"), - "my_cards": MessageLookupByLibrary.simpleMessage("Мои карты"), - "my_diets": MessageLookupByLibrary.simpleMessage("Мои диеты"), - "my_plans": MessageLookupByLibrary.simpleMessage("Мои планы"), - "my_settings": MessageLookupByLibrary.simpleMessage("Мои настройки"), - "name_empty": MessageLookupByLibrary.simpleMessage( - "Имя пользователя обязательно для заполнения", - ), - "name_short": MessageLookupByLibrary.simpleMessage( - "В имени пользователя должно быть минимум 6 символов", - ), - "new_card": MessageLookupByLibrary.simpleMessage("Добавить карту"), - "next": MessageLookupByLibrary.simpleMessage("Далее"), - "nicotine": MessageLookupByLibrary.simpleMessage("Никотин"), - "no": MessageLookupByLibrary.simpleMessage("Нет"), - "no_account": MessageLookupByLibrary.simpleMessage("У меня нет аккаунта"), - "no_default_cards": MessageLookupByLibrary.simpleMessage( - "У вас нет привязанных карт. Что бы начать работу, привяжите карту", - ), - "not_liked_groceries": MessageLookupByLibrary.simpleMessage( - "Не любимые продукты", - ), - "notifications": MessageLookupByLibrary.simpleMessage("Уведомления"), - "ok": MessageLookupByLibrary.simpleMessage("Хорошо"), - "one_option": MessageLookupByLibrary.simpleMessage("1 опция"), - "option": MessageLookupByLibrary.simpleMessage("Опция"), - "option_content": MessageLookupByLibrary.simpleMessage("Содержание опции"), - "option_content_hint_text": MessageLookupByLibrary.simpleMessage( - "На связи 7 дней в неделю", - ), - "option_desc": MessageLookupByLibrary.simpleMessage("Описание опции"), - "option_desc_hint_text": MessageLookupByLibrary.simpleMessage( - "Этот план питания для похудения на 7 дней сбалансированный и разнообразный", - ), - "option_duration": MessageLookupByLibrary.simpleMessage( - "Продолжительность опции", - ), - "option_personal_diet_desc": MessageLookupByLibrary.simpleMessage( - "Опция подразумевает создание индивидуальной диеты", - ), - "option_title": MessageLookupByLibrary.simpleMessage("Заголовок опции"), - "order": MessageLookupByLibrary.simpleMessage("Порядок"), - "orderCanceled": MessageLookupByLibrary.simpleMessage("Заказ отменен"), - "order_created": MessageLookupByLibrary.simpleMessage("Заказ создан"), - "order_paid": MessageLookupByLibrary.simpleMessage("Заказ оплачен"), - "order_price": MessageLookupByLibrary.simpleMessage("Сумма заказа"), - "order_status": MessageLookupByLibrary.simpleMessage("Статус заказа"), - "orederCancelation": MessageLookupByLibrary.simpleMessage("Отмена заказа"), - "other": MessageLookupByLibrary.simpleMessage("Другое"), - "other_info": MessageLookupByLibrary.simpleMessage("Прочая информация"), - "password": MessageLookupByLibrary.simpleMessage("Пароль"), - "password_confirmation": MessageLookupByLibrary.simpleMessage( - "Подтвердите пароль", - ), - "password_confirmation_mismatch": MessageLookupByLibrary.simpleMessage( - "Пароли не совпадают", - ), - "password_desc": MessageLookupByLibrary.simpleMessage( - "Сохраните его в надежном месте! Вы сможете изменить пароль в настройках профиля", - ), - "password_empty": MessageLookupByLibrary.simpleMessage( - "Пароль обязателен для заполнения", - ), - "password_short": MessageLookupByLibrary.simpleMessage( - "В пароле должно быть минимум 6 символов", - ), - "pay": MessageLookupByLibrary.simpleMessage("Оплатить"), - "payment_failed": MessageLookupByLibrary.simpleMessage("Оплата не прошла"), - "pcs": MessageLookupByLibrary.simpleMessage("шт"), - "pending_payment": MessageLookupByLibrary.simpleMessage("Ожидается оплата"), - "personal": MessageLookupByLibrary.simpleMessage("Персональные"), - "personalDietCreating": MessageLookupByLibrary.simpleMessage( - "Составление индивидуальной диеты", - ), - "personal_diet_set": MessageLookupByLibrary.simpleMessage( - "Персональная диета установлена", - ), - "personal_diet_state": MessageLookupByLibrary.simpleMessage("Персональная"), - "phisical_activity": MessageLookupByLibrary.simpleMessage( - "Уровень физической активности", - ), - "phone": MessageLookupByLibrary.simpleMessage("Телефон"), - "phone_error": MessageLookupByLibrary.simpleMessage( - "Некорректный номер телефона", - ), - "photo": MessageLookupByLibrary.simpleMessage("Фото"), - "physical_fitness": MessageLookupByLibrary.simpleMessage( - "Физическая форма", - ), - "place_of_living": MessageLookupByLibrary.simpleMessage("Место проживания"), - "planStarted": m1, - "planWillBeConfirmedAfterThreeDays": MessageLookupByLibrary.simpleMessage( - "Если вы не подтвердите, то план через три дня подтвердится автоматически", - ), - "planWithUserStarted": m2, - "plan_author": MessageLookupByLibrary.simpleMessage("Автор плана"), - "plan_desc": MessageLookupByLibrary.simpleMessage("Описание плана"), - "plan_desc_example": MessageLookupByLibrary.simpleMessage( - "Большое подробное, привлекательное описание плана", - ), - "plan_duration": MessageLookupByLibrary.simpleMessage("Срок плана"), - "plan_label_desc": MessageLookupByLibrary.simpleMessage( - "План для поддержания формы", - ), - "plan_seller": MessageLookupByLibrary.simpleMessage("Продавец плана"), - "plan_type": MessageLookupByLibrary.simpleMessage("Тип плана"), - "plans_complete": MessageLookupByLibrary.simpleMessage("Пройденные планы"), - "pleaseConfirmPlan": MessageLookupByLibrary.simpleMessage( - "Просим вас подтвердить прохождение плана", - ), - "please_try_again_later": MessageLookupByLibrary.simpleMessage( - "Пожалуйста, попробуйте еще раз позже", - ), - "popular": MessageLookupByLibrary.simpleMessage("Популярные"), - "preferred_language": MessageLookupByLibrary.simpleMessage( - "Предпочитаемый язык общения", - ), - "pressure": MessageLookupByLibrary.simpleMessage("Давление"), - "pressure_empty": MessageLookupByLibrary.simpleMessage( - "Все показатели давления обязательны к заполнению", - ), - "pressure_is_not_a_number": MessageLookupByLibrary.simpleMessage( - "Все показатели давления должны быть числами", - ), - "preview": MessageLookupByLibrary.simpleMessage("Превью"), - "price": MessageLookupByLibrary.simpleMessage("Цена"), - "price_explanation": MessageLookupByLibrary.simpleMessage( - "Разница в ценах, это комиссия Итвио", - ), - "profile": MessageLookupByLibrary.simpleMessage("Профиль"), - "prostitution": MessageLookupByLibrary.simpleMessage("Проституция"), - "proteins": MessageLookupByLibrary.simpleMessage("Белки"), - "public_diet_state": MessageLookupByLibrary.simpleMessage("Публичная"), - "publish": MessageLookupByLibrary.simpleMessage("Опубликовать"), - "published": MessageLookupByLibrary.simpleMessage("Опубликованные"), - "published_diets_count": MessageLookupByLibrary.simpleMessage( - "Кол-во опубликованных диет", - ), - "published_posts_count": MessageLookupByLibrary.simpleMessage( - "Количество опубликованных постов", - ), - "published_recipes_count": MessageLookupByLibrary.simpleMessage( - "Кол-во опубликованных рецептов", - ), - "rating_and_statistics": MessageLookupByLibrary.simpleMessage( - "Рейтинг и статистика", - ), - "rating_history": MessageLookupByLibrary.simpleMessage( - "Начисление рейтинга", - ), - "reasonExample": MessageLookupByLibrary.simpleMessage("Заказал по ошибке"), - "recipe_author": MessageLookupByLibrary.simpleMessage("Автор рецепта"), - "recipe_publishing": MessageLookupByLibrary.simpleMessage( - "Публикация рецепта", - ), - "refuse_order": MessageLookupByLibrary.simpleMessage( - "Отказаться от заказа", - ), - "register": MessageLookupByLibrary.simpleMessage("Зарегистрироваться"), - "registration_completed": MessageLookupByLibrary.simpleMessage( - "Регистрация завершена!", - ), - "removeFromActive": MessageLookupByLibrary.simpleMessage( - "Снять с публикации", - ), - "reply": MessageLookupByLibrary.simpleMessage("Ответить"), - "resend": MessageLookupByLibrary.simpleMessage("Отправить повторно"), - "save": MessageLookupByLibrary.simpleMessage("Сохранить"), - "send": MessageLookupByLibrary.simpleMessage("Отправить"), - "send_complain": MessageLookupByLibrary.simpleMessage("Отправить жалобу"), - "services": MessageLookupByLibrary.simpleMessage("Оказание услуг"), - "settings": MessageLookupByLibrary.simpleMessage("Настройки"), - "sex": MessageLookupByLibrary.simpleMessage("Пол"), - "share": MessageLookupByLibrary.simpleMessage("Поделиться"), - "signUpFailed": MessageLookupByLibrary.simpleMessage( - "Регистрация не удалась!", - ), - "skip": MessageLookupByLibrary.simpleMessage("Пропустить"), - "slim": MessageLookupByLibrary.simpleMessage("Похудение"), - "slim_type": MessageLookupByLibrary.simpleMessage("Похудение"), - "slim_type_desc": MessageLookupByLibrary.simpleMessage( - "План питания для похудения должен быть разработан с учётом индивидуальных особенностей организма, возраста, пола, уровня физической активности и состояния здоровья. Общие принципы: \n● Снижение калорийности; \n● Сбалансированный рацион; \n● Разнообразие продуктов; \n● Питьевой режим; \n● Ограничение вредных продуктов;", - ), - "smth_went_wrong_payment_failed": MessageLookupByLibrary.simpleMessage( - "Что-то пошло не так, оплата не прошла", - ), - "some_error_occurred": MessageLookupByLibrary.simpleMessage( - "Упс! Произошла ошибка", - ), - "some_error_occurred_description": MessageLookupByLibrary.simpleMessage( - "Произошла ошибка. Мы уже работаем над ее устранением. Попробуйте позже.", - ), - "something_went_wrong": MessageLookupByLibrary.simpleMessage( - "Упс! Что-то пошло не так", - ), - "sorry_we_did_not_find_the_plan": MessageLookupByLibrary.simpleMessage( - "Извините, план где-то потерялся, мы уже ищем его", - ), - "spam": MessageLookupByLibrary.simpleMessage("Спам"), - "spam_description": MessageLookupByLibrary.simpleMessage( - "Отправьте жалобу, если Вы заметили рекламу, размещенную в не предназначенном для этого месте.", - ), - "sport_hobbies": MessageLookupByLibrary.simpleMessage( - "Спортивные увлечения", - ), - "stage": MessageLookupByLibrary.simpleMessage("этап"), - "stages": MessageLookupByLibrary.simpleMessage("этапов"), - "standard": MessageLookupByLibrary.simpleMessage("Стандарт"), - "startDateHasBeenSet": MessageLookupByLibrary.simpleMessage( - "Выбрана дата старта", - ), - "startDiet": MessageLookupByLibrary.simpleMessage("Начать диету"), - "statistic": MessageLookupByLibrary.simpleMessage("Статистика"), - "step": MessageLookupByLibrary.simpleMessage("Шаг"), - "step_by_step_photo_recipe": MessageLookupByLibrary.simpleMessage( - "Пошаговый фоторецепт", - ), - "step_widget": m3, - "successfully_published": MessageLookupByLibrary.simpleMessage( - "успешно опубликован", - ), - "suggestDiet": MessageLookupByLibrary.simpleMessage("Предложить диету"), - "suicide": MessageLookupByLibrary.simpleMessage("Склонение к самоубийству"), - "takes_pills": MessageLookupByLibrary.simpleMessage("Принимает лекарства"), - "tap_on_link_to_pay": MessageLookupByLibrary.simpleMessage( - "Перейдите по ссылке для оплаты консультации", - ), - "tell_your_schedule": MessageLookupByLibrary.simpleMessage( - "Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:", - ), - "text_was_copied": MessageLookupByLibrary.simpleMessage( - "Text copied successfully", - ), - "there_is_a_video": MessageLookupByLibrary.simpleMessage("Есть видео"), - "three_options": MessageLookupByLibrary.simpleMessage("3 опции"), - "time": MessageLookupByLibrary.simpleMessage("Время прохождения"), - "time_to_complete_plan": MessageLookupByLibrary.simpleMessage( - "Время выполнения плана", - ), - "toOffer": MessageLookupByLibrary.simpleMessage("Предложить"), - "to_draft": MessageLookupByLibrary.simpleMessage("В черновик"), - "to_order": MessageLookupByLibrary.simpleMessage("Заказать"), - "tommorowPlanWithUserWillStart": m4, - "tomorrowYourPlanWillStart": m5, - "try_again": MessageLookupByLibrary.simpleMessage("Попробовать снова"), - "try_again_2": MessageLookupByLibrary.simpleMessage("Попробуйте ещё раз"), - "typeAmoutOfReturn": MessageLookupByLibrary.simpleMessage( - "Укажите сумму которую вы хотите вернуть", - ), - "typeDayComment": MessageLookupByLibrary.simpleMessage( - "Как можно подробнее прокомментируйте дневник пользователя", - ), - "typeMealComment": MessageLookupByLibrary.simpleMessage( - "Как можно подробнее прокомментируйте прием пищи", - ), - "typePortionComment": MessageLookupByLibrary.simpleMessage( - "Прокомментируйте блюдо", - ), - "type_email": MessageLookupByLibrary.simpleMessage("Введите email"), - "type_height": MessageLookupByLibrary.simpleMessage("Введите рост"), - "type_here_your_complaint": MessageLookupByLibrary.simpleMessage( - "Напишите здесь свою жалобу", - ), - "type_weight": MessageLookupByLibrary.simpleMessage("Введите вес"), - "unfavorite_foods": MessageLookupByLibrary.simpleMessage( - "Нелюбимые продукты", - ), - "up_pressure": MessageLookupByLibrary.simpleMessage( - "Верхние показатели давления:", - ), - "upper": MessageLookupByLibrary.simpleMessage("Верхнее"), - "userCanceldThePlanSubscription": m6, - "userConfirmedPlanCompletion": MessageLookupByLibrary.simpleMessage( - "Пользователь подтвердил прохождения плана. В ближайшее время Вы получите", - ), - "userConfirmedPlanCompletionWithoutSum": - MessageLookupByLibrary.simpleMessage( - "Пользователь подтвердил прохождения плана.", - ), - "userPaidThePlan": m7, - "userSubscribedToPlan": m8, - "user_authorization": MessageLookupByLibrary.simpleMessage( - "Аутентификация", - ), - "user_data": MessageLookupByLibrary.simpleMessage("Данные пользователя"), - "user_data_desc": MessageLookupByLibrary.simpleMessage( - "Эти данные нужны для корректной работы дневника питания и расчета вашей дневной нормы потребления КБЖУ", - ), - "user_info": MessageLookupByLibrary.simpleMessage("Анкета пользователя"), - "user_registration": MessageLookupByLibrary.simpleMessage( - "Регистрация пользователя", - ), - "username": MessageLookupByLibrary.simpleMessage("Имя пользователя"), - "vegan": MessageLookupByLibrary.simpleMessage("Веган."), - "vegan_type": MessageLookupByLibrary.simpleMessage("Вегетарианская"), - "vegan_type_desc": MessageLookupByLibrary.simpleMessage( - "Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья.", - ), - "violenceAndHostility": MessageLookupByLibrary.simpleMessage( - "Насилие и вражда", - ), - "violence_against_people_or_animal": MessageLookupByLibrary.simpleMessage( - "Насилие над людьми или животными", - ), - "waist": MessageLookupByLibrary.simpleMessage("Талия"), - "waist_circumference": MessageLookupByLibrary.simpleMessage("Обхват талии"), - "wait_for_start_day": MessageLookupByLibrary.simpleMessage( - "Ожидайте начала плана питания", - ), - "want_to_see_tomorrow": MessageLookupByLibrary.simpleMessage( - "Хотите заглянуть в будущее?", - ), - "weAreLookingFor": MessageLookupByLibrary.simpleMessage( - "Мы собираем самое большое сообщество людей, желающих вести здоровый образ жизни!", - ), - "weapon": MessageLookupByLibrary.simpleMessage("Оружие"), - "weight": MessageLookupByLibrary.simpleMessage("Вес"), - "weight_chart": MessageLookupByLibrary.simpleMessage("График веса"), - "weight_error": MessageLookupByLibrary.simpleMessage("Введите вес"), - "weight_measurements": MessageLookupByLibrary.simpleMessage("Замер веса"), - "wellness": MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), - "wellness_type": MessageLookupByLibrary.simpleMessage( - "Улучшение самочувствия", - ), - "wellness_type_desc": MessageLookupByLibrary.simpleMessage( - "Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы.", - ), - "what_do_you_want_to_complaint_about": MessageLookupByLibrary.simpleMessage( - "На что Вы хотите пожаловаться?", - ), - "what_is_your_name": MessageLookupByLibrary.simpleMessage("Как вас зовут?"), - "wrong_credentials": MessageLookupByLibrary.simpleMessage( - "Неверные данные пользователя", - ), - "youCanComplain": MessageLookupByLibrary.simpleMessage( - "Если вас что-то не устроило, вы можете подать жалобу", - ), - "youCanceledSubscriptionToPlan": m9, - "youShureYouWantToCancelOrder": MessageLookupByLibrary.simpleMessage( - "Вы уверены, что хотите отменить заказ?", - ), - "youShureYouWantToDeleteAccount": MessageLookupByLibrary.simpleMessage( - "Вы уверены, что хотите удалить аккаунт?", - ), - "youWithUs": MessageLookupByLibrary.simpleMessage("Вы с итвио уже\n"), - "you_can_not_open_this_day": MessageLookupByLibrary.simpleMessage( - "Вы не можете перейти в этот день", - ), - "you_can_not_start_plan_until_end_of_prev_one": - MessageLookupByLibrary.simpleMessage( - "Вы не можете начать план, пока не закончите прохождение предыдущего", - ), - "you_will_get": MessageLookupByLibrary.simpleMessage("Вы получите"), - "your_blood_pressure": MessageLookupByLibrary.simpleMessage( - "Ваше артериальное давление?", - ), - "your_favorite_sports": MessageLookupByLibrary.simpleMessage( - "Ваши спортивные увлечения?", - ), - "your_gender": MessageLookupByLibrary.simpleMessage("Ваш пол?"), - "your_height": MessageLookupByLibrary.simpleMessage("Ваш рост:"), - "your_last_name": MessageLookupByLibrary.simpleMessage("Ваша фамилия"), - "your_name": MessageLookupByLibrary.simpleMessage("Ваше имя"), - "your_rating": MessageLookupByLibrary.simpleMessage("Ваш рейтинг"), - "your_schedule": MessageLookupByLibrary.simpleMessage("Ваш режим дня?"), - "your_weight": MessageLookupByLibrary.simpleMessage("Ваш вес:"), + static _notInlinedMessages(_) => { + "Moscow" : MessageLookupByLibrary.simpleMessage("Москва"), + "Russia" : MessageLookupByLibrary.simpleMessage("Россия"), + "about_diet" : MessageLookupByLibrary.simpleMessage("Об этой диете"), + "about_plan" : MessageLookupByLibrary.simpleMessage("Об этом плане"), + "about_recipe" : MessageLookupByLibrary.simpleMessage("Об этом рецепте"), + "acc_has_been_created" : MessageLookupByLibrary.simpleMessage("Ваш аккаунт создан. Для входа используйте этот пароль:"), + "acc_has_been_created_btn" : MessageLookupByLibrary.simpleMessage("Войти в аккаунт"), + "accountDeleting" : MessageLookupByLibrary.simpleMessage("Удаление аккаунта"), + "active" : MessageLookupByLibrary.simpleMessage("Активен"), + "active_consultations_count" : MessageLookupByLibrary.simpleMessage("Кол-во активных консультаций"), + "active_diet_state" : MessageLookupByLibrary.simpleMessage("Активная"), + "activity_fifth_value" : MessageLookupByLibrary.simpleMessage("1,9 — экстремальный (несколько интенсивных тренировок в день)"), + "activity_first_value" : MessageLookupByLibrary.simpleMessage("1,2 — минимальный (сидячая работа, отсутствие физических нагрузок)"), + "activity_fourth_value" : MessageLookupByLibrary.simpleMessage("1,7 — высокий (тренировки 30–60 мин 5–7 раза в неделю; тяжёлая физическая работа)"), + "activity_second_value" : MessageLookupByLibrary.simpleMessage("1,375 — низкий (тренировки не менее 20 мин 1–3 раза в неделю)"), + "activity_third_value" : MessageLookupByLibrary.simpleMessage("1,55 — умеренный (тренировки 30–60 мин 3–4 раза в неделю)"), + "add" : MessageLookupByLibrary.simpleMessage("Добавить"), + "addAtLeastOneItem" : MessageLookupByLibrary.simpleMessage("Добавьте хотя бы одину опцию"), + "add_card" : MessageLookupByLibrary.simpleMessage("Привязать карту"), + "add_cover" : MessageLookupByLibrary.simpleMessage("Добавьте обложку"), + "add_measure" : MessageLookupByLibrary.simpleMessage("Добавить замер"), + "added_products_in_glossary" : MessageLookupByLibrary.simpleMessage("Кол-во продуктов добавленных в глоссарий"), + "adding_plan" : MessageLookupByLibrary.simpleMessage("Добавление плана"), + "additional_information" : MessageLookupByLibrary.simpleMessage("Дополнительная информация"), + "admin" : MessageLookupByLibrary.simpleMessage("Админ"), + "alcohol" : MessageLookupByLibrary.simpleMessage("Алкоголь"), + "all" : MessageLookupByLibrary.simpleMessage("Все"), + "allergies_presence" : MessageLookupByLibrary.simpleMessage("Наличие аллергии"), + "allowAccess" : MessageLookupByLibrary.simpleMessage("Разрешить доступ"), + "allowAccessToCamera" : MessageLookupByLibrary.simpleMessage("Разрешите доступ к камере"), + "allowAccessToCameraDescription" : MessageLookupByLibrary.simpleMessage("Предоставление доступа позволит вам делать фотографии и добавлять к записям"), + "allowAcessToGalery" : MessageLookupByLibrary.simpleMessage("Разрешите доступ к фото"), + "allowAcessToGaleryDescription" : MessageLookupByLibrary.simpleMessage("Предоставление доступа позволит вам добавлять фото к записям"), + "another_form_of_comment" : MessageLookupByLibrary.simpleMessage("комментария"), + "another_form_of_day" : MessageLookupByLibrary.simpleMessage("дня"), + "another_form_of_hour" : MessageLookupByLibrary.simpleMessage("часа"), + "another_form_of_minute" : MessageLookupByLibrary.simpleMessage("минут"), + "another_form_of_stage" : MessageLookupByLibrary.simpleMessage("этапа"), + "answer" : MessageLookupByLibrary.simpleMessage("Ответить"), + "archived" : MessageLookupByLibrary.simpleMessage("В архиве"), + "atLeast3Symbols" : MessageLookupByLibrary.simpleMessage("Минимум 3 символа"), + "authentificate" : MessageLookupByLibrary.simpleMessage("Войти"), + "average_pressure" : MessageLookupByLibrary.simpleMessage("Средние показатели давления:"), + "back_to_chat" : MessageLookupByLibrary.simpleMessage("Вернуться в чат"), + "bodymass_chart" : MessageLookupByLibrary.simpleMessage("График ИМТ"), + "by_default" : MessageLookupByLibrary.simpleMessage("По умолчанию"), + "calls_for_bullying" : MessageLookupByLibrary.simpleMessage("Призывы к травле"), + "calories" : MessageLookupByLibrary.simpleMessage("Калории"), + "can_not_choose_start_date" : MessageLookupByLibrary.simpleMessage("Дату старта плана невозможно выбрать, пока Вы не привяжите карту"), + "can_not_load_data_please_try_again" : MessageLookupByLibrary.simpleMessage("Не удалось загрузить данные. Попробуйте обновить страницу"), + "can_not_see_next_day" : MessageLookupByLibrary.simpleMessage("Просмотр последующего дня возможен только при прохождении диеты"), + "cancel" : MessageLookupByLibrary.simpleMessage("Отменить"), + "cancelConsultation" : MessageLookupByLibrary.simpleMessage("Отменить консультацию"), + "cancel_diet" : MessageLookupByLibrary.simpleMessage("Отменить диету?"), + "cancel_order" : MessageLookupByLibrary.simpleMessage("Отменить заказ"), + "cannotDeleteAccount" : MessageLookupByLibrary.simpleMessage("Не получилось удалить ваш аккаунт"), + "carb_type" : MessageLookupByLibrary.simpleMessage("Мучное"), + "carb_type_desc" : MessageLookupByLibrary.simpleMessage("Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы."), + "carbohydrates" : MessageLookupByLibrary.simpleMessage("Углеводы"), + "changeDiet" : MessageLookupByLibrary.simpleMessage("Заменить диету"), + "chargeApproved" : MessageLookupByLibrary.simpleMessage("Выплата одобрена"), + "chargeCollectionFailed" : MessageLookupByLibrary.simpleMessage("Не удалось оформить выплату"), + "chat" : MessageLookupByLibrary.simpleMessage("Чат"), + "check_out_video_recipe" : MessageLookupByLibrary.simpleMessage("Посмотреть видео рецепт"), + "chest" : MessageLookupByLibrary.simpleMessage("Грудь"), + "chest_circumference" : MessageLookupByLibrary.simpleMessage("Обхват груди"), + "choose_date" : MessageLookupByLibrary.simpleMessage("Выбрать дату"), + "choose_diet_duration" : MessageLookupByLibrary.simpleMessage("Выберите срок диеты"), + "choose_plan_duration" : MessageLookupByLibrary.simpleMessage("Выберите срок плана"), + "choose_plan_start_date" : MessageLookupByLibrary.simpleMessage("Выберите дату старта плана питания"), + "choose_plan_start_date_with_personal_diet" : MessageLookupByLibrary.simpleMessage("Выберите дату старта плана питания с учетом составления персональной диеты"), + "choose_start_diet_date" : MessageLookupByLibrary.simpleMessage("Выберите дату старты диеты. Она отобразиться у Вас в дневнике"), + "chosePlanType" : MessageLookupByLibrary.simpleMessage("Выберите тип плана"), + "chose_plan_start_date_2" : MessageLookupByLibrary.simpleMessage("Выберите дату старты плана. Она отобразиться в дневнике пользователя"), + "chosenPlanStartDateDescr" : 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("Город проживания"), + "collectCharge" : MessageLookupByLibrary.simpleMessage("Получить выплату"), + "comfort" : MessageLookupByLibrary.simpleMessage("Комфорт"), + "comment" : MessageLookupByLibrary.simpleMessage("комментарий"), + "commentForMeal" : MessageLookupByLibrary.simpleMessage("Прокомментировать прием пищи"), + "comment_hint" : MessageLookupByLibrary.simpleMessage("Комментарий"), + "comments" : MessageLookupByLibrary.simpleMessage("Комментарии"), + "comments_plural" : MessageLookupByLibrary.simpleMessage("комментариев"), + "complain" : MessageLookupByLibrary.simpleMessage("Пожаловаться"), + "complaint" : MessageLookupByLibrary.simpleMessage("Жалоба"), + "complaint_question" : MessageLookupByLibrary.simpleMessage("Что именно в этом материале Вы считаете неприемлемым и нарушающим правила?"), + "complaint_sent" : MessageLookupByLibrary.simpleMessage("Жалоба успешно отправлена"), + "complaint_sent_description" : MessageLookupByLibrary.simpleMessage("Ваше обращение принято! Мы рассмотрим его в ближайшее время и примем необходимые меры. Спасибо за вашу бдительность и помощь в улучшении нашего сервиса."), + "confirm" : MessageLookupByLibrary.simpleMessage("Подтвердить"), + "congratsYouHaveFinishedPlan" : MessageLookupByLibrary.simpleMessage("Поздравляем, Вы закончили план"), + "congratulations" : MessageLookupByLibrary.simpleMessage("Поздравляем!"), + "consultantLeftComment" : m0, + "consultations_count" : MessageLookupByLibrary.simpleMessage("Кол-во проведенных консулдьтаций"), + "contactSupport" : MessageLookupByLibrary.simpleMessage("Обратитесь в поддержку"), + "continueButton" : MessageLookupByLibrary.simpleMessage("Продолжить"), + "continue_" : MessageLookupByLibrary.simpleMessage("Продолжить"), + "copied" : MessageLookupByLibrary.simpleMessage("cкопирован"), + "copied2" : MessageLookupByLibrary.simpleMessage("Скопировано!"), + "copy" : MessageLookupByLibrary.simpleMessage("Скопировать"), + "copy_link" : MessageLookupByLibrary.simpleMessage("Скопировать ссылку"), + "copy_referral_link" : MessageLookupByLibrary.simpleMessage("Скопировать пригласительную ссылку"), + "couldNotCancelOrder" : MessageLookupByLibrary.simpleMessage("Не удалось отменить заказ"), + "could_not_cancel_diet" : MessageLookupByLibrary.simpleMessage("Не удалось отменить диету"), + "could_not_delete_blog_post" : MessageLookupByLibrary.simpleMessage("Не удалось удалить пост"), + "could_not_launch_video" : MessageLookupByLibrary.simpleMessage("Не удалось запустить видео"), + "could_not_publish_blog_post" : MessageLookupByLibrary.simpleMessage("Не удалось опубликовать пост"), + "could_not_publish_diet" : MessageLookupByLibrary.simpleMessage("Не удалось опубликовать диету"), + "could_not_publish_recipe" : MessageLookupByLibrary.simpleMessage("Не удалось опубликовать рецепт"), + "could_not_send_complain" : MessageLookupByLibrary.simpleMessage("Не удалось отправить жалобу"), + "could_not_update_blog_post" : MessageLookupByLibrary.simpleMessage("Не удалось обновить пост"), + "could_not_update_diet" : MessageLookupByLibrary.simpleMessage("Не удалось обновить диету"), + "country" : MessageLookupByLibrary.simpleMessage("Страна"), + "createPersonalDiet" : MessageLookupByLibrary.simpleMessage("Составьте персональную диету"), + "create_diet" : MessageLookupByLibrary.simpleMessage("Создание диеты"), + "cunsutation_was_paid_successfully" : MessageLookupByLibrary.simpleMessage("Поздравляем, консультация успешно оплачена"), + "customer" : MessageLookupByLibrary.simpleMessage("Покупатель"), + "customer_price" : MessageLookupByLibrary.simpleMessage("Цена для покупателя"), + "date_has_ben_set" : MessageLookupByLibrary.simpleMessage("Дата старта начала консультации установлена"), + "date_of_birth" : MessageLookupByLibrary.simpleMessage("Дата рождения"), + "date_of_birth_error" : MessageLookupByLibrary.simpleMessage("Некорректная дата рождения"), + "day" : MessageLookupByLibrary.simpleMessage("День"), + "dayComment" : MessageLookupByLibrary.simpleMessage("Комментарий ко всему дню"), + "dayCommentTitle" : MessageLookupByLibrary.simpleMessage("Прокомментировать день"), + "days" : MessageLookupByLibrary.simpleMessage("дней"), + "deception" : MessageLookupByLibrary.simpleMessage("Обман"), + "delete" : MessageLookupByLibrary.simpleMessage("Удалить"), + "deleteComment" : MessageLookupByLibrary.simpleMessage("Удалить комментарий"), + "deleted" : MessageLookupByLibrary.simpleMessage("Удалена"), + "diary" : MessageLookupByLibrary.simpleMessage("Дневник"), + "diet" : MessageLookupByLibrary.simpleMessage("Диета"), + "dietSuggestion" : MessageLookupByLibrary.simpleMessage("Предложение диеты"), + "diet_author" : MessageLookupByLibrary.simpleMessage("Автор диеты"), + "diet_has_been_sent_to_draft" : MessageLookupByLibrary.simpleMessage("снята с публикации и перенесена в черновик"), + "diet_plan" : MessageLookupByLibrary.simpleMessage("План диеты"), + "diet_started" : MessageLookupByLibrary.simpleMessage("Диета уже начата"), + "diet_state" : MessageLookupByLibrary.simpleMessage("Статус диеты"), + "diet_type" : MessageLookupByLibrary.simpleMessage("Тип диеты"), + "do_you_have_hypertension_tendency" : MessageLookupByLibrary.simpleMessage("Есть ли у вас гипертония?"), + "do_you_have_hypotension_tendency" : MessageLookupByLibrary.simpleMessage("Есть ли у вас гипотония?"), + "do_you_take_pills" : MessageLookupByLibrary.simpleMessage("Принимаете ли вы лекарства или бады?"), + "done" : MessageLookupByLibrary.simpleMessage("Завершен"), + "down_pressure" : MessageLookupByLibrary.simpleMessage("Нижние показатели давления:"), + "draft" : MessageLookupByLibrary.simpleMessage("Черновик"), + "drafted" : MessageLookupByLibrary.simpleMessage("Черновики"), + "drugs" : MessageLookupByLibrary.simpleMessage("Наркотики"), + "eating_behavior" : MessageLookupByLibrary.simpleMessage("Пищевое поведение"), + "eating_behavior_type" : MessageLookupByLibrary.simpleMessage("Формирование пищевого поведения"), + "eating_behavior_type_desc" : MessageLookupByLibrary.simpleMessage("Формирование здорового пищевого поведения — это процесс, который включает в себя изменение привычек и отношения к еде. Он направлен на то, чтобы помочь людям научиться правильно питаться и поддерживать здоровый образ жизни.Основные принципы формирования здорового пищевого поведения: \n● Разнообразие продуктов; \n● Сбалансированный рацион; \n● Питьевой режим; \n● Ограничение вредных продуктов; \n● Регулярные приёмы пищи; \n● Умеренность;Осознанное питание; \n● Физическая активность;"), + "eatvioIsAHelthyHabbit" : MessageLookupByLibrary.simpleMessage("Итвио — это полезная привычка"), + "economy" : MessageLookupByLibrary.simpleMessage("Эконом"), + "edit" : MessageLookupByLibrary.simpleMessage("Редактировать"), + "email" : MessageLookupByLibrary.simpleMessage("Электронная почта"), + "email_empty" : MessageLookupByLibrary.simpleMessage("Необходимо ввести адрес электронной почты"), + "email_error" : MessageLookupByLibrary.simpleMessage("Некорректный адрес электронной почты"), + "email_invalid" : MessageLookupByLibrary.simpleMessage("Некорректный адрес электронной почты"), + "end_previous_plan" : MessageLookupByLibrary.simpleMessage("Закончите прохождение предыдущего плана"), + "enter_additional_information" : MessageLookupByLibrary.simpleMessage("Введите любую дополнительную информацию на своё усмотрение:"), + "enter_diet_description" : MessageLookupByLibrary.simpleMessage("Введите описание диеты"), + "enter_diet_name" : MessageLookupByLibrary.simpleMessage("Выведите название диеты"), + "enter_information" : MessageLookupByLibrary.simpleMessage("Введите информацию..."), + "error_desc" : MessageLookupByLibrary.simpleMessage("Произошла ошибка. Мы уже работаем над её устранением. Попробуйте позже"), + "exit" : MessageLookupByLibrary.simpleMessage("Выйти"), + "expand" : MessageLookupByLibrary.simpleMessage("Показать полностью"), + "explainResonOfCancelation" : MessageLookupByLibrary.simpleMessage("Опишите причину отказа"), + "explicitImage" : MessageLookupByLibrary.simpleMessage("Откровенное изображение"), + "explicitImages" : MessageLookupByLibrary.simpleMessage("Откровенные изображения"), + "explicitImagesDescription" : MessageLookupByLibrary.simpleMessage("Отправьте жалобу, если кто-то разместил откровенные изображения"), + "extremism" : MessageLookupByLibrary.simpleMessage("Экстремизм"), + "fake_documents" : MessageLookupByLibrary.simpleMessage("Поддельные документы"), + "fats" : MessageLookupByLibrary.simpleMessage("Жиры"), + "favorite_foods" : MessageLookupByLibrary.simpleMessage("Любимые продукты"), + "favorite_unfavorite_foods" : MessageLookupByLibrary.simpleMessage("Ваши любимые/нелюбимые продукты питания?"), + "female" : MessageLookupByLibrary.simpleMessage("Женский"), + "female_short" : MessageLookupByLibrary.simpleMessage("Ж"), + "fillYasterday" : 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 символ"), + "first_name_validation_error" : MessageLookupByLibrary.simpleMessage("Имя обязательно к заполнению"), + "fit_type" : MessageLookupByLibrary.simpleMessage("Поддержание формы"), + "fit_type_desc" : MessageLookupByLibrary.simpleMessage("План питания для поддержания формы сбалансированный и разнообразный, чтобы обеспечить организм всеми необходимыми питательными веществами. Общие принципы: \n● Дробное питание; \n● Разнообразие продуктов; \n● Контроль порций; \n● Питьевой режим; \n● Ограничение вредных продуктов;"), + "fitness" : MessageLookupByLibrary.simpleMessage("Поддержка формы"), + "for_a_month" : MessageLookupByLibrary.simpleMessage("За месяц"), + "for_a_week" : MessageLookupByLibrary.simpleMessage("За неделю"), + "for_a_year" : MessageLookupByLibrary.simpleMessage("За год"), + "for_whole_period_of_time" : MessageLookupByLibrary.simpleMessage("За всё время"), + "fourteenDays" : MessageLookupByLibrary.simpleMessage("14 дней"), + "fraud" : MessageLookupByLibrary.simpleMessage("Мошенничество"), + "fraud_description" : MessageLookupByLibrary.simpleMessage("Мошенничество с целью наживы. Если вас обманули, пожалуйста, сообщите об этом в правоохранительные органы."), + "from" : MessageLookupByLibrary.simpleMessage("от"), + "from_a_to_z" : MessageLookupByLibrary.simpleMessage("Название: А-Я"), + "from_z_to_a" : MessageLookupByLibrary.simpleMessage("Название: Я-А"), + "gallery" : MessageLookupByLibrary.simpleMessage("Галерея"), + "gender_error" : MessageLookupByLibrary.simpleMessage("Выберите пол"), + "general_info" : MessageLookupByLibrary.simpleMessage("Общая информация"), + "goToMyDiets" : MessageLookupByLibrary.simpleMessage("Перейти к моим диетам"), + "go_to_diary" : MessageLookupByLibrary.simpleMessage("Перейти в дневник"), + "gr" : MessageLookupByLibrary.simpleMessage("гр"), + "grams" : MessageLookupByLibrary.simpleMessage("гр"), + "has_alergy" : MessageLookupByLibrary.simpleMessage("Наличие аллергии"), + "has_hyper" : MessageLookupByLibrary.simpleMessage("Склонность к гипертонии"), + "has_hypo" : MessageLookupByLibrary.simpleMessage("Склонность к гипотонии"), + "has_not_filled_it_yet" : MessageLookupByLibrary.simpleMessage("ещё не закончил(a) этот день"), + "hatred" : MessageLookupByLibrary.simpleMessage("Оскорбление"), + "hatred_description" : MessageLookupByLibrary.simpleMessage("Враждебные высказывания"), + "height" : MessageLookupByLibrary.simpleMessage("Рост"), + "height_error" : MessageLookupByLibrary.simpleMessage("Введите рост"), + "height_measurements" : MessageLookupByLibrary.simpleMessage("Замер роста"), + "hide" : MessageLookupByLibrary.simpleMessage("Свернуть"), + "hip_circumference" : MessageLookupByLibrary.simpleMessage("Обхват бедер"), + "hips" : MessageLookupByLibrary.simpleMessage("Бедра"), + "hour" : MessageLookupByLibrary.simpleMessage("час"), + "hours" : MessageLookupByLibrary.simpleMessage("часов"), + "in_progress" : MessageLookupByLibrary.simpleMessage("В процессе"), + "inactive_diet_state" : MessageLookupByLibrary.simpleMessage("Черновик"), + "infoAboutOrder" : MessageLookupByLibrary.simpleMessage("Информация о заказе"), + "ingredients" : MessageLookupByLibrary.simpleMessage("Ингредиенты"), + "initial_measurements" : MessageLookupByLibrary.simpleMessage("Первичные замеры"), + "invite" : MessageLookupByLibrary.simpleMessage("Пригласить"), + "invited_people_count" : MessageLookupByLibrary.simpleMessage("Количество приглашенных"), + "itCantBeRecovered" : MessageLookupByLibrary.simpleMessage("Его нельзя будет восстановить"), + "label" : MessageLookupByLibrary.simpleMessage("Название"), + "language" : MessageLookupByLibrary.simpleMessage("Язык"), + "last_name" : MessageLookupByLibrary.simpleMessage("Фамилия"), + "last_name_empty" : MessageLookupByLibrary.simpleMessage("Фамилия обязательна для заполнения"), + "last_name_error" : MessageLookupByLibrary.simpleMessage("Фамилия обязательна для заполнения"), + "last_name_short" : MessageLookupByLibrary.simpleMessage("В фамилии должен быть минимум 6 символов"), + "last_step" : MessageLookupByLibrary.simpleMessage("Последний шаг"), + "lawViolation" : MessageLookupByLibrary.simpleMessage("Нарушение законодательства"), + "lbl_english" : MessageLookupByLibrary.simpleMessage("English"), + "leaveComplainRequest" : MessageLookupByLibrary.simpleMessage("Подать жалобу"), + "letsInvite" : MessageLookupByLibrary.simpleMessage("Давайте пригласим близких в итвио"), + "light_type" : MessageLookupByLibrary.simpleMessage("Легкая"), + "light_type_desc" : MessageLookupByLibrary.simpleMessage("С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками."), + "liked_groceries" : MessageLookupByLibrary.simpleMessage("Любимые продукты"), + "link_was_copied" : MessageLookupByLibrary.simpleMessage("Ссылка успешно скопирована"), + "loading" : MessageLookupByLibrary.simpleMessage("Загрузка..."), + "login" : MessageLookupByLibrary.simpleMessage("Войти в аккаунт"), + "lower" : MessageLookupByLibrary.simpleMessage("Нижнее"), + "mail_was_copied" : MessageLookupByLibrary.simpleMessage("Почта успешно скопирована"), + "male" : MessageLookupByLibrary.simpleMessage("Мужской"), + "male_short" : MessageLookupByLibrary.simpleMessage("М"), + "markAsRead" : MessageLookupByLibrary.simpleMessage("Отметить всё прочитанным"), + "meal" : MessageLookupByLibrary.simpleMessage("Приём пищи"), + "mealComment" : MessageLookupByLibrary.simpleMessage("Комментарий к приему пищи"), + "meat" : MessageLookupByLibrary.simpleMessage("Мясо"), + "meat_type" : MessageLookupByLibrary.simpleMessage("С мясом"), + "meat_type_desc" : MessageLookupByLibrary.simpleMessage("Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму."), + "milliliter" : MessageLookupByLibrary.simpleMessage("мл"), + "minPlanPrice" : MessageLookupByLibrary.simpleMessage("Минимальная сумма 1200₽"), + "minimal_customer_price" : MessageLookupByLibrary.simpleMessage("Минимальная цена для покупателя: 1200₽"), + "minute" : MessageLookupByLibrary.simpleMessage("минута"), + "minutes" : MessageLookupByLibrary.simpleMessage("минуты"), + "misrepresentation" : MessageLookupByLibrary.simpleMessage("Введение в заблуждение"), + "misrepresentation_description" : MessageLookupByLibrary.simpleMessage("Новости, которые могут вызвать широкий резонанс или несут угрозу, распространяемые с целью введения людей в заблуждение."), + "moneySentToCard" : MessageLookupByLibrary.simpleMessage("Средства отправлены на карту"), + "more_about_order" : MessageLookupByLibrary.simpleMessage("Подробнее о заказе"), + "most_new" : MessageLookupByLibrary.simpleMessage("Самые новые"), + "most_old" : MessageLookupByLibrary.simpleMessage("Самые старые"), + "msg_network_err" : MessageLookupByLibrary.simpleMessage("Сетевая ошибка!"), + "msg_something_went_wrong" : MessageLookupByLibrary.simpleMessage("Что то пошло не так!"), + "my_blog" : MessageLookupByLibrary.simpleMessage("Мой блог"), + "my_cards" : MessageLookupByLibrary.simpleMessage("Мои карты"), + "my_diets" : MessageLookupByLibrary.simpleMessage("Мои диеты"), + "my_plans" : MessageLookupByLibrary.simpleMessage("Мои планы"), + "my_settings" : MessageLookupByLibrary.simpleMessage("Мои настройки"), + "name_empty" : MessageLookupByLibrary.simpleMessage("Имя пользователя обязательно для заполнения"), + "name_short" : MessageLookupByLibrary.simpleMessage("В имени пользователя должно быть минимум 6 символов"), + "new_card" : MessageLookupByLibrary.simpleMessage("Добавить карту"), + "next" : MessageLookupByLibrary.simpleMessage("Далее"), + "nicotine" : MessageLookupByLibrary.simpleMessage("Никотин"), + "no" : MessageLookupByLibrary.simpleMessage("Нет"), + "no_account" : MessageLookupByLibrary.simpleMessage("У меня нет аккаунта"), + "no_default_cards" : MessageLookupByLibrary.simpleMessage("У вас нет привязанных карт. Что бы начать работу, привяжите карту"), + "not_liked_groceries" : MessageLookupByLibrary.simpleMessage("Не любимые продукты"), + "notifications" : MessageLookupByLibrary.simpleMessage("Уведомления"), + "ok" : MessageLookupByLibrary.simpleMessage("Хорошо"), + "one_option" : MessageLookupByLibrary.simpleMessage("1 опция"), + "option" : MessageLookupByLibrary.simpleMessage("Опция"), + "option_content" : MessageLookupByLibrary.simpleMessage("Содержание опции"), + "option_content_hint_text" : MessageLookupByLibrary.simpleMessage("На связи 7 дней в неделю"), + "option_desc" : MessageLookupByLibrary.simpleMessage("Описание опции"), + "option_desc_hint_text" : MessageLookupByLibrary.simpleMessage("Этот план питания для похудения на 7 дней сбалансированный и разнообразный"), + "option_duration" : MessageLookupByLibrary.simpleMessage("Продолжительность опции"), + "option_personal_diet_desc" : MessageLookupByLibrary.simpleMessage("Опция подразумевает создание индивидуальной диеты"), + "option_title" : MessageLookupByLibrary.simpleMessage("Заголовок опции"), + "order" : MessageLookupByLibrary.simpleMessage("Порядок"), + "orderCanceled" : MessageLookupByLibrary.simpleMessage("Заказ отменен"), + "order_created" : MessageLookupByLibrary.simpleMessage("Заказ создан"), + "order_paid" : MessageLookupByLibrary.simpleMessage("Заказ оплачен"), + "order_price" : MessageLookupByLibrary.simpleMessage("Сумма заказа"), + "order_status" : MessageLookupByLibrary.simpleMessage("Статус заказа"), + "orederCancelation" : MessageLookupByLibrary.simpleMessage("Отмена заказа"), + "other" : MessageLookupByLibrary.simpleMessage("Другое"), + "other_info" : MessageLookupByLibrary.simpleMessage("Прочая информация"), + "password" : MessageLookupByLibrary.simpleMessage("Пароль"), + "password_confirmation" : MessageLookupByLibrary.simpleMessage("Подтвердите пароль"), + "password_confirmation_mismatch" : MessageLookupByLibrary.simpleMessage("Пароли не совпадают"), + "password_desc" : MessageLookupByLibrary.simpleMessage("Сохраните его в надежном месте! Вы сможете изменить пароль в настройках профиля"), + "password_empty" : MessageLookupByLibrary.simpleMessage("Пароль обязателен для заполнения"), + "password_short" : MessageLookupByLibrary.simpleMessage("В пароле должно быть минимум 6 символов"), + "pay" : MessageLookupByLibrary.simpleMessage("Оплатить"), + "payment_failed" : MessageLookupByLibrary.simpleMessage("Оплата не прошла"), + "pcs" : MessageLookupByLibrary.simpleMessage("шт"), + "pending_payment" : MessageLookupByLibrary.simpleMessage("Ожидается оплата"), + "personal" : MessageLookupByLibrary.simpleMessage("Персональные"), + "personalDietCreating" : MessageLookupByLibrary.simpleMessage("Составление индивидуальной диеты"), + "personal_diet_set" : MessageLookupByLibrary.simpleMessage("Персональная диета установлена"), + "personal_diet_state" : MessageLookupByLibrary.simpleMessage("Персональная"), + "phisical_activity" : MessageLookupByLibrary.simpleMessage("Уровень физической активности"), + "phone" : MessageLookupByLibrary.simpleMessage("Телефон"), + "phone_error" : MessageLookupByLibrary.simpleMessage("Некорректный номер телефона"), + "photo" : MessageLookupByLibrary.simpleMessage("Фото"), + "physical_fitness" : MessageLookupByLibrary.simpleMessage("Физическая форма"), + "place_of_living" : MessageLookupByLibrary.simpleMessage("Место проживания"), + "planStarted" : m1, + "planWillBeConfirmedAfterThreeDays" : MessageLookupByLibrary.simpleMessage("Если вы не подтвердите, то план через три дня подтвердится автоматически"), + "planWithUserStarted" : m2, + "plan_author" : MessageLookupByLibrary.simpleMessage("Автор плана"), + "plan_desc" : MessageLookupByLibrary.simpleMessage("Описание плана"), + "plan_desc_example" : MessageLookupByLibrary.simpleMessage("Большое подробное, привлекательное описание плана"), + "plan_duration" : MessageLookupByLibrary.simpleMessage("Срок плана"), + "plan_label_desc" : MessageLookupByLibrary.simpleMessage("План для поддержания формы"), + "plan_seller" : MessageLookupByLibrary.simpleMessage("Продавец плана"), + "plan_type" : MessageLookupByLibrary.simpleMessage("Тип плана"), + "plans_complete" : MessageLookupByLibrary.simpleMessage("Пройденные планы"), + "pleaseConfirmPlan" : MessageLookupByLibrary.simpleMessage("Просим вас подтвердить прохождение плана"), + "please_try_again_later" : MessageLookupByLibrary.simpleMessage("Пожалуйста, попробуйте еще раз позже"), + "popular" : MessageLookupByLibrary.simpleMessage("Популярные"), + "preferred_language" : MessageLookupByLibrary.simpleMessage("Предпочитаемый язык общения"), + "pressure" : MessageLookupByLibrary.simpleMessage("Давление"), + "pressure_empty" : MessageLookupByLibrary.simpleMessage("Все показатели давления обязательны к заполнению"), + "pressure_is_not_a_number" : MessageLookupByLibrary.simpleMessage("Все показатели давления должны быть числами"), + "preview" : MessageLookupByLibrary.simpleMessage("Превью"), + "price" : MessageLookupByLibrary.simpleMessage("Цена"), + "price_explanation" : MessageLookupByLibrary.simpleMessage("Разница в ценах, это комиссия Итвио"), + "profile" : MessageLookupByLibrary.simpleMessage("Профиль"), + "prostitution" : MessageLookupByLibrary.simpleMessage("Проституция"), + "proteins" : MessageLookupByLibrary.simpleMessage("Белки"), + "public_diet_state" : MessageLookupByLibrary.simpleMessage("Публичная"), + "publish" : MessageLookupByLibrary.simpleMessage("Опубликовать"), + "published" : MessageLookupByLibrary.simpleMessage("Опубликованные"), + "published_diets_count" : MessageLookupByLibrary.simpleMessage("Кол-во опубликованных диет"), + "published_posts_count" : MessageLookupByLibrary.simpleMessage("Количество опубликованных постов"), + "published_recipes_count" : MessageLookupByLibrary.simpleMessage("Кол-во опубликованных рецептов"), + "rating_and_statistics" : MessageLookupByLibrary.simpleMessage("Рейтинг и статистика"), + "rating_history" : MessageLookupByLibrary.simpleMessage("Начисление рейтинга"), + "reasonExample" : MessageLookupByLibrary.simpleMessage("Заказал по ошибке"), + "recipe_author" : MessageLookupByLibrary.simpleMessage("Автор рецепта"), + "recipe_publishing" : MessageLookupByLibrary.simpleMessage("Публикация рецепта"), + "refuse_order" : MessageLookupByLibrary.simpleMessage("Отказаться от заказа"), + "register" : MessageLookupByLibrary.simpleMessage("Зарегистрироваться"), + "registration_completed" : MessageLookupByLibrary.simpleMessage("Регистрация завершена!"), + "removeFromActive" : MessageLookupByLibrary.simpleMessage("Снять с публикации"), + "reply" : MessageLookupByLibrary.simpleMessage("Ответить"), + "resend" : MessageLookupByLibrary.simpleMessage("Отправить повторно"), + "save" : MessageLookupByLibrary.simpleMessage("Сохранить"), + "send" : MessageLookupByLibrary.simpleMessage("Отправить"), + "send_complain" : MessageLookupByLibrary.simpleMessage("Отправить жалобу"), + "services" : MessageLookupByLibrary.simpleMessage("Оказание услуг"), + "settings" : MessageLookupByLibrary.simpleMessage("Настройки"), + "sex" : MessageLookupByLibrary.simpleMessage("Пол"), + "share" : MessageLookupByLibrary.simpleMessage("Поделиться"), + "signUpFailed" : MessageLookupByLibrary.simpleMessage("Регистрация не удалась!"), + "skip" : MessageLookupByLibrary.simpleMessage("Пропустить"), + "slim" : MessageLookupByLibrary.simpleMessage("Похудение"), + "slim_type" : MessageLookupByLibrary.simpleMessage("Похудение"), + "slim_type_desc" : MessageLookupByLibrary.simpleMessage("План питания для похудения должен быть разработан с учётом индивидуальных особенностей организма, возраста, пола, уровня физической активности и состояния здоровья. Общие принципы: \n● Снижение калорийности; \n● Сбалансированный рацион; \n● Разнообразие продуктов; \n● Питьевой режим; \n● Ограничение вредных продуктов;"), + "smth_went_wrong_payment_failed" : MessageLookupByLibrary.simpleMessage("Что-то пошло не так, оплата не прошла"), + "some_error_occurred" : MessageLookupByLibrary.simpleMessage("Упс! Произошла ошибка"), + "some_error_occurred_description" : MessageLookupByLibrary.simpleMessage("Произошла ошибка. Мы уже работаем над ее устранением. Попробуйте позже."), + "something_went_wrong" : MessageLookupByLibrary.simpleMessage("Упс! Что-то пошло не так"), + "sorry_we_did_not_find_the_plan" : MessageLookupByLibrary.simpleMessage("Извините, план где-то потерялся, мы уже ищем его"), + "spam" : MessageLookupByLibrary.simpleMessage("Спам"), + "spam_description" : MessageLookupByLibrary.simpleMessage("Отправьте жалобу, если Вы заметили рекламу, размещенную в не предназначенном для этого месте."), + "sport_hobbies" : MessageLookupByLibrary.simpleMessage("Спортивные увлечения"), + "stage" : MessageLookupByLibrary.simpleMessage("этап"), + "stages" : MessageLookupByLibrary.simpleMessage("этапов"), + "standard" : MessageLookupByLibrary.simpleMessage("Стандарт"), + "startDateHasBeenSet" : MessageLookupByLibrary.simpleMessage("Выбрана дата старта"), + "startDiet" : MessageLookupByLibrary.simpleMessage("Начать диету"), + "statistic" : MessageLookupByLibrary.simpleMessage("Статистика"), + "step" : MessageLookupByLibrary.simpleMessage("Шаг"), + "step_by_step_photo_recipe" : MessageLookupByLibrary.simpleMessage("Пошаговый фоторецепт"), + "step_widget" : m3, + "successfully_published" : MessageLookupByLibrary.simpleMessage("успешно опубликован"), + "suggestDiet" : MessageLookupByLibrary.simpleMessage("Предложить диету"), + "suicide" : MessageLookupByLibrary.simpleMessage("Склонение к самоубийству"), + "takes_pills" : MessageLookupByLibrary.simpleMessage("Принимает лекарства"), + "tap_on_link_to_pay" : MessageLookupByLibrary.simpleMessage("Перейдите по ссылке для оплаты консультации"), + "tell_your_schedule" : MessageLookupByLibrary.simpleMessage("Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:"), + "text_was_copied" : MessageLookupByLibrary.simpleMessage("Text copied successfully"), + "there_is_a_video" : MessageLookupByLibrary.simpleMessage("Есть видео"), + "three_options" : MessageLookupByLibrary.simpleMessage("3 опции"), + "time" : MessageLookupByLibrary.simpleMessage("Время прохождения"), + "time_to_complete_plan" : MessageLookupByLibrary.simpleMessage("Время выполнения плана"), + "toOffer" : MessageLookupByLibrary.simpleMessage("Предложить"), + "to_draft" : MessageLookupByLibrary.simpleMessage("В черновик"), + "to_order" : MessageLookupByLibrary.simpleMessage("Заказать"), + "tommorowPlanWithUserWillStart" : m4, + "tomorrowYourPlanWillStart" : m5, + "try_again" : MessageLookupByLibrary.simpleMessage("Попробовать снова"), + "try_again_2" : MessageLookupByLibrary.simpleMessage("Попробуйте ещё раз"), + "typeAmoutOfReturn" : MessageLookupByLibrary.simpleMessage("Укажите сумму которую вы хотите вернуть"), + "typeDayComment" : MessageLookupByLibrary.simpleMessage("Как можно подробнее прокомментируйте дневник пользователя"), + "typeMealComment" : MessageLookupByLibrary.simpleMessage("Как можно подробнее прокомментируйте прием пищи"), + "typePortionComment" : MessageLookupByLibrary.simpleMessage("Прокомментируйте блюдо"), + "type_email" : MessageLookupByLibrary.simpleMessage("Введите email"), + "type_height" : MessageLookupByLibrary.simpleMessage("Введите рост"), + "type_here_your_complaint" : MessageLookupByLibrary.simpleMessage("Напишите здесь свою жалобу"), + "type_weight" : MessageLookupByLibrary.simpleMessage("Введите вес"), + "unfavorite_foods" : MessageLookupByLibrary.simpleMessage("Нелюбимые продукты"), + "up_pressure" : MessageLookupByLibrary.simpleMessage("Верхние показатели давления:"), + "upper" : MessageLookupByLibrary.simpleMessage("Верхнее"), + "userCanceldThePlanSubscription" : m6, + "userConfirmedPlanCompletion" : MessageLookupByLibrary.simpleMessage("Пользователь подтвердил прохождения плана. В ближайшее время Вы получите"), + "userConfirmedPlanCompletionWithoutSum" : MessageLookupByLibrary.simpleMessage("Пользователь подтвердил прохождения плана."), + "userPaidThePlan" : m7, + "userSubscribedToPlan" : m8, + "user_authorization" : MessageLookupByLibrary.simpleMessage("Аутентификация"), + "user_data" : MessageLookupByLibrary.simpleMessage("Данные пользователя"), + "user_data_desc" : MessageLookupByLibrary.simpleMessage("Эти данные нужны для корректной работы дневника питания и расчета вашей дневной нормы потребления КБЖУ"), + "user_info" : MessageLookupByLibrary.simpleMessage("Анкета пользователя"), + "user_registration" : MessageLookupByLibrary.simpleMessage("Регистрация пользователя"), + "username" : MessageLookupByLibrary.simpleMessage("Имя пользователя"), + "vegan" : MessageLookupByLibrary.simpleMessage("Веган."), + "vegan_type" : MessageLookupByLibrary.simpleMessage("Вегетарианская"), + "vegan_type_desc" : MessageLookupByLibrary.simpleMessage("Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья."), + "violenceAndHostility" : MessageLookupByLibrary.simpleMessage("Насилие и вражда"), + "violence_against_people_or_animal" : MessageLookupByLibrary.simpleMessage("Насилие над людьми или животными"), + "waist" : MessageLookupByLibrary.simpleMessage("Талия"), + "waist_circumference" : MessageLookupByLibrary.simpleMessage("Обхват талии"), + "wait_for_start_day" : MessageLookupByLibrary.simpleMessage("Ожидайте начала плана питания"), + "want_to_see_tomorrow" : MessageLookupByLibrary.simpleMessage("Хотите заглянуть в будущее?"), + "weAreLookingFor" : MessageLookupByLibrary.simpleMessage("Мы собираем самое большое сообщество людей, желающих вести здоровый образ жизни!"), + "weapon" : MessageLookupByLibrary.simpleMessage("Оружие"), + "weight" : MessageLookupByLibrary.simpleMessage("Вес"), + "weight_chart" : MessageLookupByLibrary.simpleMessage("График веса"), + "weight_error" : MessageLookupByLibrary.simpleMessage("Введите вес"), + "weight_measurements" : MessageLookupByLibrary.simpleMessage("Замер веса"), + "wellness" : MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), + "wellness_type" : MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), + "wellness_type_desc" : MessageLookupByLibrary.simpleMessage("Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы."), + "what_do_you_want_to_complaint_about" : MessageLookupByLibrary.simpleMessage("На что Вы хотите пожаловаться?"), + "what_is_your_name" : MessageLookupByLibrary.simpleMessage("Как вас зовут?"), + "wrong_credentials" : MessageLookupByLibrary.simpleMessage("Неверные данные пользователя"), + "youCanComplain" : MessageLookupByLibrary.simpleMessage("Если вас что-то не устроило, вы можете подать жалобу"), + "youCanceledSubscriptionToPlan" : m9, + "youShureYouWantToCancelOrder" : MessageLookupByLibrary.simpleMessage("Вы уверены, что хотите отменить заказ?"), + "youShureYouWantToDeleteAccount" : MessageLookupByLibrary.simpleMessage("Вы уверены, что хотите удалить аккаунт?"), + "youWithUs" : MessageLookupByLibrary.simpleMessage("Вы с итвио уже\n"), + "you_can_not_open_this_day" : MessageLookupByLibrary.simpleMessage("Вы не можете перейти в этот день"), + "you_can_not_start_plan_until_end_of_prev_one" : MessageLookupByLibrary.simpleMessage("Вы не можете начать план, пока не закончите прохождение предыдущего"), + "you_will_get" : MessageLookupByLibrary.simpleMessage("Вы получите"), + "your_blood_pressure" : MessageLookupByLibrary.simpleMessage("Ваше артериальное давление?"), + "your_favorite_sports" : MessageLookupByLibrary.simpleMessage("Ваши спортивные увлечения?"), + "your_gender" : MessageLookupByLibrary.simpleMessage("Ваш пол?"), + "your_height" : MessageLookupByLibrary.simpleMessage("Ваш рост:"), + "your_last_name" : MessageLookupByLibrary.simpleMessage("Ваша фамилия"), + "your_name" : MessageLookupByLibrary.simpleMessage("Ваше имя"), + "your_rating" : 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 index 097e1180..9d334dc3 100644 --- a/lib/generated/intl/messages_ru.dart +++ b/lib/generated/intl/messages_ru.dart @@ -7,8 +7,7 @@ // 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 +// ignore_for_file:unused_import, file_names import 'package:intl/intl.dart'; import 'package:intl/message_lookup_by_library.dart'; @@ -21,362 +20,223 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'ru'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { - "Moscow": MessageLookupByLibrary.simpleMessage("Москва"), - "Russia": MessageLookupByLibrary.simpleMessage("Россия"), - "about_diet": MessageLookupByLibrary.simpleMessage("Об этой диете"), - "about_plan": MessageLookupByLibrary.simpleMessage("Об этом плане"), - "active": MessageLookupByLibrary.simpleMessage("Активен"), - "active_diet_state": MessageLookupByLibrary.simpleMessage("Активная"), - "add": MessageLookupByLibrary.simpleMessage("Добавить"), - "add_cover": MessageLookupByLibrary.simpleMessage("Добавьте обложку"), - "add_measure": MessageLookupByLibrary.simpleMessage("Добавить замер"), - "adding_plan": MessageLookupByLibrary.simpleMessage("Добавление плана"), - "additional_information": MessageLookupByLibrary.simpleMessage( - "Дополнительная информация", - ), - "admin": MessageLookupByLibrary.simpleMessage("Админ"), - "all": MessageLookupByLibrary.simpleMessage("Все"), - "allergies_presence": 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("График ИМТ"), - "by_default": MessageLookupByLibrary.simpleMessage("По умолчанию"), - "calories": MessageLookupByLibrary.simpleMessage("Калории"), - "carb_type": MessageLookupByLibrary.simpleMessage("Мучное"), - "carb_type_desc": MessageLookupByLibrary.simpleMessage( - "Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы.", - ), - "carbohydrates": MessageLookupByLibrary.simpleMessage("Углеводы"), - "chat": MessageLookupByLibrary.simpleMessage("Чат"), - "chest": MessageLookupByLibrary.simpleMessage("Грудь"), - "chest_circumference": MessageLookupByLibrary.simpleMessage("Обхват груди"), - "choose_diet_duration": MessageLookupByLibrary.simpleMessage( - "Выберите срок диеты", - ), - "choose_plan_duration": MessageLookupByLibrary.simpleMessage( - "Выберите срок плана", - ), - "choose_start_diet_date": 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("Город проживания"), - "comfort": MessageLookupByLibrary.simpleMessage("Комфорт"), - "comment": MessageLookupByLibrary.simpleMessage("комментарий"), - "comments": MessageLookupByLibrary.simpleMessage("Комментарии"), - "comments_plural": MessageLookupByLibrary.simpleMessage("комментариев"), - "complain": MessageLookupByLibrary.simpleMessage("Пожаловаться"), - "continueButton": MessageLookupByLibrary.simpleMessage("Продолжить"), - "continue_": MessageLookupByLibrary.simpleMessage("Продолжить"), - "copied": MessageLookupByLibrary.simpleMessage("cкопирован"), - "copy_link": MessageLookupByLibrary.simpleMessage("Скопировать ссылку"), - "country": MessageLookupByLibrary.simpleMessage("Страна"), - "create_diet": MessageLookupByLibrary.simpleMessage("Создание диеты"), - "customer_price": MessageLookupByLibrary.simpleMessage( - "Цена для покупателя", - ), - "date_of_birth": MessageLookupByLibrary.simpleMessage("Дата рождения"), - "day": MessageLookupByLibrary.simpleMessage("День"), - "days": MessageLookupByLibrary.simpleMessage("дней"), - "deleted": MessageLookupByLibrary.simpleMessage("Удалена"), - "diary": MessageLookupByLibrary.simpleMessage("Дневник"), - "diet": MessageLookupByLibrary.simpleMessage("Диета"), - "diet_author": MessageLookupByLibrary.simpleMessage("Автор диеты"), - "diet_plan": MessageLookupByLibrary.simpleMessage("План диеты"), - "diet_state": MessageLookupByLibrary.simpleMessage("Статус диеты"), - "diet_type": 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("Черновик"), - "drafted": MessageLookupByLibrary.simpleMessage("Черновики"), - "eating_behavior": MessageLookupByLibrary.simpleMessage( - "Пищевое поведение", - ), - "eating_behavior_type": MessageLookupByLibrary.simpleMessage( - "Формирование пищевого поведения", - ), - "eating_behavior_type_desc": MessageLookupByLibrary.simpleMessage( - "Формирование здорового пищевого поведения — это процесс, который включает в себя изменение привычек и отношения к еде. Он направлен на то, чтобы помочь людям научиться правильно питаться и поддерживать здоровый образ жизни.Основные принципы формирования здорового пищевого поведения: \n● Разнообразие продуктов; \n● Сбалансированный рацион; \n● Питьевой режим; \n● Ограничение вредных продуктов; \n● Регулярные приёмы пищи; \n● Умеренность;Осознанное питание; \n● Физическая активность;", - ), - "economy": MessageLookupByLibrary.simpleMessage("Эконом"), - "edit": MessageLookupByLibrary.simpleMessage("Редактировать"), - "email": MessageLookupByLibrary.simpleMessage("Электронная почта"), - "email_empty": MessageLookupByLibrary.simpleMessage( - "Необходимо ввести адрес электронной почты", - ), - "email_invalid": MessageLookupByLibrary.simpleMessage( - "Некорректный адрес электронной почты", - ), - "enter_additional_information": MessageLookupByLibrary.simpleMessage( - "Введите любую дополнительную информацию на своё усмотрение:", - ), - "enter_diet_description": MessageLookupByLibrary.simpleMessage( - "Введите описание диеты", - ), - "enter_diet_name": MessageLookupByLibrary.simpleMessage( - "Выведите название диеты", - ), - "enter_information": MessageLookupByLibrary.simpleMessage( - "Введите информацию...", - ), - "exit": MessageLookupByLibrary.simpleMessage("Выйти"), - "expand": MessageLookupByLibrary.simpleMessage("Показать полностью"), - "fats": 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 символ", - ), - "fit_type": MessageLookupByLibrary.simpleMessage("Поддержание формы"), - "fit_type_desc": MessageLookupByLibrary.simpleMessage( - "План питания для поддержания формы сбалансированный и разнообразный, чтобы обеспечить организм всеми необходимыми питательными веществами. Общие принципы: \n● Дробное питание; \n● Разнообразие продуктов; \n● Контроль порций; \n● Питьевой режим; \n● Ограничение вредных продуктов;", - ), - "fitness": MessageLookupByLibrary.simpleMessage("Поддержка формы"), - "from": MessageLookupByLibrary.simpleMessage("от"), - "from_a_to_z": MessageLookupByLibrary.simpleMessage("Название: А-Я"), - "from_z_to_a": MessageLookupByLibrary.simpleMessage("Название: Я-А"), - "gallery": MessageLookupByLibrary.simpleMessage("Галерея"), - "gr": MessageLookupByLibrary.simpleMessage("гр"), - "grams": MessageLookupByLibrary.simpleMessage("гр"), - "height_measurements": MessageLookupByLibrary.simpleMessage("Замер роста"), - "hide": MessageLookupByLibrary.simpleMessage("Свернуть"), - "hip_circumference": MessageLookupByLibrary.simpleMessage("Обхват бедер"), - "hips": MessageLookupByLibrary.simpleMessage("Бедра"), - "in_progress": MessageLookupByLibrary.simpleMessage("В процессе"), - "inactive_diet_state": MessageLookupByLibrary.simpleMessage("Черновик"), - "infoAboutOrder": MessageLookupByLibrary.simpleMessage( - "Информация о заказе", - ), - "initial_measurements": MessageLookupByLibrary.simpleMessage( - "Первичные замеры", - ), - "label": 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"), - "light_type": MessageLookupByLibrary.simpleMessage("Легкая"), - "light_type_desc": MessageLookupByLibrary.simpleMessage( - "С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками.", - ), - "link_was_copied": MessageLookupByLibrary.simpleMessage( - "Ссылка успешно скопирована", - ), - "loading": MessageLookupByLibrary.simpleMessage("Загрузка..."), - "mail_was_copied": MessageLookupByLibrary.simpleMessage( - "Почта успешно скопирована", - ), - "male": MessageLookupByLibrary.simpleMessage("Мужской"), - "meal": MessageLookupByLibrary.simpleMessage("Приём пищи"), - "meat": MessageLookupByLibrary.simpleMessage("Мясо"), - "meat_type": MessageLookupByLibrary.simpleMessage("С мясом"), - "meat_type_desc": MessageLookupByLibrary.simpleMessage( - "Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму.", - ), - "milliliter": MessageLookupByLibrary.simpleMessage("мл"), - "minimal_customer_price": MessageLookupByLibrary.simpleMessage( - "Минимальная цена для покупателя: 1200₽", - ), - "most_new": MessageLookupByLibrary.simpleMessage("Самые новые"), - "most_old": MessageLookupByLibrary.simpleMessage("Самые старые"), - "msg_network_err": MessageLookupByLibrary.simpleMessage("Сетевая ошибка!"), - "msg_something_went_wrong": MessageLookupByLibrary.simpleMessage( - "Что то пошло не так!", - ), - "my_blog": MessageLookupByLibrary.simpleMessage("Мой блог"), - "my_diets": MessageLookupByLibrary.simpleMessage("Мои диеты"), - "my_plans": MessageLookupByLibrary.simpleMessage("Мои планы"), - "my_settings": MessageLookupByLibrary.simpleMessage("Мои настройки"), - "name_empty": MessageLookupByLibrary.simpleMessage( - "Имя пользователя обязательно для заполнения", - ), - "name_short": MessageLookupByLibrary.simpleMessage( - "В имени пользователя должно быть минимум 6 символов", - ), - "no": MessageLookupByLibrary.simpleMessage("Нет"), - "no_account": MessageLookupByLibrary.simpleMessage("У меня нет аккаунта"), - "notifications": MessageLookupByLibrary.simpleMessage("Уведомления"), - "one_option": MessageLookupByLibrary.simpleMessage("1 опция"), - "option": MessageLookupByLibrary.simpleMessage("Опция"), - "option_content": MessageLookupByLibrary.simpleMessage("Содержание опции"), - "option_content_hint_text": MessageLookupByLibrary.simpleMessage( - "На связи 7 дней в неделю", - ), - "option_desc": MessageLookupByLibrary.simpleMessage("Описание опции"), - "option_desc_hint_text": MessageLookupByLibrary.simpleMessage( - "Этот план питания для похудения на 7 дней сбалансированный и разнообразный", - ), - "option_duration": MessageLookupByLibrary.simpleMessage( - "Продолжительность опции", - ), - "option_personal_diet_desc": MessageLookupByLibrary.simpleMessage( - "Опция подразумевает создание индивидуальной диеты", - ), - "option_title": MessageLookupByLibrary.simpleMessage("Заголовок опции"), - "order": 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("шт"), - "personal": MessageLookupByLibrary.simpleMessage("Персональные"), - "personal_diet_state": MessageLookupByLibrary.simpleMessage("Персональная"), - "photo": MessageLookupByLibrary.simpleMessage("Фото"), - "place_of_living": MessageLookupByLibrary.simpleMessage("Место проживания"), - "plan_author": MessageLookupByLibrary.simpleMessage("Автор плана"), - "plan_desc": MessageLookupByLibrary.simpleMessage("Описание плана"), - "plan_desc_example": MessageLookupByLibrary.simpleMessage( - "Большое подробное, привлекательное описание плана", - ), - "plan_duration": MessageLookupByLibrary.simpleMessage("Срок плана"), - "plan_label_desc": MessageLookupByLibrary.simpleMessage( - "План для поддержания формы", - ), - "plans_complete": MessageLookupByLibrary.simpleMessage("Пройденные планы"), - "popular": MessageLookupByLibrary.simpleMessage("Популярные"), - "preferred_language": MessageLookupByLibrary.simpleMessage( - "Предпочитаемый язык общения", - ), - "pressure_empty": MessageLookupByLibrary.simpleMessage( - "Все показатели давления обязательны к заполнению", - ), - "pressure_is_not_a_number": MessageLookupByLibrary.simpleMessage( - "Все показатели давления должны быть числами", - ), - "preview": MessageLookupByLibrary.simpleMessage("Превью"), - "price": MessageLookupByLibrary.simpleMessage("Цена"), - "price_explanation": MessageLookupByLibrary.simpleMessage( - "Разница в ценах, это комиссия Итвио", - ), - "profile": MessageLookupByLibrary.simpleMessage("Профиль"), - "proteins": MessageLookupByLibrary.simpleMessage("Белки"), - "public_diet_state": MessageLookupByLibrary.simpleMessage("Публичная"), - "publish": MessageLookupByLibrary.simpleMessage("Опубликовать"), - "published": MessageLookupByLibrary.simpleMessage("Опубликованные"), - "removeFromActive": MessageLookupByLibrary.simpleMessage( - "Снять с публикации", - ), - "save": MessageLookupByLibrary.simpleMessage("Сохранить"), - "services": MessageLookupByLibrary.simpleMessage("Оказание услуг"), - "settings": MessageLookupByLibrary.simpleMessage("Настройки"), - "share": MessageLookupByLibrary.simpleMessage("Поделиться"), - "skip": MessageLookupByLibrary.simpleMessage("Пропустить"), - "slim": MessageLookupByLibrary.simpleMessage("Похудение"), - "slim_type": MessageLookupByLibrary.simpleMessage("Похудение"), - "slim_type_desc": MessageLookupByLibrary.simpleMessage( - "План питания для похудения должен быть разработан с учётом индивидуальных особенностей организма, возраста, пола, уровня физической активности и состояния здоровья. Общие принципы: \n● Снижение калорийности; \n● Сбалансированный рацион; \n● Разнообразие продуктов; \n● Питьевой режим; \n● Ограничение вредных продуктов;", - ), - "standard": MessageLookupByLibrary.simpleMessage("Стандарт"), - "startDiet": MessageLookupByLibrary.simpleMessage("Начать диету"), - "tell_your_schedule": MessageLookupByLibrary.simpleMessage( - "Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:", - ), - "text_was_copied": MessageLookupByLibrary.simpleMessage( - "Текст успешно скопирован", - ), - "three_options": MessageLookupByLibrary.simpleMessage("3 опции"), - "toOffer": MessageLookupByLibrary.simpleMessage("Предложить"), - "to_draft": MessageLookupByLibrary.simpleMessage("В черновик"), - "unfavorite_foods": MessageLookupByLibrary.simpleMessage( - "Нелюбимые продукты", - ), - "up_pressure": MessageLookupByLibrary.simpleMessage( - "Верхние показатели давления:", - ), - "user_authorization": MessageLookupByLibrary.simpleMessage( - "Аутентификация", - ), - "user_data": MessageLookupByLibrary.simpleMessage("Данные пользователя"), - "user_registration": MessageLookupByLibrary.simpleMessage( - "Регистрация пользователя", - ), - "username": MessageLookupByLibrary.simpleMessage("Имя пользователя"), - "vegan": MessageLookupByLibrary.simpleMessage("Веган."), - "vegan_type": MessageLookupByLibrary.simpleMessage("Вегетарианская"), - "vegan_type_desc": MessageLookupByLibrary.simpleMessage( - "Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья.", - ), - "waist": MessageLookupByLibrary.simpleMessage("Талия"), - "waist_circumference": MessageLookupByLibrary.simpleMessage("Обхват талии"), - "weight": MessageLookupByLibrary.simpleMessage("Вес"), - "weight_chart": MessageLookupByLibrary.simpleMessage("График веса"), - "weight_measurements": MessageLookupByLibrary.simpleMessage("Замер веса"), - "wellness": MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), - "wellness_type": MessageLookupByLibrary.simpleMessage( - "Улучшение самочувствия", - ), - "wellness_type_desc": MessageLookupByLibrary.simpleMessage( - "Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы.", - ), - "what_is_your_name": MessageLookupByLibrary.simpleMessage("Как вас зовут?"), - "wrong_credentials": MessageLookupByLibrary.simpleMessage( - "Неверные данные пользователя", - ), - "you_will_get": 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("Ваш вес:"), + static _notInlinedMessages(_) => { + "Moscow" : MessageLookupByLibrary.simpleMessage("Москва"), + "Russia" : MessageLookupByLibrary.simpleMessage("Россия"), + "about_diet" : MessageLookupByLibrary.simpleMessage("Об этой диете"), + "about_plan" : MessageLookupByLibrary.simpleMessage("Об этом плане"), + "active" : MessageLookupByLibrary.simpleMessage("Активен"), + "active_diet_state" : MessageLookupByLibrary.simpleMessage("Активная"), + "add" : MessageLookupByLibrary.simpleMessage("Добавить"), + "add_cover" : MessageLookupByLibrary.simpleMessage("Добавьте обложку"), + "add_measure" : MessageLookupByLibrary.simpleMessage("Добавить замер"), + "adding_plan" : MessageLookupByLibrary.simpleMessage("Добавление плана"), + "additional_information" : MessageLookupByLibrary.simpleMessage("Дополнительная информация"), + "admin" : MessageLookupByLibrary.simpleMessage("Админ"), + "all" : MessageLookupByLibrary.simpleMessage("Все"), + "allergies_presence" : 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("График ИМТ"), + "by_default" : MessageLookupByLibrary.simpleMessage("По умолчанию"), + "calories" : MessageLookupByLibrary.simpleMessage("Калории"), + "carb_type" : MessageLookupByLibrary.simpleMessage("Мучное"), + "carb_type_desc" : MessageLookupByLibrary.simpleMessage("Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы."), + "carbohydrates" : MessageLookupByLibrary.simpleMessage("Углеводы"), + "chat" : MessageLookupByLibrary.simpleMessage("Чат"), + "chest" : MessageLookupByLibrary.simpleMessage("Грудь"), + "chest_circumference" : MessageLookupByLibrary.simpleMessage("Обхват груди"), + "choose_diet_duration" : MessageLookupByLibrary.simpleMessage("Выберите срок диеты"), + "choose_plan_duration" : MessageLookupByLibrary.simpleMessage("Выберите срок плана"), + "choose_start_diet_date" : 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("Город проживания"), + "comfort" : MessageLookupByLibrary.simpleMessage("Комфорт"), + "comment" : MessageLookupByLibrary.simpleMessage("комментарий"), + "comment_hint" : MessageLookupByLibrary.simpleMessage("Комментарий"), + "comments" : MessageLookupByLibrary.simpleMessage("Комментарии"), + "comments_plural" : MessageLookupByLibrary.simpleMessage("комментариев"), + "complain" : MessageLookupByLibrary.simpleMessage("Пожаловаться"), + "continueButton" : MessageLookupByLibrary.simpleMessage("Продолжить"), + "continue_" : MessageLookupByLibrary.simpleMessage("Продолжить"), + "copied" : MessageLookupByLibrary.simpleMessage("cкопирован"), + "copy_link" : MessageLookupByLibrary.simpleMessage("Скопировать ссылку"), + "country" : MessageLookupByLibrary.simpleMessage("Страна"), + "create_diet" : MessageLookupByLibrary.simpleMessage("Создание диеты"), + "customer_price" : MessageLookupByLibrary.simpleMessage("Цена для покупателя"), + "date_of_birth" : MessageLookupByLibrary.simpleMessage("Дата рождения"), + "day" : MessageLookupByLibrary.simpleMessage("День"), + "days" : MessageLookupByLibrary.simpleMessage("дней"), + "deleted" : MessageLookupByLibrary.simpleMessage("Удалена"), + "diary" : MessageLookupByLibrary.simpleMessage("Дневник"), + "diet" : MessageLookupByLibrary.simpleMessage("Диета"), + "diet_author" : MessageLookupByLibrary.simpleMessage("Автор диеты"), + "diet_plan" : MessageLookupByLibrary.simpleMessage("План диеты"), + "diet_state" : MessageLookupByLibrary.simpleMessage("Статус диеты"), + "diet_type" : 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("Черновик"), + "drafted" : MessageLookupByLibrary.simpleMessage("Черновики"), + "eating_behavior" : MessageLookupByLibrary.simpleMessage("Пищевое поведение"), + "eating_behavior_type" : MessageLookupByLibrary.simpleMessage("Формирование пищевого поведения"), + "eating_behavior_type_desc" : MessageLookupByLibrary.simpleMessage("Формирование здорового пищевого поведения — это процесс, который включает в себя изменение привычек и отношения к еде. Он направлен на то, чтобы помочь людям научиться правильно питаться и поддерживать здоровый образ жизни.Основные принципы формирования здорового пищевого поведения: \n● Разнообразие продуктов; \n● Сбалансированный рацион; \n● Питьевой режим; \n● Ограничение вредных продуктов; \n● Регулярные приёмы пищи; \n● Умеренность;Осознанное питание; \n● Физическая активность;"), + "economy" : MessageLookupByLibrary.simpleMessage("Эконом"), + "edit" : MessageLookupByLibrary.simpleMessage("Редактировать"), + "email" : MessageLookupByLibrary.simpleMessage("Электронная почта"), + "email_empty" : MessageLookupByLibrary.simpleMessage("Необходимо ввести адрес электронной почты"), + "email_invalid" : MessageLookupByLibrary.simpleMessage("Некорректный адрес электронной почты"), + "enter_additional_information" : MessageLookupByLibrary.simpleMessage("Введите любую дополнительную информацию на своё усмотрение:"), + "enter_diet_description" : MessageLookupByLibrary.simpleMessage("Введите описание диеты"), + "enter_diet_name" : MessageLookupByLibrary.simpleMessage("Выведите название диеты"), + "enter_information" : MessageLookupByLibrary.simpleMessage("Введите информацию..."), + "exit" : MessageLookupByLibrary.simpleMessage("Выйти"), + "expand" : MessageLookupByLibrary.simpleMessage("Показать полностью"), + "fats" : 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 символ"), + "fit_type" : MessageLookupByLibrary.simpleMessage("Поддержание формы"), + "fit_type_desc" : MessageLookupByLibrary.simpleMessage("План питания для поддержания формы сбалансированный и разнообразный, чтобы обеспечить организм всеми необходимыми питательными веществами. Общие принципы: \n● Дробное питание; \n● Разнообразие продуктов; \n● Контроль порций; \n● Питьевой режим; \n● Ограничение вредных продуктов;"), + "fitness" : MessageLookupByLibrary.simpleMessage("Поддержка формы"), + "from" : MessageLookupByLibrary.simpleMessage("от"), + "from_a_to_z" : MessageLookupByLibrary.simpleMessage("Название: А-Я"), + "from_z_to_a" : MessageLookupByLibrary.simpleMessage("Название: Я-А"), + "gallery" : MessageLookupByLibrary.simpleMessage("Галерея"), + "gr" : MessageLookupByLibrary.simpleMessage("гр"), + "grams" : MessageLookupByLibrary.simpleMessage("гр"), + "height_measurements" : MessageLookupByLibrary.simpleMessage("Замер роста"), + "hide" : MessageLookupByLibrary.simpleMessage("Свернуть"), + "hip_circumference" : MessageLookupByLibrary.simpleMessage("Обхват бедер"), + "hips" : MessageLookupByLibrary.simpleMessage("Бедра"), + "in_progress" : MessageLookupByLibrary.simpleMessage("В процессе"), + "inactive_diet_state" : MessageLookupByLibrary.simpleMessage("Черновик"), + "infoAboutOrder" : MessageLookupByLibrary.simpleMessage("Информация о заказе"), + "initial_measurements" : MessageLookupByLibrary.simpleMessage("Первичные замеры"), + "label" : 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"), + "light_type" : MessageLookupByLibrary.simpleMessage("Легкая"), + "light_type_desc" : MessageLookupByLibrary.simpleMessage("С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками."), + "link_was_copied" : MessageLookupByLibrary.simpleMessage("Ссылка успешно скопирована"), + "loading" : MessageLookupByLibrary.simpleMessage("Загрузка..."), + "mail_was_copied" : MessageLookupByLibrary.simpleMessage("Почта успешно скопирована"), + "male" : MessageLookupByLibrary.simpleMessage("Мужской"), + "meal" : MessageLookupByLibrary.simpleMessage("Приём пищи"), + "meat" : MessageLookupByLibrary.simpleMessage("Мясо"), + "meat_type" : MessageLookupByLibrary.simpleMessage("С мясом"), + "meat_type_desc" : MessageLookupByLibrary.simpleMessage("Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму."), + "milliliter" : MessageLookupByLibrary.simpleMessage("мл"), + "minimal_customer_price" : MessageLookupByLibrary.simpleMessage("Минимальная цена для покупателя: 1200₽"), + "most_new" : MessageLookupByLibrary.simpleMessage("Самые новые"), + "most_old" : MessageLookupByLibrary.simpleMessage("Самые старые"), + "msg_network_err" : MessageLookupByLibrary.simpleMessage("Сетевая ошибка!"), + "msg_something_went_wrong" : MessageLookupByLibrary.simpleMessage("Что то пошло не так!"), + "my_blog" : MessageLookupByLibrary.simpleMessage("Мой блог"), + "my_diets" : MessageLookupByLibrary.simpleMessage("Мои диеты"), + "my_plans" : MessageLookupByLibrary.simpleMessage("Мои планы"), + "my_settings" : MessageLookupByLibrary.simpleMessage("Мои настройки"), + "name_empty" : MessageLookupByLibrary.simpleMessage("Имя пользователя обязательно для заполнения"), + "name_short" : MessageLookupByLibrary.simpleMessage("В имени пользователя должно быть минимум 6 символов"), + "no" : MessageLookupByLibrary.simpleMessage("Нет"), + "no_account" : MessageLookupByLibrary.simpleMessage("У меня нет аккаунта"), + "notifications" : MessageLookupByLibrary.simpleMessage("Уведомления"), + "one_option" : MessageLookupByLibrary.simpleMessage("1 опция"), + "option" : MessageLookupByLibrary.simpleMessage("Опция"), + "option_content" : MessageLookupByLibrary.simpleMessage("Содержание опции"), + "option_content_hint_text" : MessageLookupByLibrary.simpleMessage("На связи 7 дней в неделю"), + "option_desc" : MessageLookupByLibrary.simpleMessage("Описание опции"), + "option_desc_hint_text" : MessageLookupByLibrary.simpleMessage("Этот план питания для похудения на 7 дней сбалансированный и разнообразный"), + "option_duration" : MessageLookupByLibrary.simpleMessage("Продолжительность опции"), + "option_personal_diet_desc" : MessageLookupByLibrary.simpleMessage("Опция подразумевает создание индивидуальной диеты"), + "option_title" : MessageLookupByLibrary.simpleMessage("Заголовок опции"), + "order" : 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("шт"), + "personal" : MessageLookupByLibrary.simpleMessage("Персональные"), + "personal_diet_state" : MessageLookupByLibrary.simpleMessage("Персональная"), + "photo" : MessageLookupByLibrary.simpleMessage("Фото"), + "place_of_living" : MessageLookupByLibrary.simpleMessage("Место проживания"), + "plan_author" : MessageLookupByLibrary.simpleMessage("Автор плана"), + "plan_desc" : MessageLookupByLibrary.simpleMessage("Описание плана"), + "plan_desc_example" : MessageLookupByLibrary.simpleMessage("Большое подробное, привлекательное описание плана"), + "plan_duration" : MessageLookupByLibrary.simpleMessage("Срок плана"), + "plan_label_desc" : MessageLookupByLibrary.simpleMessage("План для поддержания формы"), + "plans_complete" : MessageLookupByLibrary.simpleMessage("Пройденные планы"), + "popular" : MessageLookupByLibrary.simpleMessage("Популярные"), + "preferred_language" : MessageLookupByLibrary.simpleMessage("Предпочитаемый язык общения"), + "pressure_empty" : MessageLookupByLibrary.simpleMessage("Все показатели давления обязательны к заполнению"), + "pressure_is_not_a_number" : MessageLookupByLibrary.simpleMessage("Все показатели давления должны быть числами"), + "preview" : MessageLookupByLibrary.simpleMessage("Превью"), + "price" : MessageLookupByLibrary.simpleMessage("Цена"), + "price_explanation" : MessageLookupByLibrary.simpleMessage("Разница в ценах, это комиссия Итвио"), + "profile" : MessageLookupByLibrary.simpleMessage("Профиль"), + "proteins" : MessageLookupByLibrary.simpleMessage("Белки"), + "public_diet_state" : MessageLookupByLibrary.simpleMessage("Публичная"), + "publish" : MessageLookupByLibrary.simpleMessage("Опубликовать"), + "published" : MessageLookupByLibrary.simpleMessage("Опубликованные"), + "removeFromActive" : MessageLookupByLibrary.simpleMessage("Снять с публикации"), + "save" : MessageLookupByLibrary.simpleMessage("Сохранить"), + "services" : MessageLookupByLibrary.simpleMessage("Оказание услуг"), + "settings" : MessageLookupByLibrary.simpleMessage("Настройки"), + "share" : MessageLookupByLibrary.simpleMessage("Поделиться"), + "skip" : MessageLookupByLibrary.simpleMessage("Пропустить"), + "slim" : MessageLookupByLibrary.simpleMessage("Похудение"), + "slim_type" : MessageLookupByLibrary.simpleMessage("Похудение"), + "slim_type_desc" : MessageLookupByLibrary.simpleMessage("План питания для похудения должен быть разработан с учётом индивидуальных особенностей организма, возраста, пола, уровня физической активности и состояния здоровья. Общие принципы: \n● Снижение калорийности; \n● Сбалансированный рацион; \n● Разнообразие продуктов; \n● Питьевой режим; \n● Ограничение вредных продуктов;"), + "standard" : MessageLookupByLibrary.simpleMessage("Стандарт"), + "startDiet" : MessageLookupByLibrary.simpleMessage("Начать диету"), + "tell_your_schedule" : MessageLookupByLibrary.simpleMessage("Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:"), + "text_was_copied" : MessageLookupByLibrary.simpleMessage("Текст успешно скопирован"), + "three_options" : MessageLookupByLibrary.simpleMessage("3 опции"), + "toOffer" : MessageLookupByLibrary.simpleMessage("Предложить"), + "to_draft" : MessageLookupByLibrary.simpleMessage("В черновик"), + "unfavorite_foods" : MessageLookupByLibrary.simpleMessage("Нелюбимые продукты"), + "up_pressure" : MessageLookupByLibrary.simpleMessage("Верхние показатели давления:"), + "user_authorization" : MessageLookupByLibrary.simpleMessage("Аутентификация"), + "user_data" : MessageLookupByLibrary.simpleMessage("Данные пользователя"), + "user_registration" : MessageLookupByLibrary.simpleMessage("Регистрация пользователя"), + "username" : MessageLookupByLibrary.simpleMessage("Имя пользователя"), + "vegan" : MessageLookupByLibrary.simpleMessage("Веган."), + "vegan_type" : MessageLookupByLibrary.simpleMessage("Вегетарианская"), + "vegan_type_desc" : MessageLookupByLibrary.simpleMessage("Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья."), + "waist" : MessageLookupByLibrary.simpleMessage("Талия"), + "waist_circumference" : MessageLookupByLibrary.simpleMessage("Обхват талии"), + "weight" : MessageLookupByLibrary.simpleMessage("Вес"), + "weight_chart" : MessageLookupByLibrary.simpleMessage("График веса"), + "weight_measurements" : MessageLookupByLibrary.simpleMessage("Замер веса"), + "wellness" : MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), + "wellness_type" : MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), + "wellness_type_desc" : MessageLookupByLibrary.simpleMessage("Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы."), + "what_is_your_name" : MessageLookupByLibrary.simpleMessage("Как вас зовут?"), + "wrong_credentials" : MessageLookupByLibrary.simpleMessage("Неверные данные пользователя"), + "you_will_get" : 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 85a0adf7..ce3062c9 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -10,7 +10,7 @@ import 'intl/messages_all.dart'; // ignore_for_file: non_constant_identifier_names, lines_longer_than_80_chars // ignore_for_file: join_return_with_assignment, prefer_final_in_for_each -// ignore_for_file: avoid_redundant_argument_values, avoid_escaping_inner_quotes +// ignore_for_file: avoid_redundant_argument_values class S { S(); @@ -18,35 +18,28 @@ class S { static S? _current; static S get current { - assert( - _current != null, - 'No instance of S was loaded. Try to initialize the S delegate before accessing S.current.', - ); + assert(_current != null, 'No instance of S was loaded. Try to initialize the S delegate before accessing S.current.'); return _current!; } - static const AppLocalizationDelegate delegate = AppLocalizationDelegate(); + static const AppLocalizationDelegate delegate = + AppLocalizationDelegate(); static Future load(Locale locale) { - final name = (locale.countryCode?.isEmpty ?? false) - ? locale.languageCode - : locale.toString(); - final localeName = Intl.canonicalizedLocale(name); + final name = (locale.countryCode?.isEmpty ?? false) ? locale.languageCode : locale.toString(); + final localeName = Intl.canonicalizedLocale(name); return initializeMessages(localeName).then((_) { Intl.defaultLocale = localeName; final instance = S(); S._current = instance; - + return instance; }); - } + } static S of(BuildContext context) { final instance = S.maybeOf(context); - assert( - instance != null, - 'No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates?', - ); + assert(instance != null, 'No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates?'); return instance!; } @@ -66,7 +59,12 @@ class S { /// `Электронная почта` String get email { - return Intl.message('Электронная почта', name: 'email', desc: '', args: []); + return Intl.message( + 'Электронная почта', + name: 'email', + desc: '', + args: [], + ); } /// `Имя пользователя` @@ -81,7 +79,12 @@ class S { /// `Пароль` String get password { - return Intl.message('Пароль', name: 'password', desc: '', args: []); + return Intl.message( + 'Пароль', + name: 'password', + desc: '', + args: [], + ); } /// `Подтвердите пароль` @@ -106,12 +109,22 @@ class S { /// `Имя` String get first_name { - return Intl.message('Имя', name: 'first_name', desc: '', args: []); + return Intl.message( + 'Имя', + name: 'first_name', + desc: '', + args: [], + ); } /// `Фамилия` String get last_name { - return Intl.message('Фамилия', name: 'last_name', desc: '', args: []); + return Intl.message( + 'Фамилия', + name: 'last_name', + desc: '', + args: [], + ); } /// `Как вас зовут?` @@ -136,22 +149,42 @@ class S { /// `Страна` String get country { - return Intl.message('Страна', name: 'country', desc: '', args: []); + return Intl.message( + 'Страна', + name: 'country', + desc: '', + args: [], + ); } /// `Россия` String get Russia { - return Intl.message('Россия', name: 'Russia', desc: '', args: []); + return Intl.message( + 'Россия', + name: 'Russia', + desc: '', + args: [], + ); } /// `Город` String get city { - return Intl.message('Город', name: 'city', desc: '', args: []); + return Intl.message( + 'Город', + name: 'city', + desc: '', + args: [], + ); } /// `Москва` String get Moscow { - return Intl.message('Москва', name: 'Moscow', desc: '', args: []); + return Intl.message( + 'Москва', + name: 'Moscow', + desc: '', + args: [], + ); } /// `Место проживания` @@ -206,12 +239,22 @@ class S { /// `Мужской` String get male { - return Intl.message('Мужской', name: 'male', desc: '', args: []); + return Intl.message( + 'Мужской', + name: 'male', + desc: '', + args: [], + ); } /// `Женский` String get female { - return Intl.message('Женский', name: 'female', desc: '', args: []); + return Intl.message( + 'Женский', + name: 'female', + desc: '', + args: [], + ); } /// `Замер веса` @@ -226,7 +269,12 @@ class S { /// `Ваш вес:` String get your_weight { - return Intl.message('Ваш вес:', name: 'your_weight', desc: '', args: []); + return Intl.message( + 'Ваш вес:', + name: 'your_weight', + desc: '', + args: [], + ); } /// `Замер роста` @@ -241,7 +289,12 @@ class S { /// `Ваш рост:` String get your_height { - return Intl.message('Ваш рост:', name: 'your_height', desc: '', args: []); + return Intl.message( + 'Ваш рост:', + name: 'your_height', + desc: '', + args: [], + ); } /// `Наличие аллергии` @@ -266,12 +319,22 @@ class S { /// `Ваш пол?` String get your_gender { - return Intl.message('Ваш пол?', name: 'your_gender', desc: '', args: []); + return Intl.message( + 'Ваш пол?', + name: 'your_gender', + desc: '', + args: [], + ); } /// `Нет` String get no { - return Intl.message('Нет', name: 'no', desc: '', args: []); + return Intl.message( + 'Нет', + name: 'no', + desc: '', + args: [], + ); } /// `Есть ли у вас гипертония?` @@ -416,12 +479,22 @@ class S { /// `English` String get lbl_english { - return Intl.message('English', name: 'lbl_english', desc: '', args: []); + return Intl.message( + 'English', + name: 'lbl_english', + desc: '', + args: [], + ); } /// `Завершить` String get finish { - return Intl.message('Завершить', name: 'finish', desc: '', args: []); + return Intl.message( + 'Завершить', + name: 'finish', + desc: '', + args: [], + ); } /// `Предпочитаемый язык общения` @@ -446,7 +519,12 @@ class S { /// `Пропустить` String get skip { - return Intl.message('Пропустить', name: 'skip', desc: '', args: []); + return Intl.message( + 'Пропустить', + name: 'skip', + desc: '', + args: [], + ); } /// `Заполните информацию:` @@ -651,7 +729,12 @@ class S { /// `Войти` String get authentificate { - return Intl.message('Войти', name: 'authentificate', desc: '', args: []); + return Intl.message( + 'Войти', + name: 'authentificate', + desc: '', + args: [], + ); } /// `Аутентификация` @@ -666,7 +749,12 @@ class S { /// `Загрузка...` String get loading { - return Intl.message('Загрузка...', name: 'loading', desc: '', args: []); + return Intl.message( + 'Загрузка...', + name: 'loading', + desc: '', + args: [], + ); } /// `График веса` @@ -711,52 +799,102 @@ class S { /// `Грудь` String get chest { - return Intl.message('Грудь', name: 'chest', desc: '', args: []); + return Intl.message( + 'Грудь', + name: 'chest', + desc: '', + args: [], + ); } /// `Талия` String get waist { - return Intl.message('Талия', name: 'waist', desc: '', args: []); + return Intl.message( + 'Талия', + name: 'waist', + desc: '', + args: [], + ); } /// `Бедра` String get hips { - return Intl.message('Бедра', name: 'hips', desc: '', args: []); + return Intl.message( + 'Бедра', + name: 'hips', + desc: '', + args: [], + ); } /// `Выйти` String get exit { - return Intl.message('Выйти', name: 'exit', desc: '', args: []); + return Intl.message( + 'Выйти', + name: 'exit', + desc: '', + args: [], + ); } /// `Активен` String get active { - return Intl.message('Активен', name: 'active', desc: '', args: []); + return Intl.message( + 'Активен', + name: 'active', + desc: '', + args: [], + ); } /// `В архиве` String get archived { - return Intl.message('В архиве', name: 'archived', desc: '', args: []); + return Intl.message( + 'В архиве', + name: 'archived', + desc: '', + args: [], + ); } /// `Черновик` String get draft { - return Intl.message('Черновик', name: 'draft', desc: '', args: []); + return Intl.message( + 'Черновик', + name: 'draft', + desc: '', + args: [], + ); } /// `Мой блог` String get my_blog { - return Intl.message('Мой блог', name: 'my_blog', desc: '', args: []); + return Intl.message( + 'Мой блог', + name: 'my_blog', + desc: '', + args: [], + ); } /// `Язык` String get language { - return Intl.message('Язык', name: 'language', desc: '', args: []); + return Intl.message( + 'Язык', + name: 'language', + desc: '', + args: [], + ); } /// `В процессе` String get in_progress { - return Intl.message('В процессе', name: 'in_progress', desc: '', args: []); + return Intl.message( + 'В процессе', + name: 'in_progress', + desc: '', + args: [], + ); } /// `Добавить замер` @@ -771,7 +909,12 @@ class S { /// `Вес` String get weight { - return Intl.message('Вес', name: 'weight', desc: '', args: []); + return Intl.message( + 'Вес', + name: 'weight', + desc: '', + args: [], + ); } /// `Пройденные планы` @@ -796,67 +939,132 @@ class S { /// `Настройки` String get settings { - return Intl.message('Настройки', name: 'settings', desc: '', args: []); + return Intl.message( + 'Настройки', + name: 'settings', + desc: '', + args: [], + ); } /// `Профиль` String get profile { - return Intl.message('Профиль', name: 'profile', desc: '', args: []); + return Intl.message( + 'Профиль', + name: 'profile', + desc: '', + args: [], + ); } /// `Чат` String get chat { - return Intl.message('Чат', name: 'chat', desc: '', args: []); + return Intl.message( + 'Чат', + name: 'chat', + desc: '', + args: [], + ); } /// `Админ` String get admin { - return Intl.message('Админ', name: 'admin', desc: '', args: []); + return Intl.message( + 'Админ', + name: 'admin', + desc: '', + args: [], + ); } /// `Дневник` String get diary { - return Intl.message('Дневник', name: 'diary', desc: '', args: []); + return Intl.message( + 'Дневник', + name: 'diary', + desc: '', + args: [], + ); } /// `Сохранить` String get save { - return Intl.message('Сохранить', name: 'save', desc: '', args: []); + return Intl.message( + 'Сохранить', + name: 'save', + desc: '', + args: [], + ); } /// `шт` String get pcs { - return Intl.message('шт', name: 'pcs', desc: '', args: []); + return Intl.message( + 'шт', + name: 'pcs', + desc: '', + args: [], + ); } /// `гр` String get gr { - return Intl.message('гр', name: 'gr', desc: '', args: []); + return Intl.message( + 'гр', + name: 'gr', + desc: '', + args: [], + ); } /// `мл` String get milliliter { - return Intl.message('мл', name: 'milliliter', desc: '', args: []); + return Intl.message( + 'мл', + name: 'milliliter', + desc: '', + args: [], + ); } /// `гр` String get grams { - return Intl.message('гр', name: 'grams', desc: '', args: []); + return Intl.message( + 'гр', + name: 'grams', + desc: '', + args: [], + ); } /// `Начать диету` String get startDiet { - return Intl.message('Начать диету', name: 'startDiet', desc: '', args: []); + return Intl.message( + 'Начать диету', + name: 'startDiet', + desc: '', + args: [], + ); } /// `Комментарии` String get comments { - return Intl.message('Комментарии', name: 'comments', desc: '', args: []); + return Intl.message( + 'Комментарии', + name: 'comments', + desc: '', + args: [], + ); } /// `комментарий` String get comment { - return Intl.message('комментарий', name: 'comment', desc: '', args: []); + return Intl.message( + 'комментарий', + name: 'comment', + desc: '', + args: [], + ); } /// `комментария` @@ -881,17 +1089,32 @@ class S { /// `дней` String get days { - return Intl.message('дней', name: 'days', desc: '', args: []); + return Intl.message( + 'дней', + name: 'days', + desc: '', + args: [], + ); } /// `День` String get day { - return Intl.message('День', name: 'day', desc: '', args: []); + return Intl.message( + 'День', + name: 'day', + desc: '', + args: [], + ); } /// `дня` String get another_form_of_day { - return Intl.message('дня', name: 'another_form_of_day', desc: '', args: []); + return Intl.message( + 'дня', + name: 'another_form_of_day', + desc: '', + args: [], + ); } /// `комментариев` @@ -906,17 +1129,32 @@ class S { /// `Приём пищи` String get meal { - return Intl.message('Приём пищи', name: 'meal', desc: '', args: []); + return Intl.message( + 'Приём пищи', + name: 'meal', + desc: '', + args: [], + ); } /// `Автор диеты` String get diet_author { - return Intl.message('Автор диеты', name: 'diet_author', desc: '', args: []); + return Intl.message( + 'Автор диеты', + name: 'diet_author', + desc: '', + args: [], + ); } /// `Свернуть` String get hide { - return Intl.message('Свернуть', name: 'hide', desc: '', args: []); + return Intl.message( + 'Свернуть', + name: 'hide', + desc: '', + args: [], + ); } /// `Показать полностью` @@ -941,12 +1179,22 @@ class S { /// `Поделиться` String get share { - return Intl.message('Поделиться', name: 'share', desc: '', args: []); + return Intl.message( + 'Поделиться', + name: 'share', + desc: '', + args: [], + ); } /// `Пожаловаться` String get complain { - return Intl.message('Пожаловаться', name: 'complain', desc: '', args: []); + return Intl.message( + 'Пожаловаться', + name: 'complain', + desc: '', + args: [], + ); } /// `Вегетарианская` @@ -961,17 +1209,32 @@ class S { /// `Легкая` String get light_type { - return Intl.message('Легкая', name: 'light_type', desc: '', args: []); + return Intl.message( + 'Легкая', + name: 'light_type', + desc: '', + args: [], + ); } /// `С мясом` String get meat_type { - return Intl.message('С мясом', name: 'meat_type', desc: '', args: []); + return Intl.message( + 'С мясом', + name: 'meat_type', + desc: '', + args: [], + ); } /// `Мучное` String get carb_type { - return Intl.message('Мучное', name: 'carb_type', desc: '', args: []); + return Intl.message( + 'Мучное', + name: 'carb_type', + desc: '', + args: [], + ); } /// `Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья.` @@ -1016,32 +1279,62 @@ class S { /// `План диеты` String get diet_plan { - return Intl.message('План диеты', name: 'diet_plan', desc: '', args: []); + return Intl.message( + 'План диеты', + name: 'diet_plan', + desc: '', + args: [], + ); } /// `Калории` String get calories { - return Intl.message('Калории', name: 'calories', desc: '', args: []); + return Intl.message( + 'Калории', + name: 'calories', + desc: '', + args: [], + ); } /// `Белки` String get proteins { - return Intl.message('Белки', name: 'proteins', desc: '', args: []); + return Intl.message( + 'Белки', + name: 'proteins', + desc: '', + args: [], + ); } /// `Жиры` String get fats { - return Intl.message('Жиры', name: 'fats', desc: '', args: []); + return Intl.message( + 'Жиры', + name: 'fats', + desc: '', + args: [], + ); } /// `Углеводы` String get carbohydrates { - return Intl.message('Углеводы', name: 'carbohydrates', desc: '', args: []); + return Intl.message( + 'Углеводы', + name: 'carbohydrates', + desc: '', + args: [], + ); } /// `Ответить` String get answer { - return Intl.message('Ответить', name: 'answer', desc: '', args: []); + return Intl.message( + 'Ответить', + name: 'answer', + desc: '', + args: [], + ); } /// `Ссылка успешно скопирована` @@ -1086,47 +1379,92 @@ class S { /// `Продолжить` String get continue_ { - return Intl.message('Продолжить', name: 'continue_', desc: '', args: []); + return Intl.message( + 'Продолжить', + name: 'continue_', + desc: '', + args: [], + ); } /// `Порядок` String get order { - return Intl.message('Порядок', name: 'order', desc: '', args: []); + return Intl.message( + 'Порядок', + name: 'order', + desc: '', + args: [], + ); } /// `Время прохождения` String get time { - return Intl.message('Время прохождения', name: 'time', desc: '', args: []); + return Intl.message( + 'Время прохождения', + name: 'time', + desc: '', + args: [], + ); } /// `Все` String get all { - return Intl.message('Все', name: 'all', desc: '', args: []); + return Intl.message( + 'Все', + name: 'all', + desc: '', + args: [], + ); } /// `Тип диеты` String get diet_type { - return Intl.message('Тип диеты', name: 'diet_type', desc: '', args: []); + return Intl.message( + 'Тип диеты', + name: 'diet_type', + desc: '', + args: [], + ); } /// `Тип плана` String get plan_type { - return Intl.message('Тип плана', name: 'plan_type', desc: '', args: []); + return Intl.message( + 'Тип плана', + name: 'plan_type', + desc: '', + args: [], + ); } /// `Популярные` String get popular { - return Intl.message('Популярные', name: 'popular', desc: '', args: []); + return Intl.message( + 'Популярные', + name: 'popular', + desc: '', + args: [], + ); } /// `Самые новые` String get most_new { - return Intl.message('Самые новые', name: 'most_new', desc: '', args: []); + return Intl.message( + 'Самые новые', + name: 'most_new', + desc: '', + args: [], + ); } /// `Самые старые` String get most_old { - return Intl.message('Самые старые', name: 'most_old', desc: '', args: []); + return Intl.message( + 'Самые старые', + name: 'most_old', + desc: '', + args: [], + ); } /// `Название: А-Я` @@ -1151,7 +1489,12 @@ class S { /// `По умолчанию` String get by_default { - return Intl.message('По умолчанию', name: 'by_default', desc: '', args: []); + return Intl.message( + 'По умолчанию', + name: 'by_default', + desc: '', + args: [], + ); } /// `Создание диеты` @@ -1196,7 +1539,12 @@ class S { /// `Статус диеты` String get diet_state { - return Intl.message('Статус диеты', name: 'diet_state', desc: '', args: []); + return Intl.message( + 'Статус диеты', + name: 'diet_state', + desc: '', + args: [], + ); } /// `Активная` @@ -1241,22 +1589,42 @@ class S { /// `Мясо` String get meat { - return Intl.message('Мясо', name: 'meat', desc: '', args: []); + return Intl.message( + 'Мясо', + name: 'meat', + desc: '', + args: [], + ); } /// `Веган.` String get vegan { - return Intl.message('Веган.', name: 'vegan', desc: '', args: []); + return Intl.message( + 'Веган.', + name: 'vegan', + desc: '', + args: [], + ); } /// `Фото` String get photo { - return Intl.message('Фото', name: 'photo', desc: '', args: []); + return Intl.message( + 'Фото', + name: 'photo', + desc: '', + args: [], + ); } /// `Галерея` String get gallery { - return Intl.message('Галерея', name: 'gallery', desc: '', args: []); + return Intl.message( + 'Галерея', + name: 'gallery', + desc: '', + args: [], + ); } /// `Добавьте обложку` @@ -1271,27 +1639,52 @@ class S { /// `Добавить` String get add { - return Intl.message('Добавить', name: 'add', desc: '', args: []); + return Intl.message( + 'Добавить', + name: 'add', + desc: '', + args: [], + ); } /// `cкопирован` String get copied { - return Intl.message('cкопирован', name: 'copied', desc: '', args: []); + return Intl.message( + 'cкопирован', + name: 'copied', + desc: '', + args: [], + ); } /// `В черновик` String get to_draft { - return Intl.message('В черновик', name: 'to_draft', desc: '', args: []); + return Intl.message( + 'В черновик', + name: 'to_draft', + desc: '', + args: [], + ); } /// `Превью` String get preview { - return Intl.message('Превью', name: 'preview', desc: '', args: []); + return Intl.message( + 'Превью', + name: 'preview', + desc: '', + args: [], + ); } /// `Опубликовать` String get publish { - return Intl.message('Опубликовать', name: 'publish', desc: '', args: []); + return Intl.message( + 'Опубликовать', + name: 'publish', + desc: '', + args: [], + ); } /// `Добавление плана` @@ -1306,7 +1699,12 @@ class S { /// `Название` String get label { - return Intl.message('Название', name: 'label', desc: '', args: []); + return Intl.message( + 'Название', + name: 'label', + desc: '', + args: [], + ); } /// `План для поддержания формы` @@ -1331,12 +1729,22 @@ class S { /// `Похудение` String get slim { - return Intl.message('Похудение', name: 'slim', desc: '', args: []); + return Intl.message( + 'Похудение', + name: 'slim', + desc: '', + args: [], + ); } /// `Поддержка формы` String get fitness { - return Intl.message('Поддержка формы', name: 'fitness', desc: '', args: []); + return Intl.message( + 'Поддержка формы', + name: 'fitness', + desc: '', + args: [], + ); } /// `Улучшение самочувствия` @@ -1391,37 +1799,72 @@ class S { /// `1 опция` String get one_option { - return Intl.message('1 опция', name: 'one_option', desc: '', args: []); + return Intl.message( + '1 опция', + name: 'one_option', + desc: '', + args: [], + ); } /// `3 опции` String get three_options { - return Intl.message('3 опции', name: 'three_options', desc: '', args: []); + return Intl.message( + '3 опции', + name: 'three_options', + desc: '', + args: [], + ); } /// `Опция` String get option { - return Intl.message('Опция', name: 'option', desc: '', args: []); + return Intl.message( + 'Опция', + name: 'option', + desc: '', + args: [], + ); } /// `Оказание услуг` String get services { - return Intl.message('Оказание услуг', name: 'services', desc: '', args: []); + return Intl.message( + 'Оказание услуг', + name: 'services', + desc: '', + args: [], + ); } /// `Эконом` String get economy { - return Intl.message('Эконом', name: 'economy', desc: '', args: []); + return Intl.message( + 'Эконом', + name: 'economy', + desc: '', + args: [], + ); } /// `Стандарт` String get standard { - return Intl.message('Стандарт', name: 'standard', desc: '', args: []); + return Intl.message( + 'Стандарт', + name: 'standard', + desc: '', + args: [], + ); } /// `Комфорт` String get comfort { - return Intl.message('Комфорт', name: 'comfort', desc: '', args: []); + return Intl.message( + 'Комфорт', + name: 'comfort', + desc: '', + args: [], + ); } /// `Заголовок опции` @@ -1536,7 +1979,12 @@ class S { /// `Автор плана` String get plan_author { - return Intl.message('Автор плана', name: 'plan_author', desc: '', args: []); + return Intl.message( + 'Автор плана', + name: 'plan_author', + desc: '', + args: [], + ); } /// `Продолжительность опции` @@ -1571,7 +2019,12 @@ class S { /// `Похудение` String get slim_type { - return Intl.message('Похудение', name: 'slim_type', desc: '', args: []); + return Intl.message( + 'Похудение', + name: 'slim_type', + desc: '', + args: [], + ); } /// `План питания для похудения должен быть разработан с учётом индивидуальных особенностей организма, возраста, пола, уровня физической активности и состояния здоровья. Общие принципы: \n● Снижение калорийности; \n● Сбалансированный рацион; \n● Разнообразие продуктов; \n● Питьевой режим; \n● Ограничение вредных продуктов;` @@ -1626,12 +2079,22 @@ class S { /// `Цена` String get price { - return Intl.message('Цена', name: 'price', desc: '', args: []); + return Intl.message( + 'Цена', + name: 'price', + desc: '', + args: [], + ); } /// `Мои диеты` String get my_diets { - return Intl.message('Мои диеты', name: 'my_diets', desc: '', args: []); + return Intl.message( + 'Мои диеты', + name: 'my_diets', + desc: '', + args: [], + ); } /// `Опубликованные` @@ -1646,22 +2109,42 @@ class S { /// `Черновики` String get drafted { - return Intl.message('Черновики', name: 'drafted', desc: '', args: []); + return Intl.message( + 'Черновики', + name: 'drafted', + desc: '', + args: [], + ); } /// `Персональные` String get personal { - return Intl.message('Персональные', name: 'personal', desc: '', args: []); + return Intl.message( + 'Персональные', + name: 'personal', + desc: '', + args: [], + ); } /// `Редактировать` String get edit { - return Intl.message('Редактировать', name: 'edit', desc: '', args: []); + return Intl.message( + 'Редактировать', + name: 'edit', + desc: '', + args: [], + ); } /// `Предложить` String get toOffer { - return Intl.message('Предложить', name: 'toOffer', desc: '', args: []); + return Intl.message( + 'Предложить', + name: 'toOffer', + desc: '', + args: [], + ); } /// `Снять с публикации` @@ -1676,22 +2159,42 @@ class S { /// `Диета` String get diet { - return Intl.message('Диета', name: 'diet', desc: '', args: []); + return Intl.message( + 'Диета', + name: 'diet', + desc: '', + args: [], + ); } /// `Удалена` String get deleted { - return Intl.message('Удалена', name: 'deleted', desc: '', args: []); + return Intl.message( + 'Удалена', + name: 'deleted', + desc: '', + args: [], + ); } /// `Мои планы` String get my_plans { - return Intl.message('Мои планы', name: 'my_plans', desc: '', args: []); + return Intl.message( + 'Мои планы', + name: 'my_plans', + desc: '', + args: [], + ); } /// `от` String get from { - return Intl.message('от', name: 'from', desc: '', args: []); + return Intl.message( + 'от', + name: 'from', + desc: '', + args: [], + ); } /// `Данные пользователя` @@ -1716,7 +2219,12 @@ class S { /// `Пол` String get sex { - return Intl.message('Пол', name: 'sex', desc: '', args: []); + return Intl.message( + 'Пол', + name: 'sex', + desc: '', + args: [], + ); } /// `Физическая форма` @@ -1731,22 +2239,42 @@ class S { /// `Рост` String get height { - return Intl.message('Рост', name: 'height', desc: '', args: []); + return Intl.message( + 'Рост', + name: 'height', + desc: '', + args: [], + ); } /// `Давление` String get pressure { - return Intl.message('Давление', name: 'pressure', desc: '', args: []); + return Intl.message( + 'Давление', + name: 'pressure', + desc: '', + args: [], + ); } /// `Верхнее` String get upper { - return Intl.message('Верхнее', name: 'upper', desc: '', args: []); + return Intl.message( + 'Верхнее', + name: 'upper', + desc: '', + args: [], + ); } /// `Нижнее` String get lower { - return Intl.message('Нижнее', name: 'lower', desc: '', args: []); + return Intl.message( + 'Нижнее', + name: 'lower', + desc: '', + args: [], + ); } /// `Склонность к гипотонии` @@ -1851,7 +2379,12 @@ class S { /// `Подтвердить` String get confirm { - return Intl.message('Подтвердить', name: 'confirm', desc: '', args: []); + return Intl.message( + 'Подтвердить', + name: 'confirm', + desc: '', + args: [], + ); } /// `Не удалось отменить диету` @@ -1866,12 +2399,22 @@ class S { /// `часов` String get hours { - return Intl.message('часов', name: 'hours', desc: '', args: []); + return Intl.message( + 'часов', + name: 'hours', + desc: '', + args: [], + ); } /// `час` String get hour { - return Intl.message('час', name: 'hour', desc: '', args: []); + return Intl.message( + 'час', + name: 'hour', + desc: '', + args: [], + ); } /// `часа` @@ -1886,12 +2429,22 @@ class S { /// `минуты` String get minutes { - return Intl.message('минуты', name: 'minutes', desc: '', args: []); + return Intl.message( + 'минуты', + name: 'minutes', + desc: '', + args: [], + ); } /// `минута` String get minute { - return Intl.message('минута', name: 'minute', desc: '', args: []); + return Intl.message( + 'минута', + name: 'minute', + desc: '', + args: [], + ); } /// `минут` @@ -1936,12 +2489,22 @@ class S { /// `этапов` String get stages { - return Intl.message('этапов', name: 'stages', desc: '', args: []); + return Intl.message( + 'этапов', + name: 'stages', + desc: '', + args: [], + ); } /// `этап` String get stage { - return Intl.message('этап', name: 'stage', desc: '', args: []); + return Intl.message( + 'этап', + name: 'stage', + desc: '', + args: [], + ); } /// `этапа` @@ -1976,12 +2539,22 @@ class S { /// `Ингредиенты` String get ingredients { - return Intl.message('Ингредиенты', name: 'ingredients', desc: '', args: []); + return Intl.message( + 'Ингредиенты', + name: 'ingredients', + desc: '', + args: [], + ); } /// `Шаг` String get step { - return Intl.message('Шаг', name: 'step', desc: '', args: []); + return Intl.message( + 'Шаг', + name: 'step', + desc: '', + args: [], + ); } /// `Пошаговый фоторецепт` @@ -2006,7 +2579,12 @@ class S { /// `Спам` String get spam { - return Intl.message('Спам', name: 'spam', desc: '', args: []); + return Intl.message( + 'Спам', + name: 'spam', + desc: '', + args: [], + ); } /// `Нарушение законодательства` @@ -2021,7 +2599,12 @@ class S { /// `Обман` String get deception { - return Intl.message('Обман', name: 'deception', desc: '', args: []); + return Intl.message( + 'Обман', + name: 'deception', + desc: '', + args: [], + ); } /// `Насилие и вражда` @@ -2066,7 +2649,12 @@ class S { /// `Жалоба` String get complaint { - return Intl.message('Жалоба', name: 'complaint', desc: '', args: []); + return Intl.message( + 'Жалоба', + name: 'complaint', + desc: '', + args: [], + ); } /// `Что именно в этом материале Вы считаете неприемлемым и нарушающим правила?` @@ -2131,27 +2719,52 @@ class S { /// `Хорошо` String get ok { - return Intl.message('Хорошо', name: 'ok', desc: '', args: []); + return Intl.message( + 'Хорошо', + name: 'ok', + desc: '', + args: [], + ); } /// `Алкоголь` String get alcohol { - return Intl.message('Алкоголь', name: 'alcohol', desc: '', args: []); + return Intl.message( + 'Алкоголь', + name: 'alcohol', + desc: '', + args: [], + ); } /// `Наркотики` String get drugs { - return Intl.message('Наркотики', name: 'drugs', desc: '', args: []); + return Intl.message( + 'Наркотики', + name: 'drugs', + desc: '', + args: [], + ); } /// `Никотин` String get nicotine { - return Intl.message('Никотин', name: 'nicotine', desc: '', args: []); + return Intl.message( + 'Никотин', + name: 'nicotine', + desc: '', + args: [], + ); } /// `Оружие` String get weapon { - return Intl.message('Оружие', name: 'weapon', desc: '', args: []); + return Intl.message( + 'Оружие', + name: 'weapon', + desc: '', + args: [], + ); } /// `Поддельные документы` @@ -2176,7 +2789,12 @@ class S { /// `Другое` String get other { - return Intl.message('Другое', name: 'other', desc: '', args: []); + return Intl.message( + 'Другое', + name: 'other', + desc: '', + args: [], + ); } /// `Введение в заблуждение` @@ -2201,7 +2819,12 @@ class S { /// `Мошенничество` String get fraud { - return Intl.message('Мошенничество', name: 'fraud', desc: '', args: []); + return Intl.message( + 'Мошенничество', + name: 'fraud', + desc: '', + args: [], + ); } /// `Мошенничество с целью наживы. Если вас обманули, пожалуйста, сообщите об этом в правоохранительные органы.` @@ -2226,7 +2849,12 @@ class S { /// `Оскорбление` String get hatred { - return Intl.message('Оскорбление', name: 'hatred', desc: '', args: []); + return Intl.message( + 'Оскорбление', + name: 'hatred', + desc: '', + args: [], + ); } /// `Склонение к самоубийству` @@ -2251,7 +2879,12 @@ class S { /// `Экстремизм` String get extremism { - return Intl.message('Экстремизм', name: 'extremism', desc: '', args: []); + return Intl.message( + 'Экстремизм', + name: 'extremism', + desc: '', + args: [], + ); } /// `Призывы к травле` @@ -2306,7 +2939,12 @@ class S { /// `Ваш рейтинг` String get your_rating { - return Intl.message('Ваш рейтинг', name: 'your_rating', desc: '', args: []); + return Intl.message( + 'Ваш рейтинг', + name: 'your_rating', + desc: '', + args: [], + ); } /// `Скопировать пригласительную ссылку` @@ -2321,7 +2959,12 @@ class S { /// `Статистика` String get statistic { - return Intl.message('Статистика', name: 'statistic', desc: '', args: []); + return Intl.message( + 'Статистика', + name: 'statistic', + desc: '', + args: [], + ); } /// `За всё время` @@ -2336,17 +2979,32 @@ class S { /// `За год` String get for_a_year { - return Intl.message('За год', name: 'for_a_year', desc: '', args: []); + return Intl.message( + 'За год', + name: 'for_a_year', + desc: '', + args: [], + ); } /// `За месяц` String get for_a_month { - return Intl.message('За месяц', name: 'for_a_month', desc: '', args: []); + return Intl.message( + 'За месяц', + name: 'for_a_month', + desc: '', + args: [], + ); } /// `За неделю` String get for_a_week { - return Intl.message('За неделю', name: 'for_a_week', desc: '', args: []); + return Intl.message( + 'За неделю', + name: 'for_a_week', + desc: '', + args: [], + ); } /// `Количество приглашенных` @@ -2571,7 +3229,12 @@ class S { /// `Заказать` String get to_order { - return Intl.message('Заказать', name: 'to_order', desc: '', args: []); + return Intl.message( + 'Заказать', + name: 'to_order', + desc: '', + args: [], + ); } /// `Дату старта плана невозможно выбрать, пока Вы не привяжите карту` @@ -2636,7 +3299,12 @@ class S { /// `Оплатить` String get pay { - return Intl.message('Оплатить', name: 'pay', desc: '', args: []); + return Intl.message( + 'Оплатить', + name: 'pay', + desc: '', + args: [], + ); } /// `Подробнее о заказе` @@ -2691,12 +3359,22 @@ class S { /// `Мои карты` String get my_cards { - return Intl.message('Мои карты', name: 'my_cards', desc: '', args: []); + return Intl.message( + 'Мои карты', + name: 'my_cards', + desc: '', + args: [], + ); } /// `Добавить карту` String get new_card { - return Intl.message('Добавить карту', name: 'new_card', desc: '', args: []); + return Intl.message( + 'Добавить карту', + name: 'new_card', + desc: '', + args: [], + ); } /// `У вас нет привязанных карт. Что бы начать работу, привяжите карту` @@ -2801,7 +3479,12 @@ class S { /// `Завершен` String get done { - return Intl.message('Завершен', name: 'done', desc: '', args: []); + return Intl.message( + 'Завершен', + name: 'done', + desc: '', + args: [], + ); } /// `Поздравляем, консультация успешно оплачена` @@ -2966,7 +3649,12 @@ class S { /// `Отправить` String get send { - return Intl.message('Отправить', name: 'send', desc: '', args: []); + return Intl.message( + 'Отправить', + name: 'send', + desc: '', + args: [], + ); } /// `Прокомментировать день` @@ -3051,7 +3739,12 @@ class S { /// `Отменить` String get cancel { - return Intl.message('Отменить', name: 'cancel', desc: '', args: []); + return Intl.message( + 'Отменить', + name: 'cancel', + desc: '', + args: [], + ); } /// `Заказ отменен` @@ -3416,12 +4109,22 @@ class S { /// `Скопировать` String get copy { - return Intl.message('Скопировать', name: 'copy', desc: '', args: []); + return Intl.message( + 'Скопировать', + name: 'copy', + desc: '', + args: [], + ); } /// `Ответить` String get reply { - return Intl.message('Ответить', name: 'reply', desc: '', args: []); + return Intl.message( + 'Ответить', + name: 'reply', + desc: '', + args: [], + ); } /// `Удалить комментарий` @@ -3546,7 +4249,12 @@ class S { /// `Удалить` String get delete { - return Intl.message('Удалить', name: 'delete', desc: '', args: []); + return Intl.message( + 'Удалить', + name: 'delete', + desc: '', + args: [], + ); } /// `Не получилось удалить ваш аккаунт` @@ -3591,7 +4299,12 @@ class S { /// `Ваше имя` String get your_name { - return Intl.message('Ваше имя', name: 'your_name', desc: '', args: []); + return Intl.message( + 'Ваше имя', + name: 'your_name', + desc: '', + args: [], + ); } /// `Ваша фамилия` @@ -3616,22 +4329,42 @@ class S { /// `Телефон` String get phone { - return Intl.message('Телефон', name: 'phone', desc: '', args: []); + return Intl.message( + 'Телефон', + name: 'phone', + desc: '', + args: [], + ); } /// `М` String get male_short { - return Intl.message('М', name: 'male_short', desc: '', args: []); + return Intl.message( + 'М', + name: 'male_short', + desc: '', + args: [], + ); } /// `Ж` String get female_short { - return Intl.message('Ж', name: 'female_short', desc: '', args: []); + return Intl.message( + 'Ж', + name: 'female_short', + desc: '', + args: [], + ); } /// `Далее` String get next { - return Intl.message('Далее', name: 'next', desc: '', args: []); + return Intl.message( + 'Далее', + name: 'next', + desc: '', + args: [], + ); } /// `Введите рост` @@ -3646,7 +4379,12 @@ class S { /// `Введите вес` String get type_weight { - return Intl.message('Введите вес', name: 'type_weight', desc: '', args: []); + return Intl.message( + 'Введите вес', + name: 'type_weight', + desc: '', + args: [], + ); } /// `Зарегистрироваться` @@ -3661,7 +4399,12 @@ class S { /// `Последний шаг` String get last_step { - return Intl.message('Последний шаг', name: 'last_step', desc: '', args: []); + return Intl.message( + 'Последний шаг', + name: 'last_step', + desc: '', + args: [], + ); } /// `Эти данные нужны для корректной работы дневника питания и расчета вашей дневной нормы потребления КБЖУ` @@ -3856,12 +4599,22 @@ class S { /// `Скопировано!` String get copied2 { - return Intl.message('Скопировано!', name: 'copied2', desc: '', args: []); + return Intl.message( + 'Скопировано!', + name: 'copied2', + desc: '', + args: [], + ); } /// `Войти в аккаунт` String get login { - return Intl.message('Войти в аккаунт', name: 'login', desc: '', args: []); + return Intl.message( + 'Войти в аккаунт', + name: 'login', + desc: '', + args: [], + ); } /// `Регистрация не удалась!` @@ -3886,7 +4639,12 @@ class S { /// `Покупатель` String get customer { - return Intl.message('Покупатель', name: 'customer', desc: '', args: []); + return Intl.message( + 'Покупатель', + name: 'customer', + desc: '', + args: [], + ); } /// `Персональная диета установлена` @@ -3921,7 +4679,12 @@ class S { /// `14 дней` String get fourteenDays { - return Intl.message('14 дней', name: 'fourteenDays', desc: '', args: []); + return Intl.message( + '14 дней', + name: 'fourteenDays', + desc: '', + args: [], + ); } /// `Мы собираем самое большое сообщество людей, желающих вести здоровый образ жизни!` @@ -3956,7 +4719,22 @@ class S { /// `Пригласить` String get invite { - return Intl.message('Пригласить', name: 'invite', desc: '', args: []); + return Intl.message( + 'Пригласить', + name: 'invite', + desc: '', + args: [], + ); + } + + /// `Комментарий` + String get comment_hint { + return Intl.message( + 'Комментарий', + name: 'comment_hint', + desc: '', + args: [], + ); } } @@ -3985,4 +4763,4 @@ class AppLocalizationDelegate extends LocalizationsDelegate { } return false; } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 2926e786..0d35bac4 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -466,6 +466,7 @@ "weAreLookingFor": "Мы собираем самое большое сообщество людей, желающих вести здоровый образ жизни!", "letsInvite": "Давайте пригласим близких в итвио", "eatvioIsAHelthyHabbit": "Итвио — это полезная привычка", - "invite": "Пригласить" + "invite": "Пригласить", + "comment_hint": "Комментарий" } diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index e5d6f7c9..32c6f650 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -215,5 +215,6 @@ "from": "от", "user_data": "Данные пользователя", "infoAboutOrder": "Информация о заказе", - "notifications": "Уведомления" + "notifications": "Уведомления", + "comment_hint": "Комментарий" } From 7b425e56f1e2ca7fcecfeb0ed3be9c71d467d112 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Tue, 13 Jan 2026 12:37:10 +0300 Subject: [PATCH 04/10] chore: remove unused markdown_utils import from expandable_text.dart --- lib/features/diets/presentation/widgets/expandable_text.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/features/diets/presentation/widgets/expandable_text.dart b/lib/features/diets/presentation/widgets/expandable_text.dart index d9816685..bb2bb9e7 100644 --- a/lib/features/diets/presentation/widgets/expandable_text.dart +++ b/lib/features/diets/presentation/widgets/expandable_text.dart @@ -3,7 +3,6 @@ import 'dart:math' as math; import 'package:eatvio_app/generated/l10n.dart'; import 'package:eatvio_app/core/theme/custom_text_style.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; -import 'package:eatvio_app/core/utils/markdown_utils.dart'; import 'package:eatvio_app/core/widgets/markdown_html_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; From c78682127526b2f42e9943330c1cf9271e74155b Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Tue, 13 Jan 2026 13:03:58 +0300 Subject: [PATCH 05/10] fix: handle null context in MarkdownHtmlWidget and improve test stability with pumpAndSettle calls --- lib/core/widgets/markdown_html_widget.dart | 2 +- test/core/widgets/marketing_bottom_sheet_test.dart | 2 ++ test/core/widgets/option_widget_test.dart | 4 ++++ test/core/widgets/show_error_dialog_test.dart | 4 ++++ .../presentation/widgets/chosen_diet_widget_content_test.dart | 3 +++ .../presentation/widgets/chosen_plan_widget_content_test.dart | 3 +++ .../feed/presentation/widgets/comments_widget_test.dart | 1 + .../show_successful_registration_bottom_sheet_test.dart | 2 ++ .../presentation/pages/change_password_screen_test.dart | 2 ++ 9 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/core/widgets/markdown_html_widget.dart b/lib/core/widgets/markdown_html_widget.dart index 53e7c770..5361e840 100644 --- a/lib/core/widgets/markdown_html_widget.dart +++ b/lib/core/widgets/markdown_html_widget.dart @@ -41,7 +41,7 @@ class MarkdownHtmlWidget extends StatelessWidget { extensionSet: md.ExtensionSet.gitHubFlavored, ); - final screenWidth = MediaQuery.of(context).size.width; + final screenWidth = MediaQuery.maybeOf(context)?.size.width ?? 400.0; final defaultImageWidth = imageWidth ?? (screenWidth - 32); final defaultTextColor = textColor ?? Colors.black87; final defaultFontSize = fontSize ?? 16.0; diff --git a/test/core/widgets/marketing_bottom_sheet_test.dart b/test/core/widgets/marketing_bottom_sheet_test.dart index 32e92e7b..a54d3e14 100644 --- a/test/core/widgets/marketing_bottom_sheet_test.dart +++ b/test/core/widgets/marketing_bottom_sheet_test.dart @@ -29,6 +29,7 @@ void main() { const MarketingBottomSheet(), ), ); + await tester.pumpAndSettle(); expect(find.byType(MarketingBottomSheet), findsOneWidget); }); @@ -59,6 +60,7 @@ void main() { ), ); + await tester.pump(); await tester.tap(find.text('Show')); await tester.pumpAndSettle(); diff --git a/test/core/widgets/option_widget_test.dart b/test/core/widgets/option_widget_test.dart index cf8a3cf9..6a70eb22 100644 --- a/test/core/widgets/option_widget_test.dart +++ b/test/core/widgets/option_widget_test.dart @@ -24,6 +24,7 @@ void main() { testWidgets('returns SizedBox.shrink when option is null', (tester) async { await tester.pumpWidget(createTestWidget(const OptionWidget(option: null, duration: 7))); + await tester.pumpAndSettle(); expect(find.byType(OptionWidget), findsOneWidget); expect(find.byType(SizedBox), findsWidgets); @@ -33,6 +34,7 @@ void main() { const option = PacketOptions(items: ['Item 1', 'Item 2'], price: 1000.0, short: 'Short', description: 'Description', hasPersonalDiet: false); await tester.pumpWidget(createTestWidget(const OptionWidget(option: option, duration: 7))); + await tester.pumpAndSettle(); expect(find.byType(OptionWidget), findsOneWidget); expect(find.text('Short'), findsOneWidget); @@ -43,6 +45,7 @@ void main() { const option = PacketOptions(items: ['Item 1'], price: 1000.0, short: 'Short', description: 'Description', hasPersonalDiet: true); await tester.pumpWidget(createTestWidget(const OptionWidget(option: option, duration: 7))); + await tester.pumpAndSettle(); expect(find.byType(OptionWidget), findsOneWidget); }); @@ -51,6 +54,7 @@ void main() { const option = PacketOptions(items: ['Item 1'], price: 1000.0, short: 'Short', description: 'Description', hasPersonalDiet: false); await tester.pumpWidget(createTestWidget(const OptionWidget(option: option, duration: 7, disableDuration: true))); + await tester.pumpAndSettle(); expect(find.byType(OptionWidget), findsOneWidget); }); diff --git a/test/core/widgets/show_error_dialog_test.dart b/test/core/widgets/show_error_dialog_test.dart index d56c7fc0..c1c6c533 100644 --- a/test/core/widgets/show_error_dialog_test.dart +++ b/test/core/widgets/show_error_dialog_test.dart @@ -31,6 +31,7 @@ void main() { ), ); + await tester.pump(); await tester.tap(find.text('Show Error')); await tester.pumpAndSettle(); @@ -68,6 +69,7 @@ void main() { ), ); + await tester.pump(); await tester.tap(find.text('Show Error')); await tester.pumpAndSettle(); @@ -103,6 +105,7 @@ void main() { ), ); + await tester.pump(); await tester.tap(find.text('Show Error')); await tester.pumpAndSettle(); @@ -134,6 +137,7 @@ void main() { ), ); + await tester.pump(); await tester.tap(find.text('Show Error')); await tester.pumpAndSettle(); diff --git a/test/features/diary/presentation/widgets/chosen_diet_widget_content_test.dart b/test/features/diary/presentation/widgets/chosen_diet_widget_content_test.dart index dbd269f3..0ef9081a 100644 --- a/test/features/diary/presentation/widgets/chosen_diet_widget_content_test.dart +++ b/test/features/diary/presentation/widgets/chosen_diet_widget_content_test.dart @@ -34,6 +34,7 @@ void main() { ), ), ); + await tester.pumpAndSettle(); expect(find.byType(ChosenDietWidgetContent), findsOneWidget); expect(find.text('Test Diet'), findsOneWidget); @@ -50,6 +51,7 @@ void main() { ), ), ); + await tester.pumpAndSettle(); expect(find.byType(ChosenDietWidgetContent), findsOneWidget); }); @@ -65,6 +67,7 @@ void main() { ), ), ); + await tester.pumpAndSettle(); expect(find.text('My Diet'), findsOneWidget); }); diff --git a/test/features/diary/presentation/widgets/chosen_plan_widget_content_test.dart b/test/features/diary/presentation/widgets/chosen_plan_widget_content_test.dart index d5f8d9cf..9050dcd3 100644 --- a/test/features/diary/presentation/widgets/chosen_plan_widget_content_test.dart +++ b/test/features/diary/presentation/widgets/chosen_plan_widget_content_test.dart @@ -37,6 +37,7 @@ void main() { planName: 'Test Plan', planDuration: 14, )); + await tester.pumpAndSettle(); expect(find.byType(ChosenPlanWidgetContent), findsOneWidget); expect(find.text('Test Plan'), findsOneWidget); @@ -48,6 +49,7 @@ void main() { planName: 'My Plan', planDuration: 7, )); + await tester.pumpAndSettle(); expect(find.byType(ChosenPlanWidgetContent), findsOneWidget); expect(find.textContaining('3'), findsOneWidget); @@ -60,6 +62,7 @@ void main() { planName: 'Long Plan', planDuration: 30, )); + await tester.pumpAndSettle(); expect(find.byType(ChosenPlanWidgetContent), findsOneWidget); expect(find.text('Long Plan'), findsOneWidget); diff --git a/test/features/feed/presentation/widgets/comments_widget_test.dart b/test/features/feed/presentation/widgets/comments_widget_test.dart index 185e0157..48974de6 100644 --- a/test/features/feed/presentation/widgets/comments_widget_test.dart +++ b/test/features/feed/presentation/widgets/comments_widget_test.dart @@ -78,6 +78,7 @@ void main() { ), ), ); + await tester.pumpAndSettle(); expect(find.byType(CommentsWidget), findsOneWidget); }); diff --git a/test/features/registration_v2/presentation/widgets/show_successful_registration_bottom_sheet_test.dart b/test/features/registration_v2/presentation/widgets/show_successful_registration_bottom_sheet_test.dart index 6a9945f4..e55692f5 100644 --- a/test/features/registration_v2/presentation/widgets/show_successful_registration_bottom_sheet_test.dart +++ b/test/features/registration_v2/presentation/widgets/show_successful_registration_bottom_sheet_test.dart @@ -63,6 +63,7 @@ void main() { // Act await tester.pumpWidget(createTestWidget(const SizedBox(), mockCubit)); + await tester.pump(); await tester.tap(find.text('Show Bottom Sheet')); await tester.pumpAndSettle(); @@ -107,6 +108,7 @@ void main() { // Act await tester.pumpWidget(createTestWidgetError(const SizedBox(), mockCubit)); + await tester.pump(); await tester.tap(find.text('Show Bottom Sheet')); await tester.pumpAndSettle(); diff --git a/test/features/settings/presentation/pages/change_password_screen_test.dart b/test/features/settings/presentation/pages/change_password_screen_test.dart index b0ada6ec..fe576e3b 100644 --- a/test/features/settings/presentation/pages/change_password_screen_test.dart +++ b/test/features/settings/presentation/pages/change_password_screen_test.dart @@ -54,6 +54,7 @@ void main() { home: ChangePasswordScreen(settingsEntity: settingsEntity), ), ); + await tester.pumpAndSettle(); expect(find.byType(ChangePasswordScreen), findsOneWidget); expect(find.text('Смена пароля'), findsOneWidget); @@ -80,6 +81,7 @@ void main() { home: ChangePasswordScreen(settingsEntity: settingsEntity), ), ); + await tester.pumpAndSettle(); expect(find.byType(AppBar), findsOneWidget); expect(find.text('Смена пароля'), findsOneWidget); From 41e96c63c6ab4d90269b2f0cd35ef0dd19e8dba5 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Wed, 14 Jan 2026 13:02:24 +0300 Subject: [PATCH 06/10] feat(token_storage): add clearCache method for testing and ensure fresh state in tests --- lib/core/token_storage.dart | 8 +++++ test/core/routing/auth_routes_test.dart | 39 +++++-------------------- test/core/token_storage_test.dart | 8 +++++ 3 files changed, 23 insertions(+), 32 deletions(-) diff --git a/lib/core/token_storage.dart b/lib/core/token_storage.dart index 871140c7..9925f9aa 100644 --- a/lib/core/token_storage.dart +++ b/lib/core/token_storage.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; abstract class TokenStorage { @@ -8,6 +9,13 @@ abstract class TokenStorage { return _cachedPrefs!; } + /// Clears the cached SharedPreferences instance. + /// This is primarily used for testing to ensure fresh state between tests. + @visibleForTesting + static void clearCache() { + _cachedPrefs = null; + } + static Future haveTokenInStorage() async { try { final sharedPreferences = await _getPrefs(); diff --git a/test/core/routing/auth_routes_test.dart b/test/core/routing/auth_routes_test.dart index 6437b14d..41ce977d 100644 --- a/test/core/routing/auth_routes_test.dart +++ b/test/core/routing/auth_routes_test.dart @@ -12,10 +12,7 @@ void main() { test('createRoutes содержит маршрут authScreen', () { final routes = AuthRoutes.createRoutes(); - final authRoute = routes.firstWhere( - (route) => route is GoRoute && route.path == '/auth-screen', - orElse: () => throw Exception('Route not found'), - ); + final authRoute = routes.firstWhere((route) => route is GoRoute && route.path == '/auth-screen', orElse: () => throw Exception('Route not found')); expect(authRoute, isA()); }); @@ -67,10 +64,7 @@ void main() { test('createRoutes содержит маршрут verifyScreen', () { final routes = AuthRoutes.createRoutes(); - final verifyRoute = routes.firstWhere( - (route) => route is GoRoute && route.path == '/verify-screen', - orElse: () => throw Exception('Route not found'), - ); + final verifyRoute = routes.firstWhere((route) => route is GoRoute && route.path == '/verify-screen', orElse: () => throw Exception('Route not found')); expect(verifyRoute, isA()); }); @@ -92,44 +86,25 @@ void main() { expect(registerViaSocialRoute, isA()); }); - test('authScreen имеет redirect функцию', () { - final routes = AuthRoutes.createRoutes(); - final authRoute = routes.first as GoRoute; - expect(authRoute.redirect, isNotNull); - }); - test('forgetPasswordScreen builder обрабатывает extra данные', () { final routes = AuthRoutes.createRoutes(); final authRoute = routes.first as GoRoute; - final forgetPasswordRoute = authRoute.routes.firstWhere( - (route) => route is GoRoute && route.path == 'forget-password-screen', - orElse: () => throw Exception('Route not found'), - ) as GoRoute; + final forgetPasswordRoute = + authRoute.routes.firstWhere((route) => route is GoRoute && route.path == 'forget-password-screen', orElse: () => throw Exception('Route not found')) + as GoRoute; expect(forgetPasswordRoute.builder, isNotNull); }); test('verifyScreen builder обрабатывает extra данные', () { final routes = AuthRoutes.createRoutes(); - final verifyRoute = routes.firstWhere( - (route) => route is GoRoute && route.path == '/verify-screen', - ) as GoRoute; + final verifyRoute = routes.firstWhere((route) => route is GoRoute && route.path == '/verify-screen') as GoRoute; expect(verifyRoute.builder, isNotNull); }); test('registerViaSocialScreen builder обрабатывает extra данные', () { final routes = AuthRoutes.createRoutes(); - final registerViaSocialRoute = routes.firstWhere( - (route) => route is GoRoute && route.path == '/register-via-social-screen', - ) as GoRoute; + final registerViaSocialRoute = routes.firstWhere((route) => route is GoRoute && route.path == '/register-via-social-screen') as GoRoute; expect(registerViaSocialRoute.builder, isNotNull); }); }); } - - - - - - - - diff --git a/test/core/token_storage_test.dart b/test/core/token_storage_test.dart index 403339ce..de8fb3b1 100644 --- a/test/core/token_storage_test.dart +++ b/test/core/token_storage_test.dart @@ -6,6 +6,10 @@ void main() { group('TokenStorage', () { setUp(() async { SharedPreferences.setMockInitialValues({}); + // Clear cached instance to ensure fresh state for each test + TokenStorage.clearCache(); + final prefs = await SharedPreferences.getInstance(); + await prefs.clear(); }); test('haveTokenInStorage returns false when no token is stored', () async { @@ -66,6 +70,10 @@ void main() { group('SocketIdStorage', () { setUp(() async { SharedPreferences.setMockInitialValues({}); + // Clear cached instance to ensure fresh state for each test + TokenStorage.clearCache(); + final prefs = await SharedPreferences.getInstance(); + await prefs.clear(); }); test('haveSocketIdInStorage returns false when no socketId is stored', () async { From 4852d2cf1042df46f6cde64efdbdd444e4fc4442 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Wed, 14 Jan 2026 14:48:32 +0300 Subject: [PATCH 07/10] refactor: replace HTML rendering with MarkdownHtmlWidget across various components for consistent markdown processing --- .../presentation/pages/blog_post_screen.dart | 4 - .../presentation/widgets/diets_widget.dart | 100 +---------------- .../presentation/widgets/recipes_widget.dart | 102 +----------------- .../presentation/widgets/my_diet_widget.dart | 100 +---------------- .../presentation/widgets/my_plan_widget.dart | 100 +---------------- .../widgets/profile_blog_post_widget.dart | 48 +-------- .../pages/about_recipe_screen.dart | 2 +- .../widgets/my_recipe_widget.dart | 100 +---------------- 8 files changed, 31 insertions(+), 525 deletions(-) diff --git a/lib/features/blog_post/presentation/pages/blog_post_screen.dart b/lib/features/blog_post/presentation/pages/blog_post_screen.dart index ea4ccb97..70593f8c 100644 --- a/lib/features/blog_post/presentation/pages/blog_post_screen.dart +++ b/lib/features/blog_post/presentation/pages/blog_post_screen.dart @@ -238,10 +238,6 @@ class _BlogPostScreenState extends State { padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: MarkdownHtmlWidget( markdownText: blogPostState.blogPostModel!.description, - onLinkTap: (url, attributes, element) { - debugPrint('Link tapped: $url'); - return; - }, ), ), const SizedBox(height: 8), diff --git a/lib/features/feed/presentation/widgets/diets_widget.dart b/lib/features/feed/presentation/widgets/diets_widget.dart index 4b3428e6..6de38564 100644 --- a/lib/features/feed/presentation/widgets/diets_widget.dart +++ b/lib/features/feed/presentation/widgets/diets_widget.dart @@ -13,12 +13,10 @@ import 'package:eatvio_app/core/theme/custom_text_style.dart'; import 'package:eatvio_app/core/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:eatvio_app/core/widgets/markdown_html_widget.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:markdown/markdown.dart' as md; -import 'package:url_launcher/url_launcher.dart'; class DietsWidget extends StatefulWidget { final Diet diet; @@ -117,94 +115,11 @@ class _DietsWidgetState extends State { String details = widget.diet.details.length > 200 ? '${widget.diet.details.substring(0, 200)}...' : widget.diet.details; - // Автоматически преобразуем URL в markdown ссылки - // Сначала исправляем неправильный синтаксис markdown ссылок - final wrongLinkRegex = RegExp(r'\[(https?://[^\]]+|www\.[^\]]+)\]\(([^\)]+)\)'); - details = details.replaceAllMapped(wrongLinkRegex, (match) { - final urlInText = match.group(1)!; - if (!urlInText.startsWith('http://') && !urlInText.startsWith('https://') && !urlInText.startsWith('www.')) { - return match.group(0)!; - } - final fullUrl = urlInText.startsWith('www.') ? 'https://$urlInText' : urlInText; - return '[$urlInText]($fullUrl)'; - }); - - final linkRegex = RegExp(r'\[([^\]]+)\]\(([^\)]+)\)'); - final existingLinks = <_LinkRange>[]; - for (final linkMatch in linkRegex.allMatches(details)) { - existingLinks.add(_LinkRange(linkMatch.start, linkMatch.end)); - } - final urlRegex = RegExp(r'(https?://[^\s\)]+|www\.[^\s\)]+)', caseSensitive: false); - String result = details; - int offset = 0; - for (final urlMatch in urlRegex.allMatches(details)) { - bool isInsideLink = existingLinks.any((link) => - urlMatch.start >= link.start && urlMatch.end <= link.end); - if (!isInsideLink) { - final url = urlMatch.group(0)!; - final fullUrl = url.startsWith('www.') ? 'https://$url' : url; - final replacement = '[$url]($fullUrl)'; - result = result.replaceRange( - urlMatch.start + offset, - urlMatch.end + offset, - replacement, - ); - offset += replacement.length - url.length; - } - } - details = result; - // Гарантируем, что жирный текст будет распознан - final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); - details = details.replaceAllMapped(boldRegex, (match) { - return '${match.group(1)}'; - }); - - return Html( - data: md.markdownToHtml( - details, - extensionSet: md.ExtensionSet.gitHubFlavored, - ), - style: { - "body": Style( - margin: Margins.zero, - padding: HtmlPaddings.zero, - fontSize: FontSize(TextStyles.textSMedium.fontSize ?? 14), - lineHeight: const LineHeight(1.5), - ), - "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), - "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black), - "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), - }, - onLinkTap: (url, attributes, element) async { - if (url != null) { - final uri = Uri.parse(url); - if (await canLaunchUrl(uri)) { - await launchUrl(uri, mode: LaunchMode.externalApplication); - } - } - }, + return MarkdownHtmlWidget( + markdownText: details, + fontSize: TextStyles.textSMedium.fontSize ?? 14, + textColor: appTheme.black, ); }, ), @@ -275,8 +190,3 @@ class _DietsWidgetState extends State { } } -class _LinkRange { - final int start; - final int end; - _LinkRange(this.start, this.end); -} diff --git a/lib/features/feed/presentation/widgets/recipes_widget.dart b/lib/features/feed/presentation/widgets/recipes_widget.dart index ed89b183..6d9e800a 100644 --- a/lib/features/feed/presentation/widgets/recipes_widget.dart +++ b/lib/features/feed/presentation/widgets/recipes_widget.dart @@ -16,12 +16,10 @@ import 'package:eatvio_app/features/feed/presentation/bloc/recipes_cubit/recipes import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_html/flutter_html.dart'; +import 'package:eatvio_app/core/widgets/markdown_html_widget.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:markdown/markdown.dart' as md; -import 'package:url_launcher/url_launcher.dart'; class RecipesWidget extends StatefulWidget { final int index; @@ -155,96 +153,11 @@ class _RecipesWidgetState extends State { String description = widget.recipe.description.length > 200 ? widget.recipe.description.substring(0, 200) : widget.recipe.description; - // Автоматически преобразуем URL в markdown ссылки - // Сначала исправляем неправильный синтаксис markdown ссылок - final wrongLinkRegex = RegExp(r'\[(https?://[^\]]+|www\.[^\]]+)\]\(([^\)]+)\)'); - description = description.replaceAllMapped(wrongLinkRegex, (match) { - final urlInText = match.group(1)!; - if (!urlInText.startsWith('http://') && !urlInText.startsWith('https://') && !urlInText.startsWith('www.')) { - return match.group(0)!; - } - final fullUrl = urlInText.startsWith('www.') ? 'https://$urlInText' : urlInText; - return '[$urlInText]($fullUrl)'; - }); - - // Находим все существующие markdown ссылки и их позиции - final linkRegex = RegExp(r'\[([^\]]+)\]\(([^\)]+)\)'); - final existingLinks = <_LinkRange>[]; - for (final linkMatch in linkRegex.allMatches(description)) { - existingLinks.add(_LinkRange(linkMatch.start, linkMatch.end)); - } - - final urlRegex = RegExp(r'(https?://[^\s\)]+|www\.[^\s\)]+)', caseSensitive: false); - String result = description; - int offset = 0; - for (final urlMatch in urlRegex.allMatches(description)) { - bool isInsideLink = existingLinks.any((link) => - urlMatch.start >= link.start && urlMatch.end <= link.end); - if (!isInsideLink) { - final url = urlMatch.group(0)!; - final fullUrl = url.startsWith('www.') ? 'https://$url' : url; - final replacement = '[$url]($fullUrl)'; - result = result.replaceRange( - urlMatch.start + offset, - urlMatch.end + offset, - replacement, - ); - offset += replacement.length - url.length; - } - } - description = result; - // Гарантируем, что жирный текст будет распознан - final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); - description = description.replaceAllMapped(boldRegex, (match) { - return '${match.group(1)}'; - }); - - return Html( - data: md.markdownToHtml( - description, - extensionSet: md.ExtensionSet.gitHubFlavored, - ), - style: { - "body": Style( - margin: Margins.zero, - padding: HtmlPaddings.zero, - fontSize: FontSize(TextStyles.textSMedium.fontSize ?? 14), - lineHeight: const LineHeight(1.5), - ), - "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), - "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black), - "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), - }, - onLinkTap: (url, attributes, element) async { - if (url != null) { - final uri = Uri.parse(url); - if (await canLaunchUrl(uri)) { - await launchUrl(uri, mode: LaunchMode.externalApplication); - } - } - }, + return MarkdownHtmlWidget( + markdownText: description, + fontSize: TextStyles.textSMedium.fontSize ?? 14, + textColor: appTheme.black, ); }, ), @@ -338,8 +251,3 @@ class _RecipesWidgetState extends State { } } -class _LinkRange { - final int start; - final int end; - _LinkRange(this.start, this.end); -} diff --git a/lib/features/my_diets/presentation/widgets/my_diet_widget.dart b/lib/features/my_diets/presentation/widgets/my_diet_widget.dart index f655b8b9..f2f5892e 100644 --- a/lib/features/my_diets/presentation/widgets/my_diet_widget.dart +++ b/lib/features/my_diets/presentation/widgets/my_diet_widget.dart @@ -21,12 +21,10 @@ import 'package:eatvio_app/features/personal_diet_suggestion/presentation/person import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_html/flutter_html.dart'; +import 'package:eatvio_app/core/widgets/markdown_html_widget.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:markdown/markdown.dart' as md; -import 'package:url_launcher/url_launcher.dart'; class MyDietWidget extends StatefulWidget { final Diet diet; @@ -86,94 +84,11 @@ class _MyDietWidgetState extends State { String details = widget.diet.details.length > 200 ? '${widget.diet.details.substring(0, 200)}...' : widget.diet.details; - // Автоматически преобразуем URL в markdown ссылки - // Сначала исправляем неправильный синтаксис markdown ссылок - final wrongLinkRegex = RegExp(r'\[(https?://[^\]]+|www\.[^\]]+)\]\(([^\)]+)\)'); - details = details.replaceAllMapped(wrongLinkRegex, (match) { - final urlInText = match.group(1)!; - if (!urlInText.startsWith('http://') && !urlInText.startsWith('https://') && !urlInText.startsWith('www.')) { - return match.group(0)!; - } - final fullUrl = urlInText.startsWith('www.') ? 'https://$urlInText' : urlInText; - return '[$urlInText]($fullUrl)'; - }); - - final linkRegex = RegExp(r'\[([^\]]+)\]\(([^\)]+)\)'); - final existingLinks = <_LinkRange>[]; - for (final linkMatch in linkRegex.allMatches(details)) { - existingLinks.add(_LinkRange(linkMatch.start, linkMatch.end)); - } - final urlRegex = RegExp(r'(https?://[^\s\)]+|www\.[^\s\)]+)', caseSensitive: false); - String result = details; - int offset = 0; - for (final urlMatch in urlRegex.allMatches(details)) { - bool isInsideLink = existingLinks.any((link) => - urlMatch.start >= link.start && urlMatch.end <= link.end); - if (!isInsideLink) { - final url = urlMatch.group(0)!; - final fullUrl = url.startsWith('www.') ? 'https://$url' : url; - final replacement = '[$url]($fullUrl)'; - result = result.replaceRange( - urlMatch.start + offset, - urlMatch.end + offset, - replacement, - ); - offset += replacement.length - url.length; - } - } - details = result; - // Гарантируем, что жирный текст будет распознан - final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); - details = details.replaceAllMapped(boldRegex, (match) { - return '${match.group(1)}'; - }); - - return Html( - data: md.markdownToHtml( - details, - extensionSet: md.ExtensionSet.gitHubFlavored, - ), - style: { - "body": Style( - margin: Margins.zero, - padding: HtmlPaddings.zero, - fontSize: FontSize(TextStyles.textSMedium.fontSize ?? 14), - lineHeight: const LineHeight(1.5), - ), - "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), - "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black), - "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), - }, - onLinkTap: (url, attributes, element) async { - if (url != null) { - final uri = Uri.parse(url); - if (await canLaunchUrl(uri)) { - await launchUrl(uri, mode: LaunchMode.externalApplication); - } - } - }, + return MarkdownHtmlWidget( + markdownText: details, + fontSize: TextStyles.textSMedium.fontSize ?? 14, + textColor: appTheme.black, ); }, ), @@ -331,8 +246,3 @@ class _MyDietWidgetState extends State { } } -class _LinkRange { - final int start; - final int end; - _LinkRange(this.start, this.end); -} diff --git a/lib/features/my_plans/presentation/widgets/my_plan_widget.dart b/lib/features/my_plans/presentation/widgets/my_plan_widget.dart index 5a53d76c..6c006f34 100644 --- a/lib/features/my_plans/presentation/widgets/my_plan_widget.dart +++ b/lib/features/my_plans/presentation/widgets/my_plan_widget.dart @@ -14,12 +14,10 @@ import 'package:eatvio_app/features/my_plans/presentation/cubit/my_plans_state.d import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_html/flutter_html.dart'; +import 'package:eatvio_app/core/widgets/markdown_html_widget.dart'; // Removed SVG icon usage after switching to text buttons import 'package:go_router/go_router.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:markdown/markdown.dart' as md; -import 'package:url_launcher/url_launcher.dart'; class MyPlanWidget extends StatefulWidget { final PlanModel plan; @@ -78,94 +76,11 @@ class _MyPlanWidgetState extends State { String details = widget.plan.details.length > 200 ? '${widget.plan.details.substring(0, 200)}...' : widget.plan.details; - // Автоматически преобразуем URL в markdown ссылки - // Сначала исправляем неправильный синтаксис markdown ссылок - final wrongLinkRegex = RegExp(r'\[(https?://[^\]]+|www\.[^\]]+)\]\(([^\)]+)\)'); - details = details.replaceAllMapped(wrongLinkRegex, (match) { - final urlInText = match.group(1)!; - if (!urlInText.startsWith('http://') && !urlInText.startsWith('https://') && !urlInText.startsWith('www.')) { - return match.group(0)!; - } - final fullUrl = urlInText.startsWith('www.') ? 'https://$urlInText' : urlInText; - return '[$urlInText]($fullUrl)'; - }); - - final linkRegex = RegExp(r'\[([^\]]+)\]\(([^\)]+)\)'); - final existingLinks = <_LinkRange>[]; - for (final linkMatch in linkRegex.allMatches(details)) { - existingLinks.add(_LinkRange(linkMatch.start, linkMatch.end)); - } - final urlRegex = RegExp(r'(https?://[^\s\)]+|www\.[^\s\)]+)', caseSensitive: false); - String result = details; - int offset = 0; - for (final urlMatch in urlRegex.allMatches(details)) { - bool isInsideLink = existingLinks.any((link) => - urlMatch.start >= link.start && urlMatch.end <= link.end); - if (!isInsideLink) { - final url = urlMatch.group(0)!; - final fullUrl = url.startsWith('www.') ? 'https://$url' : url; - final replacement = '[$url]($fullUrl)'; - result = result.replaceRange( - urlMatch.start + offset, - urlMatch.end + offset, - replacement, - ); - offset += replacement.length - url.length; - } - } - details = result; - // Гарантируем, что жирный текст будет распознан - final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); - details = details.replaceAllMapped(boldRegex, (match) { - return '${match.group(1)}'; - }); - - return Html( - data: md.markdownToHtml( - details, - extensionSet: md.ExtensionSet.gitHubFlavored, - ), - style: { - "body": Style( - margin: Margins.zero, - padding: HtmlPaddings.zero, - fontSize: FontSize(TextStyles.textSMedium.fontSize ?? 14), - lineHeight: const LineHeight(1.5), - ), - "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), - "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black), - "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), - }, - onLinkTap: (url, attributes, element) async { - if (url != null) { - final uri = Uri.parse(url); - if (await canLaunchUrl(uri)) { - await launchUrl(uri, mode: LaunchMode.externalApplication); - } - } - }, + return MarkdownHtmlWidget( + markdownText: details, + fontSize: TextStyles.textSMedium.fontSize ?? 14, + textColor: appTheme.black, ); }, ), @@ -276,8 +191,3 @@ class _MyPlanWidgetState extends State { } } -class _LinkRange { - final int start; - final int end; - _LinkRange(this.start, this.end); -} diff --git a/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart b/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart index 43f05f43..e0e5cd01 100644 --- a/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart +++ b/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart @@ -13,10 +13,9 @@ import 'package:eatvio_app/features/profile/presentation/bloc/profile_cubit/prof import 'package:eatvio_app/features/profile/presentation/bloc/profile_cubit/profile_state.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_html/flutter_html.dart'; +import 'package:eatvio_app/core/widgets/markdown_html_widget.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; -import 'package:markdown/markdown.dart' as md; import 'package:share_plus/share_plus.dart'; class ProfileBlogPostWidget extends StatefulWidget { @@ -144,47 +143,10 @@ class _ProfileBlogPostWidgetState extends State { description = description.substring(0, cutPoint); } - // Гарантируем, что жирный текст будет распознан - final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); - description = description.replaceAllMapped(boldRegex, (match) { - return '${match.group(1)}'; - }); - - // Конвертируем markdown в HTML - String htmlData = md.markdownToHtml( - description, - extensionSet: md.ExtensionSet.gitHubFlavored, - ); - - return Html( - data: htmlData, - style: { - "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5), color: Colors.black87), - "p": Style(margin: Margins.only(bottom: 12), color: Colors.black87), - "b, strong": Style(fontWeight: FontWeight.bold, color: Colors.black), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: Colors.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: Colors.black87), - "strong, b": Style(fontWeight: FontWeight.bold, color: Colors.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), - }, + return MarkdownHtmlWidget( + markdownText: description, + fontSize: 16, + textColor: Colors.black87, ); }, ), diff --git a/lib/features/recipe/presentation/pages/about_recipe_screen.dart b/lib/features/recipe/presentation/pages/about_recipe_screen.dart index b74a4201..a5448a86 100644 --- a/lib/features/recipe/presentation/pages/about_recipe_screen.dart +++ b/lib/features/recipe/presentation/pages/about_recipe_screen.dart @@ -146,7 +146,7 @@ class _AboutRecipeScreenState extends State { // убираем true, чтобы padding учитывался корректно contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), // вертикальный паддинг увеличен - hintText: 'Комментарий', + hintText: s.comment_hint, hintStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, height: 1.2, color: Color(0xFFAEAEB2)), filled: true, border: OutlineInputBorder( diff --git a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart index e253756d..c30aebc1 100644 --- a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart +++ b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart @@ -12,12 +12,10 @@ import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/m import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_html/flutter_html.dart'; +import 'package:eatvio_app/core/widgets/markdown_html_widget.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; -import 'package:markdown/markdown.dart' as md; import 'package:share_plus/share_plus.dart'; -import 'package:url_launcher/url_launcher.dart'; class MyRecipeWidget extends StatefulWidget { final MyRecipeModel recipe; @@ -100,94 +98,11 @@ class _MyRecipeWidgetState extends State { String description = widget.recipe.description.length > 200 ? '${widget.recipe.description.substring(0, 200)}...' : widget.recipe.description; - // Автоматически преобразуем URL в markdown ссылки - // Сначала исправляем неправильный синтаксис markdown ссылок - final wrongLinkRegex = RegExp(r'\[(https?://[^\]]+|www\.[^\]]+)\]\(([^\)]+)\)'); - description = description.replaceAllMapped(wrongLinkRegex, (match) { - final urlInText = match.group(1)!; - if (!urlInText.startsWith('http://') && !urlInText.startsWith('https://') && !urlInText.startsWith('www.')) { - return match.group(0)!; - } - final fullUrl = urlInText.startsWith('www.') ? 'https://$urlInText' : urlInText; - return '[$urlInText]($fullUrl)'; - }); - - final linkRegex = RegExp(r'\[([^\]]+)\]\(([^\)]+)\)'); - final existingLinks = <_LinkRange>[]; - for (final linkMatch in linkRegex.allMatches(description)) { - existingLinks.add(_LinkRange(linkMatch.start, linkMatch.end)); - } - final urlRegex = RegExp(r'(https?://[^\s\)]+|www\.[^\s\)]+)', caseSensitive: false); - String result = description; - int offset = 0; - for (final urlMatch in urlRegex.allMatches(description)) { - bool isInsideLink = existingLinks.any((link) => - urlMatch.start >= link.start && urlMatch.end <= link.end); - if (!isInsideLink) { - final url = urlMatch.group(0)!; - final fullUrl = url.startsWith('www.') ? 'https://$url' : url; - final replacement = '[$url]($fullUrl)'; - result = result.replaceRange( - urlMatch.start + offset, - urlMatch.end + offset, - replacement, - ); - offset += replacement.length - url.length; - } - } - description = result; - // Гарантируем, что жирный текст будет распознан - final boldRegex = RegExp(r'\*\*([^*]+)\*\*'); - description = description.replaceAllMapped(boldRegex, (match) { - return '${match.group(1)}'; - }); - - return Html( - data: md.markdownToHtml( - description, - extensionSet: md.ExtensionSet.gitHubFlavored, - ), - style: { - "body": Style( - margin: Margins.zero, - padding: HtmlPaddings.zero, - fontSize: FontSize(TextStyles.textSMedium.fontSize ?? 14), - lineHeight: const LineHeight(1.5), - ), - "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black), - "b, strong": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold), - "h1": Style(fontSize: FontSize(24)), - "h2": Style(fontSize: FontSize(20)), - "h3": Style(fontSize: FontSize(18)), - "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)), - "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black), - "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black), - "em, i": Style(fontStyle: FontStyle.italic), - "code": Style( - backgroundColor: Colors.grey.shade100, - padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2), - fontFamily: 'monospace', - ), - "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)), - "blockquote": Style( - padding: HtmlPaddings.only(left: 16), - margin: Margins.only(left: 8, bottom: 12), - fontStyle: FontStyle.italic, - color: Colors.grey.shade700, - ), - "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline), - "img": Style(width: Width(MediaQuery.of(context).size.width - 32)), - }, - onLinkTap: (url, attributes, element) async { - if (url != null) { - final uri = Uri.parse(url); - if (await canLaunchUrl(uri)) { - await launchUrl(uri, mode: LaunchMode.externalApplication); - } - } - }, + return MarkdownHtmlWidget( + markdownText: description, + fontSize: TextStyles.textSMedium.fontSize ?? 14, + textColor: appTheme.black, ); }, ), @@ -278,8 +193,3 @@ class _MyRecipeWidgetState extends State { } } -class _LinkRange { - final int start; - final int end; - _LinkRange(this.start, this.end); -} From c0032f7a955f7b451ed68ee4fffdfaab225404c5 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Wed, 14 Jan 2026 16:09:07 +0300 Subject: [PATCH 08/10] feat: enhance Firebase messaging error logging and simplify BottomNavigationBarWidget by removing profileModel dependency --- lib/core/app_initializer.dart | 2 + lib/core/firebase_api.dart | 1 + lib/core/routing/main_navigation_routes.dart | 9 +- .../widgets/bottom_navigation_bar_widget.dart | 247 +++++++++--------- .../feed/presentation/pages/feed_screen.dart | 4 +- .../bottom_navigation_bar_widget_test.dart | 18 +- 6 files changed, 152 insertions(+), 129 deletions(-) diff --git a/lib/core/app_initializer.dart b/lib/core/app_initializer.dart index 193aa7e3..6af9865f 100644 --- a/lib/core/app_initializer.dart +++ b/lib/core/app_initializer.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:developer'; import 'dart:io' as io; import 'package:eatvio_app/core/app_config.dart'; import 'package:eatvio_app/core/env_config.dart'; @@ -51,6 +52,7 @@ class AppInitializer { ); } catch (e) { // Разрешение не критично, продолжаем работу + log('Failed to request Firebase messaging permission: $e'); } } } diff --git a/lib/core/firebase_api.dart b/lib/core/firebase_api.dart index 887b7137..a96aa9d5 100644 --- a/lib/core/firebase_api.dart +++ b/lib/core/firebase_api.dart @@ -32,6 +32,7 @@ class FirebaseApi { ); } catch (e) { // Разрешение не критично, продолжаем + log('Failed to request Firebase messaging permission: $e'); } } token = await _firebaseMessaging.getToken().timeout( diff --git a/lib/core/routing/main_navigation_routes.dart b/lib/core/routing/main_navigation_routes.dart index d6a4978e..88a8db04 100644 --- a/lib/core/routing/main_navigation_routes.dart +++ b/lib/core/routing/main_navigation_routes.dart @@ -32,14 +32,7 @@ class MainNavigationRoutes { }); } - return BlocBuilder( - builder: (BuildContext context, ProfileAvatarState state) { - if (state is ProfileAvatarStateLoaded) { - return BottomNavigationBarWidget(profileModel: state.profile, child: child); - } - return const SizedBox.shrink(); - }, - ); + return BottomNavigationBarWidget(child: child); }, routes: [ GoRoute( diff --git a/lib/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart b/lib/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart index b1e846ca..f177d57a 100644 --- a/lib/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart +++ b/lib/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart @@ -5,7 +5,8 @@ import 'package:eatvio_app/core/utils/image_constant.dart'; import 'package:eatvio_app/features/dev_tools/presentation/dev_tools_screen.dart'; import 'package:eatvio_app/features/notifications/presentation/notifications_cubit/notifications_cubit.dart'; import 'package:eatvio_app/features/notifications/presentation/notifications_cubit/notifications_state.dart'; -import 'package:eatvio_app/features/profile/models/profile_model.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_state.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chats_cubit/chats_cubit.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chats_cubit/chats_state.dart'; import 'package:eatvio_app/generated/l10n.dart'; @@ -16,13 +17,11 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; class BottomNavigationBarWidget extends StatefulWidget { - final ProfileModel profileModel; final Widget child; const BottomNavigationBarWidget({ super.key, required this.child, - required this.profileModel, }); @override @@ -31,15 +30,12 @@ class BottomNavigationBarWidget extends StatefulWidget { class _BottomNavigationBarWidgetState extends State { int currentBottomNavBarIndex = 1; - late final List pages; + List? pages; int tapsCount = 0; - @override - void initState() { - super.initState(); - - if (widget.profileModel.roles.contains('consultant')) { - pages = [ + List _getPages(bool isConsultant) { + if (isConsultant) { + return [ '/my-profile-screen', '/feed-screen', '/diary-screen', @@ -49,7 +45,7 @@ class _BottomNavigationBarWidgetState extends State { '/menu-screen', ]; } else { - pages = [ + return [ '/my-profile-screen', '/feed-screen', '/diary-screen', @@ -61,7 +57,8 @@ class _BottomNavigationBarWidgetState extends State { } void _onItemTapped(int index) async { - if (pages.length == 7) { + if (pages == null) return; + if (pages!.length == 7) { if (index == 6) { tapsCount++; if (tapsCount == 7) { @@ -82,108 +79,117 @@ class _BottomNavigationBarWidgetState extends State { setState(() { currentBottomNavBarIndex = index; }); - GoRouter.of(context).replace(pages[currentBottomNavBarIndex]); + GoRouter.of(context).replace(pages![currentBottomNavBarIndex]); } } @override Widget build(BuildContext context) { final s = S.of(context); - return Scaffold( - body: widget.child, - bottomNavigationBar: BottomNavigationBar( - type: BottomNavigationBarType.fixed, - onTap: _onItemTapped, - selectedFontSize: 10, - unselectedFontSize: 10, - selectedItemColor: appTheme.blueA400, - currentIndex: currentBottomNavBarIndex, - items: [ - BottomNavigationBarItem( - label: '', - icon: CircleAvatar( - foregroundImage: NetworkImage( - widget.profileModel.profilePhotoUrl.contains('https') ? widget.profileModel.profilePhotoUrl : sl().baseUrl + widget.profileModel.profilePhotoUrl, - ), - backgroundImage: const AssetImage('assets/images/no_avatar.png'), - radius: 16, - ), - ), - BottomNavigationBarItem( - label: 'Лента', - icon: Padding( - padding: const EdgeInsets.only(bottom: 2), - child: SvgPicture.asset( - colorFilter: const ColorFilter.mode(Colors.grey, BlendMode.srcIn), - width: 20, - height: 20, - ImageConstant.icnFeed, - ), - ), - activeIcon: Padding( - padding: const EdgeInsets.only(bottom: 2), - child: SvgPicture.asset( - ImageConstant.icnFeed, - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - appTheme.blueA400, - BlendMode.srcIn, - ), - ), - ), - ), - BottomNavigationBarItem( - label: s.diary, - icon: Padding( - padding: const EdgeInsets.only(bottom: 2), - child: SvgPicture.asset( - colorFilter: const ColorFilter.mode(Colors.grey, BlendMode.srcIn), - ImageConstant.icnDiary, - width: 20, - height: 20, - ), - ), - activeIcon: Padding( - padding: const EdgeInsets.only(bottom: 2), - child: SvgPicture.asset( - ImageConstant.icnDiary, - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - appTheme.blueA400, - BlendMode.srcIn, - ), - ), - ), - ), - if (widget.profileModel.roles.contains('consultant')) - BottomNavigationBarItem( - label: 'Консультации', - icon: Padding( - padding: const EdgeInsets.only(bottom: 2), - child: SvgPicture.asset( - colorFilter: const ColorFilter.mode(Colors.grey, BlendMode.srcIn), - 'assets/icons/consultations.svg', - width: 20, - height: 20, - ), - ), - activeIcon: Padding( - padding: const EdgeInsets.only(bottom: 2), - child: SvgPicture.asset( - 'assets/icons/consultations.svg', - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - appTheme.blueA400, - BlendMode.srcIn, + return BlocBuilder( + builder: (BuildContext context, ProfileAvatarState state) { + if (state is ProfileAvatarStateLoaded) { + final profileModel = state.profile; + final isConsultant = profileModel.roles.contains('consultant'); + + // Инициализируем pages на основе profileModel + pages ??= _getPages(isConsultant); + + return Scaffold( + body: widget.child, + bottomNavigationBar: BottomNavigationBar( + type: BottomNavigationBarType.fixed, + onTap: _onItemTapped, + selectedFontSize: 10, + unselectedFontSize: 10, + selectedItemColor: appTheme.blueA400, + currentIndex: currentBottomNavBarIndex, + items: [ + BottomNavigationBarItem( + label: '', + icon: CircleAvatar( + foregroundImage: NetworkImage( + profileModel.profilePhotoUrl.contains('https') ? profileModel.profilePhotoUrl : sl().baseUrl + profileModel.profilePhotoUrl, + ), + backgroundImage: const AssetImage('assets/images/no_avatar.png'), + radius: 16, ), ), + BottomNavigationBarItem( + label: 'Лента', + icon: Padding( + padding: const EdgeInsets.only(bottom: 2), + child: SvgPicture.asset( + colorFilter: const ColorFilter.mode(Colors.grey, BlendMode.srcIn), + width: 20, + height: 20, + ImageConstant.icnFeed, ), ), - BottomNavigationBarItem( - label: s.chat, + activeIcon: Padding( + padding: const EdgeInsets.only(bottom: 2), + child: SvgPicture.asset( + ImageConstant.icnFeed, + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + appTheme.blueA400, + BlendMode.srcIn, + ), + ), + ), + ), + BottomNavigationBarItem( + label: s.diary, + icon: Padding( + padding: const EdgeInsets.only(bottom: 2), + child: SvgPicture.asset( + colorFilter: const ColorFilter.mode(Colors.grey, BlendMode.srcIn), + ImageConstant.icnDiary, + width: 20, + height: 20, + ), + ), + activeIcon: Padding( + padding: const EdgeInsets.only(bottom: 2), + child: SvgPicture.asset( + ImageConstant.icnDiary, + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + appTheme.blueA400, + BlendMode.srcIn, + ), + ), + ), + ), + if (profileModel.roles.contains('consultant')) + BottomNavigationBarItem( + label: 'Консультации', + icon: Padding( + padding: const EdgeInsets.only(bottom: 2), + child: SvgPicture.asset( + colorFilter: const ColorFilter.mode(Colors.grey, BlendMode.srcIn), + 'assets/icons/consultations.svg', + width: 20, + height: 20, + ), + ), + activeIcon: Padding( + padding: const EdgeInsets.only(bottom: 2), + child: SvgPicture.asset( + 'assets/icons/consultations.svg', + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + appTheme.blueA400, + BlendMode.srcIn, + ), + ), + ), + ), + BottomNavigationBarItem( + label: s.chat, icon: BlocBuilder( builder: (BuildContext context, ChatsState state) { final hasUnreadMessages = state.chatsWithUnreadMessagesCount > 0; @@ -206,7 +212,7 @@ class _BottomNavigationBarWidgetState extends State { ImageConstant.icnChat, width: 20, height: 20, - colorFilter: pages[currentBottomNavBarIndex] == '/chat-select-screen' + colorFilter: pages![currentBottomNavBarIndex] == '/chat-select-screen' ? ColorFilter.mode( appTheme.blueA400, BlendMode.srcIn, @@ -217,9 +223,9 @@ class _BottomNavigationBarWidgetState extends State { ); }, ), - ), - BottomNavigationBarItem( - label: 'Уведомления', + ), + BottomNavigationBarItem( + label: 'Уведомления', icon: BlocBuilder( builder: (BuildContext context, NotificationsState state) { return badges.Badge( @@ -237,7 +243,7 @@ class _BottomNavigationBarWidgetState extends State { padding: const EdgeInsets.only(bottom: 2), child: SvgPicture.asset( ImageConstant.icnBell, - colorFilter: pages[currentBottomNavBarIndex] == '/notifications-screen' + colorFilter: pages![currentBottomNavBarIndex] == '/notifications-screen' ? ColorFilter.mode( appTheme.blueA400, BlendMode.srcIn, @@ -251,15 +257,22 @@ class _BottomNavigationBarWidgetState extends State { }, ), ), - BottomNavigationBarItem( - label: '', - icon: SvgPicture.asset( - ImageConstant.imgLogo, - height: 32, + BottomNavigationBarItem( + label: '', + icon: SvgPicture.asset( + ImageConstant.imgLogo, + height: 32, + ), + ), + ], ), - ), - ], - ), + ); + } + // Показываем child даже когда профиль еще загружается, чтобы экраны могли инициализироваться + return Scaffold( + body: widget.child, + ); + }, ); } } diff --git a/lib/features/feed/presentation/pages/feed_screen.dart b/lib/features/feed/presentation/pages/feed_screen.dart index 0c9dca9d..ebf116df 100644 --- a/lib/features/feed/presentation/pages/feed_screen.dart +++ b/lib/features/feed/presentation/pages/feed_screen.dart @@ -77,9 +77,11 @@ class _FeedScreenContentState extends State { _checkRegistrationDate(context); // Инициализация глобальных кубитов при первом открытии экрана WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; final feedCubit = context.read(); final state = feedCubit.state; - if (state is! FeedStateLoaded && state is! FeedStateLoading) { + // Загружаем данные, если они еще не загружены + if (state is! FeedStateLoaded) { feedCubit.loadFeedBlogPostList(); } }); diff --git a/test/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget_test.dart b/test/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget_test.dart index b88cc940..721af4b3 100644 --- a/test/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget_test.dart +++ b/test/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget_test.dart @@ -2,6 +2,8 @@ import 'package:eatvio_app/core/app_config.dart'; import 'package:eatvio_app/core/app_initializer.dart'; import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart'; +import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_state.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chats_cubit/chats_cubit.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chats_cubit/chats_state.dart'; @@ -20,7 +22,7 @@ import 'package:network_image_mock/network_image_mock.dart'; import 'bottom_navigation_bar_widget_test.mocks.dart'; -@GenerateNiceMocks([MockSpec(), MockSpec()]) +@GenerateNiceMocks([MockSpec(), MockSpec(), MockSpec()]) void main() { group('BottomNavigationBarWidget smoke', () { setUpAll(() async { @@ -86,6 +88,7 @@ void main() { mockNetworkImagesFor(() async { final notificationsCubit = MockNotificationsCubit(); final chatsCubit = MockChatsCubit(); + final profileAvatarCubit = MockProfileAvatarCubit(); when(notificationsCubit.state).thenReturn(const NotificationsState()); when(notificationsCubit.stream).thenAnswer((_) => const Stream.empty()); @@ -93,16 +96,20 @@ void main() { when(chatsCubit.state).thenReturn(ChatsState()); when(chatsCubit.stream).thenAnswer((_) => const Stream.empty()); when(chatsCubit.close()).thenAnswer((_) async => Future.value()); + when(profileAvatarCubit.state).thenReturn(const ProfileAvatarState.loaded(profile: mockUserProfile)); + when(profileAvatarCubit.stream).thenAnswer((_) => const Stream.empty()); + when(profileAvatarCubit.close()).thenAnswer((_) async => Future.value()); await tester.pumpWidget( MultiBlocProvider( providers: [ BlocProvider.value(value: notificationsCubit), BlocProvider.value(value: chatsCubit), + BlocProvider.value(value: profileAvatarCubit), ], child: wrap( const Scaffold( - body: BottomNavigationBarWidget(profileModel: mockUserProfile, child: Text('Test Content')), + body: BottomNavigationBarWidget(child: Text('Test Content')), ), ), ), @@ -117,6 +124,7 @@ void main() { mockNetworkImagesFor(() async { final notificationsCubit = MockNotificationsCubit(); final chatsCubit = MockChatsCubit(); + final profileAvatarCubit = MockProfileAvatarCubit(); when(notificationsCubit.state).thenReturn(const NotificationsState()); when(notificationsCubit.stream).thenAnswer((_) => const Stream.empty()); @@ -124,16 +132,20 @@ void main() { when(chatsCubit.state).thenReturn(ChatsState()); when(chatsCubit.stream).thenAnswer((_) => const Stream.empty()); when(chatsCubit.close()).thenAnswer((_) async => Future.value()); + when(profileAvatarCubit.state).thenReturn(const ProfileAvatarState.loaded(profile: mockConsultantProfile)); + when(profileAvatarCubit.stream).thenAnswer((_) => const Stream.empty()); + when(profileAvatarCubit.close()).thenAnswer((_) async => Future.value()); await tester.pumpWidget( MultiBlocProvider( providers: [ BlocProvider.value(value: notificationsCubit), BlocProvider.value(value: chatsCubit), + BlocProvider.value(value: profileAvatarCubit), ], child: wrap( const Scaffold( - body: BottomNavigationBarWidget(profileModel: mockConsultantProfile, child: Text('Test Content')), + body: BottomNavigationBarWidget(child: Text('Test Content')), ), ), ), From d3c8034b8f8598798fb8afffa20e221fde6624b6 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Mon, 19 Jan 2026 16:00:30 +0300 Subject: [PATCH 09/10] feat: Implement glossary moderation, notifications, product modals, social authentication, and internationalization. --- lib/core/app_initializer.dart | 8 +- lib/features/auth/sdk/social_auth_facade.dart | 22 +- .../widgets/add_product_modal.dart | 5 + .../widgets/chosen_plan_widget.dart | 50 +- ...ssary_moderation_request_modal_widget.dart | 47 +- .../presentation/notifications_screen.dart | 2 +- lib/generated/intl/messages_all.dart | 23 +- lib/generated/intl/messages_en.dart | 1383 +++++++++++------ lib/generated/intl/messages_ru.dart | 580 ++++--- lib/generated/l10n.dart | 1118 +++---------- lib/l10n/intl_en.arb | 1 + lib/l10n/intl_ru.arb | 1 + pubspec.yaml | 1 + 13 files changed, 1557 insertions(+), 1684 deletions(-) diff --git a/lib/core/app_initializer.dart b/lib/core/app_initializer.dart index 6af9865f..a4e91210 100644 --- a/lib/core/app_initializer.dart +++ b/lib/core/app_initializer.dart @@ -47,9 +47,7 @@ class AppInitializer { ); if (sl().buildType == AppBuildType.prod) { try { - await FirebaseMessaging.instance.requestPermission().timeout( - const Duration(seconds: 5), - ); + await FirebaseMessaging.instance.requestPermission().timeout(const Duration(seconds: 5)); } catch (e) { // Разрешение не критично, продолжаем работу log('Failed to request Firebase messaging permission: $e'); @@ -82,6 +80,10 @@ class AppInitializer { options.tracesSampleRate = 1.0; options.debug = false; }, appRunner: appRunner); + FlutterError.onError = (details) async { + if (kDebugMode) return; + await Sentry.captureException(details.exception, stackTrace: details.stack); + }; } } diff --git a/lib/features/auth/sdk/social_auth_facade.dart b/lib/features/auth/sdk/social_auth_facade.dart index 4d2e9745..da6bed80 100644 --- a/lib/features/auth/sdk/social_auth_facade.dart +++ b/lib/features/auth/sdk/social_auth_facade.dart @@ -8,6 +8,7 @@ import 'package:eatvio_app/features/auth/models/yandex_profile_model.dart'; import 'package:flutter/material.dart'; import 'package:eatvio_app/core/app_router.dart'; import 'package:eatvio_app/core/env_config.dart'; +import 'package:eatvio_app/generated/l10n.dart'; import 'package:go_router/go_router.dart'; import 'package:http/http.dart' as http; import 'package:vk_id/vk_id.dart'; @@ -255,8 +256,9 @@ class SocialAuthFacade { if (!context.mounted) return null; return showDialog>( context: context, - barrierDismissible: false, - builder: (_) { + barrierDismissible: true, + builder: (dialogContext) { + final s = S.of(dialogContext); const borderRadius = BorderRadius.all(Radius.circular(16)); return Dialog( insetPadding: const EdgeInsets.all(16), @@ -264,7 +266,21 @@ class SocialAuthFacade { elevation: 0, child: ClipRRect( borderRadius: borderRadius, - child: SizedBox(height: 560, child: WebViewWidget(controller: controller)), + child: SizedBox( + height: MediaQuery.of(context).size.height * 0.7, + child: Scaffold( + appBar: AppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () { + Navigator.of(dialogContext).pop(); + }, + ), + title: Text(s.authorization), + ), + body: Expanded(child: WebViewWidget(controller: controller)), + ), + ), ), ); }, diff --git a/lib/features/diary/presentation/widgets/add_product_modal.dart b/lib/features/diary/presentation/widgets/add_product_modal.dart index cf40281c..335fdb33 100644 --- a/lib/features/diary/presentation/widgets/add_product_modal.dart +++ b/lib/features/diary/presentation/widgets/add_product_modal.dart @@ -165,6 +165,11 @@ class _AddProductModalState extends State { if (widget.portion != null) const SizedBox(width: 8), InkWell( onTap: () { + // Автоматически выбираем первый элемент, если текст точно совпадает + if (selectedGlossary == null && glossariesList.isNotEmpty && productNameController.text.trim() == glossariesList[0].name) { + selectedGlossary = glossariesList[0]; + } + if (widget.portion == null) { widget.diaryCubit.addProductToMeal( diaryId: widget.state.diary.id, diff --git a/lib/features/diary/presentation/widgets/chosen_plan_widget.dart b/lib/features/diary/presentation/widgets/chosen_plan_widget.dart index 30ce656c..d8c51ba9 100644 --- a/lib/features/diary/presentation/widgets/chosen_plan_widget.dart +++ b/lib/features/diary/presentation/widgets/chosen_plan_widget.dart @@ -11,55 +11,53 @@ class ChosenPlanWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder(builder: (context, state) { - if (state is DiaryStateLoaded) { - if (state.diary.typeOfDiary.hasChosenPlan) { - return ChosenPlanWidgetContent( - currentPlanDay: state.chosenPlanCurrentDay ?? 0, - planName: state.chosenPlanName ?? '', - planDuration: state.chosenPlanDuration ?? 0, - ); + return BlocBuilder( + builder: (context, state) { + if (state is DiaryStateLoaded) { + if (state.diary.typeOfDiary.hasChosenPlan) { + return ChosenPlanWidgetContent( + currentPlanDay: state.chosenPlanCurrentDay ?? 0, + planName: state.chosenPlanName ?? '', + planDuration: state.chosenPlanDuration ?? 0, + ); + } } - } - return const SizedBox.shrink(); - }); + return const SizedBox.shrink(); + }, + ); } } class ChosenPlanWidgetContent extends StatelessWidget { - const ChosenPlanWidgetContent({ - super.key, - required this.currentPlanDay, - required this.planName, - required this.planDuration, - }); + const ChosenPlanWidgetContent({super.key, required this.currentPlanDay, required this.planName, required this.planDuration}); final int currentPlanDay; final String planName; final int planDuration; @override Widget build(BuildContext context) { - final size = MediaQuery.sizeOf(context); final s = S.of(context); return Column( children: [ Row( children: [ - SizedBox( - width: size.width * 0.4, - child: Text(planName, style: TextStyles.textLMedium.copyWith(color: appTheme.black)), + Expanded( + child: Text( + planName, + style: TextStyles.textLMedium.copyWith(color: appTheme.black), + softWrap: true, + overflow: TextOverflow.visible, + ), ), - const Spacer(), + const SizedBox(width: 8), Container( decoration: BoxDecoration(color: appTheme.dividerColor, borderRadius: BorderRadius.circular(12)), padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), child: Text('${s.day} $currentPlanDay из $planDuration', style: TextStyles.textMSemibold.copyWith(color: appTheme.gray)), - ) + ), ], ), - const SizedBox( - height: 16, - ) + const SizedBox(height: 16), ], ); } diff --git a/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart b/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart index c9359cd9..a48e1fca 100644 --- a/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart +++ b/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart @@ -48,6 +48,19 @@ class _GlossaryModerationRequestModalWidgetState extends State { ), ], ) - : const Placeholder(), + : const SizedBox(), ); }, ); diff --git a/lib/generated/intl/messages_all.dart b/lib/generated/intl/messages_all.dart index e3c9099c..3139e159 100644 --- a/lib/generated/intl/messages_all.dart +++ b/lib/generated/intl/messages_all.dart @@ -11,6 +11,7 @@ import 'dart:async'; +import 'package:flutter/foundation.dart'; import 'package:intl/intl.dart'; import 'package:intl/message_lookup_by_library.dart'; import 'package:intl/src/intl_helpers.dart'; @@ -20,8 +21,8 @@ import 'messages_ru.dart' as messages_ru; typedef Future LibraryLoader(); Map _deferredLibraries = { - 'en': () => new Future.value(null), - 'ru': () => new Future.value(null), + 'en': () => new SynchronousFuture(null), + 'ru': () => new SynchronousFuture(null), }; MessageLookupByLibrary? _findExact(String localeName) { @@ -36,19 +37,20 @@ MessageLookupByLibrary? _findExact(String localeName) { } /// User programs should call this before using [localeName] for messages. -Future initializeMessages(String localeName) async { +Future initializeMessages(String localeName) { var availableLocale = Intl.verifiedLocale( localeName, (locale) => _deferredLibraries[locale] != null, - onFailure: (_) => null); + onFailure: (_) => null, + ); if (availableLocale == null) { - return new Future.value(false); + return new SynchronousFuture(false); } var lib = _deferredLibraries[availableLocale]; - await (lib == null ? new Future.value(false) : lib()); + lib == null ? new SynchronousFuture(false) : lib(); initializeInternalMessageLookup(() => new CompositeMessageLookup()); messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor); - return new Future.value(true); + return new SynchronousFuture(true); } bool _messagesExistFor(String locale) { @@ -60,8 +62,11 @@ bool _messagesExistFor(String locale) { } MessageLookupByLibrary? _findGeneratedMessagesFor(String locale) { - var actualLocale = Intl.verifiedLocale(locale, _messagesExistFor, - onFailure: (_) => null); + var actualLocale = Intl.verifiedLocale( + locale, + _messagesExistFor, + onFailure: (_) => null, + ); if (actualLocale == null) return null; return _findExact(actualLocale); } diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart index c9b03cf4..16274f16 100644 --- a/lib/generated/intl/messages_en.dart +++ b/lib/generated/intl/messages_en.dart @@ -7,7 +7,8 @@ // 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 +// 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'; @@ -19,496 +20,916 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'en'; - static m0(date) => "Консультант прокомментировал день ${date}"; + static String m0(date) => "Консультант прокомментировал день ${date}"; - static m1(planName) => "План «${planName}» начался"; + static String m1(planName) => "План «${planName}» начался"; - static m2(planName, name) => "План «${planName}» с пользователем ${name} начался"; + static String m2(planName, name) => + "План «${planName}» с пользователем ${name} начался"; - static m3(step) => "шаг ${step} из 2"; + static String m3(step) => "шаг ${step} из 2"; - static m4(planName, name) => "Завтра начинается план «${planName}» с пользователем ${name}"; + static String m4(planName, name) => + "Завтра начинается план «${planName}» с пользователем ${name}"; - static m5(planName) => "Завтра начнется прохождение плана «${planName}»"; + static String m5(planName) => + "Завтра начнется прохождение плана «${planName}»"; - static m6(name, planName) => "Пользователь ${name} отменил подписку на план «${planName}»"; + static String m6(name, planName) => + "Пользователь ${name} отменил подписку на план «${planName}»"; - static m7(name, planName) => "Пользователь ${name} оплатил план «${planName}»"; + static String m7(name, planName) => + "Пользователь ${name} оплатил план «${planName}»"; - static m8(name, planName) => "Пользователь ${name} подписался на план «${planName}»"; + static String m8(name, planName) => + "Пользователь ${name} подписался на план «${planName}»"; - static m9(planName) => "Вы отменили подписку на план «${planName}»"; + static String m9(planName) => "Вы отменили подписку на план «${planName}»"; final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "Moscow" : MessageLookupByLibrary.simpleMessage("Москва"), - "Russia" : MessageLookupByLibrary.simpleMessage("Россия"), - "about_diet" : MessageLookupByLibrary.simpleMessage("Об этой диете"), - "about_plan" : MessageLookupByLibrary.simpleMessage("Об этом плане"), - "about_recipe" : MessageLookupByLibrary.simpleMessage("Об этом рецепте"), - "acc_has_been_created" : MessageLookupByLibrary.simpleMessage("Ваш аккаунт создан. Для входа используйте этот пароль:"), - "acc_has_been_created_btn" : MessageLookupByLibrary.simpleMessage("Войти в аккаунт"), - "accountDeleting" : MessageLookupByLibrary.simpleMessage("Удаление аккаунта"), - "active" : MessageLookupByLibrary.simpleMessage("Активен"), - "active_consultations_count" : MessageLookupByLibrary.simpleMessage("Кол-во активных консультаций"), - "active_diet_state" : MessageLookupByLibrary.simpleMessage("Активная"), - "activity_fifth_value" : MessageLookupByLibrary.simpleMessage("1,9 — экстремальный (несколько интенсивных тренировок в день)"), - "activity_first_value" : MessageLookupByLibrary.simpleMessage("1,2 — минимальный (сидячая работа, отсутствие физических нагрузок)"), - "activity_fourth_value" : MessageLookupByLibrary.simpleMessage("1,7 — высокий (тренировки 30–60 мин 5–7 раза в неделю; тяжёлая физическая работа)"), - "activity_second_value" : MessageLookupByLibrary.simpleMessage("1,375 — низкий (тренировки не менее 20 мин 1–3 раза в неделю)"), - "activity_third_value" : MessageLookupByLibrary.simpleMessage("1,55 — умеренный (тренировки 30–60 мин 3–4 раза в неделю)"), - "add" : MessageLookupByLibrary.simpleMessage("Добавить"), - "addAtLeastOneItem" : MessageLookupByLibrary.simpleMessage("Добавьте хотя бы одину опцию"), - "add_card" : MessageLookupByLibrary.simpleMessage("Привязать карту"), - "add_cover" : MessageLookupByLibrary.simpleMessage("Добавьте обложку"), - "add_measure" : MessageLookupByLibrary.simpleMessage("Добавить замер"), - "added_products_in_glossary" : MessageLookupByLibrary.simpleMessage("Кол-во продуктов добавленных в глоссарий"), - "adding_plan" : MessageLookupByLibrary.simpleMessage("Добавление плана"), - "additional_information" : MessageLookupByLibrary.simpleMessage("Дополнительная информация"), - "admin" : MessageLookupByLibrary.simpleMessage("Админ"), - "alcohol" : MessageLookupByLibrary.simpleMessage("Алкоголь"), - "all" : MessageLookupByLibrary.simpleMessage("Все"), - "allergies_presence" : MessageLookupByLibrary.simpleMessage("Наличие аллергии"), - "allowAccess" : MessageLookupByLibrary.simpleMessage("Разрешить доступ"), - "allowAccessToCamera" : MessageLookupByLibrary.simpleMessage("Разрешите доступ к камере"), - "allowAccessToCameraDescription" : MessageLookupByLibrary.simpleMessage("Предоставление доступа позволит вам делать фотографии и добавлять к записям"), - "allowAcessToGalery" : MessageLookupByLibrary.simpleMessage("Разрешите доступ к фото"), - "allowAcessToGaleryDescription" : MessageLookupByLibrary.simpleMessage("Предоставление доступа позволит вам добавлять фото к записям"), - "another_form_of_comment" : MessageLookupByLibrary.simpleMessage("комментария"), - "another_form_of_day" : MessageLookupByLibrary.simpleMessage("дня"), - "another_form_of_hour" : MessageLookupByLibrary.simpleMessage("часа"), - "another_form_of_minute" : MessageLookupByLibrary.simpleMessage("минут"), - "another_form_of_stage" : MessageLookupByLibrary.simpleMessage("этапа"), - "answer" : MessageLookupByLibrary.simpleMessage("Ответить"), - "archived" : MessageLookupByLibrary.simpleMessage("В архиве"), - "atLeast3Symbols" : MessageLookupByLibrary.simpleMessage("Минимум 3 символа"), - "authentificate" : MessageLookupByLibrary.simpleMessage("Войти"), - "average_pressure" : MessageLookupByLibrary.simpleMessage("Средние показатели давления:"), - "back_to_chat" : MessageLookupByLibrary.simpleMessage("Вернуться в чат"), - "bodymass_chart" : MessageLookupByLibrary.simpleMessage("График ИМТ"), - "by_default" : MessageLookupByLibrary.simpleMessage("По умолчанию"), - "calls_for_bullying" : MessageLookupByLibrary.simpleMessage("Призывы к травле"), - "calories" : MessageLookupByLibrary.simpleMessage("Калории"), - "can_not_choose_start_date" : MessageLookupByLibrary.simpleMessage("Дату старта плана невозможно выбрать, пока Вы не привяжите карту"), - "can_not_load_data_please_try_again" : MessageLookupByLibrary.simpleMessage("Не удалось загрузить данные. Попробуйте обновить страницу"), - "can_not_see_next_day" : MessageLookupByLibrary.simpleMessage("Просмотр последующего дня возможен только при прохождении диеты"), - "cancel" : MessageLookupByLibrary.simpleMessage("Отменить"), - "cancelConsultation" : MessageLookupByLibrary.simpleMessage("Отменить консультацию"), - "cancel_diet" : MessageLookupByLibrary.simpleMessage("Отменить диету?"), - "cancel_order" : MessageLookupByLibrary.simpleMessage("Отменить заказ"), - "cannotDeleteAccount" : MessageLookupByLibrary.simpleMessage("Не получилось удалить ваш аккаунт"), - "carb_type" : MessageLookupByLibrary.simpleMessage("Мучное"), - "carb_type_desc" : MessageLookupByLibrary.simpleMessage("Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы."), - "carbohydrates" : MessageLookupByLibrary.simpleMessage("Углеводы"), - "changeDiet" : MessageLookupByLibrary.simpleMessage("Заменить диету"), - "chargeApproved" : MessageLookupByLibrary.simpleMessage("Выплата одобрена"), - "chargeCollectionFailed" : MessageLookupByLibrary.simpleMessage("Не удалось оформить выплату"), - "chat" : MessageLookupByLibrary.simpleMessage("Чат"), - "check_out_video_recipe" : MessageLookupByLibrary.simpleMessage("Посмотреть видео рецепт"), - "chest" : MessageLookupByLibrary.simpleMessage("Грудь"), - "chest_circumference" : MessageLookupByLibrary.simpleMessage("Обхват груди"), - "choose_date" : MessageLookupByLibrary.simpleMessage("Выбрать дату"), - "choose_diet_duration" : MessageLookupByLibrary.simpleMessage("Выберите срок диеты"), - "choose_plan_duration" : MessageLookupByLibrary.simpleMessage("Выберите срок плана"), - "choose_plan_start_date" : MessageLookupByLibrary.simpleMessage("Выберите дату старта плана питания"), - "choose_plan_start_date_with_personal_diet" : MessageLookupByLibrary.simpleMessage("Выберите дату старта плана питания с учетом составления персональной диеты"), - "choose_start_diet_date" : MessageLookupByLibrary.simpleMessage("Выберите дату старты диеты. Она отобразиться у Вас в дневнике"), - "chosePlanType" : MessageLookupByLibrary.simpleMessage("Выберите тип плана"), - "chose_plan_start_date_2" : MessageLookupByLibrary.simpleMessage("Выберите дату старты плана. Она отобразиться в дневнике пользователя"), - "chosenPlanStartDateDescr" : 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("Город проживания"), - "collectCharge" : MessageLookupByLibrary.simpleMessage("Получить выплату"), - "comfort" : MessageLookupByLibrary.simpleMessage("Комфорт"), - "comment" : MessageLookupByLibrary.simpleMessage("комментарий"), - "commentForMeal" : MessageLookupByLibrary.simpleMessage("Прокомментировать прием пищи"), - "comment_hint" : MessageLookupByLibrary.simpleMessage("Комментарий"), - "comments" : MessageLookupByLibrary.simpleMessage("Комментарии"), - "comments_plural" : MessageLookupByLibrary.simpleMessage("комментариев"), - "complain" : MessageLookupByLibrary.simpleMessage("Пожаловаться"), - "complaint" : MessageLookupByLibrary.simpleMessage("Жалоба"), - "complaint_question" : MessageLookupByLibrary.simpleMessage("Что именно в этом материале Вы считаете неприемлемым и нарушающим правила?"), - "complaint_sent" : MessageLookupByLibrary.simpleMessage("Жалоба успешно отправлена"), - "complaint_sent_description" : MessageLookupByLibrary.simpleMessage("Ваше обращение принято! Мы рассмотрим его в ближайшее время и примем необходимые меры. Спасибо за вашу бдительность и помощь в улучшении нашего сервиса."), - "confirm" : MessageLookupByLibrary.simpleMessage("Подтвердить"), - "congratsYouHaveFinishedPlan" : MessageLookupByLibrary.simpleMessage("Поздравляем, Вы закончили план"), - "congratulations" : MessageLookupByLibrary.simpleMessage("Поздравляем!"), - "consultantLeftComment" : m0, - "consultations_count" : MessageLookupByLibrary.simpleMessage("Кол-во проведенных консулдьтаций"), - "contactSupport" : MessageLookupByLibrary.simpleMessage("Обратитесь в поддержку"), - "continueButton" : MessageLookupByLibrary.simpleMessage("Продолжить"), - "continue_" : MessageLookupByLibrary.simpleMessage("Продолжить"), - "copied" : MessageLookupByLibrary.simpleMessage("cкопирован"), - "copied2" : MessageLookupByLibrary.simpleMessage("Скопировано!"), - "copy" : MessageLookupByLibrary.simpleMessage("Скопировать"), - "copy_link" : MessageLookupByLibrary.simpleMessage("Скопировать ссылку"), - "copy_referral_link" : MessageLookupByLibrary.simpleMessage("Скопировать пригласительную ссылку"), - "couldNotCancelOrder" : MessageLookupByLibrary.simpleMessage("Не удалось отменить заказ"), - "could_not_cancel_diet" : MessageLookupByLibrary.simpleMessage("Не удалось отменить диету"), - "could_not_delete_blog_post" : MessageLookupByLibrary.simpleMessage("Не удалось удалить пост"), - "could_not_launch_video" : MessageLookupByLibrary.simpleMessage("Не удалось запустить видео"), - "could_not_publish_blog_post" : MessageLookupByLibrary.simpleMessage("Не удалось опубликовать пост"), - "could_not_publish_diet" : MessageLookupByLibrary.simpleMessage("Не удалось опубликовать диету"), - "could_not_publish_recipe" : MessageLookupByLibrary.simpleMessage("Не удалось опубликовать рецепт"), - "could_not_send_complain" : MessageLookupByLibrary.simpleMessage("Не удалось отправить жалобу"), - "could_not_update_blog_post" : MessageLookupByLibrary.simpleMessage("Не удалось обновить пост"), - "could_not_update_diet" : MessageLookupByLibrary.simpleMessage("Не удалось обновить диету"), - "country" : MessageLookupByLibrary.simpleMessage("Страна"), - "createPersonalDiet" : MessageLookupByLibrary.simpleMessage("Составьте персональную диету"), - "create_diet" : MessageLookupByLibrary.simpleMessage("Создание диеты"), - "cunsutation_was_paid_successfully" : MessageLookupByLibrary.simpleMessage("Поздравляем, консультация успешно оплачена"), - "customer" : MessageLookupByLibrary.simpleMessage("Покупатель"), - "customer_price" : MessageLookupByLibrary.simpleMessage("Цена для покупателя"), - "date_has_ben_set" : MessageLookupByLibrary.simpleMessage("Дата старта начала консультации установлена"), - "date_of_birth" : MessageLookupByLibrary.simpleMessage("Дата рождения"), - "date_of_birth_error" : MessageLookupByLibrary.simpleMessage("Некорректная дата рождения"), - "day" : MessageLookupByLibrary.simpleMessage("День"), - "dayComment" : MessageLookupByLibrary.simpleMessage("Комментарий ко всему дню"), - "dayCommentTitle" : MessageLookupByLibrary.simpleMessage("Прокомментировать день"), - "days" : MessageLookupByLibrary.simpleMessage("дней"), - "deception" : MessageLookupByLibrary.simpleMessage("Обман"), - "delete" : MessageLookupByLibrary.simpleMessage("Удалить"), - "deleteComment" : MessageLookupByLibrary.simpleMessage("Удалить комментарий"), - "deleted" : MessageLookupByLibrary.simpleMessage("Удалена"), - "diary" : MessageLookupByLibrary.simpleMessage("Дневник"), - "diet" : MessageLookupByLibrary.simpleMessage("Диета"), - "dietSuggestion" : MessageLookupByLibrary.simpleMessage("Предложение диеты"), - "diet_author" : MessageLookupByLibrary.simpleMessage("Автор диеты"), - "diet_has_been_sent_to_draft" : MessageLookupByLibrary.simpleMessage("снята с публикации и перенесена в черновик"), - "diet_plan" : MessageLookupByLibrary.simpleMessage("План диеты"), - "diet_started" : MessageLookupByLibrary.simpleMessage("Диета уже начата"), - "diet_state" : MessageLookupByLibrary.simpleMessage("Статус диеты"), - "diet_type" : MessageLookupByLibrary.simpleMessage("Тип диеты"), - "do_you_have_hypertension_tendency" : MessageLookupByLibrary.simpleMessage("Есть ли у вас гипертония?"), - "do_you_have_hypotension_tendency" : MessageLookupByLibrary.simpleMessage("Есть ли у вас гипотония?"), - "do_you_take_pills" : MessageLookupByLibrary.simpleMessage("Принимаете ли вы лекарства или бады?"), - "done" : MessageLookupByLibrary.simpleMessage("Завершен"), - "down_pressure" : MessageLookupByLibrary.simpleMessage("Нижние показатели давления:"), - "draft" : MessageLookupByLibrary.simpleMessage("Черновик"), - "drafted" : MessageLookupByLibrary.simpleMessage("Черновики"), - "drugs" : MessageLookupByLibrary.simpleMessage("Наркотики"), - "eating_behavior" : MessageLookupByLibrary.simpleMessage("Пищевое поведение"), - "eating_behavior_type" : MessageLookupByLibrary.simpleMessage("Формирование пищевого поведения"), - "eating_behavior_type_desc" : MessageLookupByLibrary.simpleMessage("Формирование здорового пищевого поведения — это процесс, который включает в себя изменение привычек и отношения к еде. Он направлен на то, чтобы помочь людям научиться правильно питаться и поддерживать здоровый образ жизни.Основные принципы формирования здорового пищевого поведения: \n● Разнообразие продуктов; \n● Сбалансированный рацион; \n● Питьевой режим; \n● Ограничение вредных продуктов; \n● Регулярные приёмы пищи; \n● Умеренность;Осознанное питание; \n● Физическая активность;"), - "eatvioIsAHelthyHabbit" : MessageLookupByLibrary.simpleMessage("Итвио — это полезная привычка"), - "economy" : MessageLookupByLibrary.simpleMessage("Эконом"), - "edit" : MessageLookupByLibrary.simpleMessage("Редактировать"), - "email" : MessageLookupByLibrary.simpleMessage("Электронная почта"), - "email_empty" : MessageLookupByLibrary.simpleMessage("Необходимо ввести адрес электронной почты"), - "email_error" : MessageLookupByLibrary.simpleMessage("Некорректный адрес электронной почты"), - "email_invalid" : MessageLookupByLibrary.simpleMessage("Некорректный адрес электронной почты"), - "end_previous_plan" : MessageLookupByLibrary.simpleMessage("Закончите прохождение предыдущего плана"), - "enter_additional_information" : MessageLookupByLibrary.simpleMessage("Введите любую дополнительную информацию на своё усмотрение:"), - "enter_diet_description" : MessageLookupByLibrary.simpleMessage("Введите описание диеты"), - "enter_diet_name" : MessageLookupByLibrary.simpleMessage("Выведите название диеты"), - "enter_information" : MessageLookupByLibrary.simpleMessage("Введите информацию..."), - "error_desc" : MessageLookupByLibrary.simpleMessage("Произошла ошибка. Мы уже работаем над её устранением. Попробуйте позже"), - "exit" : MessageLookupByLibrary.simpleMessage("Выйти"), - "expand" : MessageLookupByLibrary.simpleMessage("Показать полностью"), - "explainResonOfCancelation" : MessageLookupByLibrary.simpleMessage("Опишите причину отказа"), - "explicitImage" : MessageLookupByLibrary.simpleMessage("Откровенное изображение"), - "explicitImages" : MessageLookupByLibrary.simpleMessage("Откровенные изображения"), - "explicitImagesDescription" : MessageLookupByLibrary.simpleMessage("Отправьте жалобу, если кто-то разместил откровенные изображения"), - "extremism" : MessageLookupByLibrary.simpleMessage("Экстремизм"), - "fake_documents" : MessageLookupByLibrary.simpleMessage("Поддельные документы"), - "fats" : MessageLookupByLibrary.simpleMessage("Жиры"), - "favorite_foods" : MessageLookupByLibrary.simpleMessage("Любимые продукты"), - "favorite_unfavorite_foods" : MessageLookupByLibrary.simpleMessage("Ваши любимые/нелюбимые продукты питания?"), - "female" : MessageLookupByLibrary.simpleMessage("Женский"), - "female_short" : MessageLookupByLibrary.simpleMessage("Ж"), - "fillYasterday" : 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 символ"), - "first_name_validation_error" : MessageLookupByLibrary.simpleMessage("Имя обязательно к заполнению"), - "fit_type" : MessageLookupByLibrary.simpleMessage("Поддержание формы"), - "fit_type_desc" : MessageLookupByLibrary.simpleMessage("План питания для поддержания формы сбалансированный и разнообразный, чтобы обеспечить организм всеми необходимыми питательными веществами. Общие принципы: \n● Дробное питание; \n● Разнообразие продуктов; \n● Контроль порций; \n● Питьевой режим; \n● Ограничение вредных продуктов;"), - "fitness" : MessageLookupByLibrary.simpleMessage("Поддержка формы"), - "for_a_month" : MessageLookupByLibrary.simpleMessage("За месяц"), - "for_a_week" : MessageLookupByLibrary.simpleMessage("За неделю"), - "for_a_year" : MessageLookupByLibrary.simpleMessage("За год"), - "for_whole_period_of_time" : MessageLookupByLibrary.simpleMessage("За всё время"), - "fourteenDays" : MessageLookupByLibrary.simpleMessage("14 дней"), - "fraud" : MessageLookupByLibrary.simpleMessage("Мошенничество"), - "fraud_description" : MessageLookupByLibrary.simpleMessage("Мошенничество с целью наживы. Если вас обманули, пожалуйста, сообщите об этом в правоохранительные органы."), - "from" : MessageLookupByLibrary.simpleMessage("от"), - "from_a_to_z" : MessageLookupByLibrary.simpleMessage("Название: А-Я"), - "from_z_to_a" : MessageLookupByLibrary.simpleMessage("Название: Я-А"), - "gallery" : MessageLookupByLibrary.simpleMessage("Галерея"), - "gender_error" : MessageLookupByLibrary.simpleMessage("Выберите пол"), - "general_info" : MessageLookupByLibrary.simpleMessage("Общая информация"), - "goToMyDiets" : MessageLookupByLibrary.simpleMessage("Перейти к моим диетам"), - "go_to_diary" : MessageLookupByLibrary.simpleMessage("Перейти в дневник"), - "gr" : MessageLookupByLibrary.simpleMessage("гр"), - "grams" : MessageLookupByLibrary.simpleMessage("гр"), - "has_alergy" : MessageLookupByLibrary.simpleMessage("Наличие аллергии"), - "has_hyper" : MessageLookupByLibrary.simpleMessage("Склонность к гипертонии"), - "has_hypo" : MessageLookupByLibrary.simpleMessage("Склонность к гипотонии"), - "has_not_filled_it_yet" : MessageLookupByLibrary.simpleMessage("ещё не закончил(a) этот день"), - "hatred" : MessageLookupByLibrary.simpleMessage("Оскорбление"), - "hatred_description" : MessageLookupByLibrary.simpleMessage("Враждебные высказывания"), - "height" : MessageLookupByLibrary.simpleMessage("Рост"), - "height_error" : MessageLookupByLibrary.simpleMessage("Введите рост"), - "height_measurements" : MessageLookupByLibrary.simpleMessage("Замер роста"), - "hide" : MessageLookupByLibrary.simpleMessage("Свернуть"), - "hip_circumference" : MessageLookupByLibrary.simpleMessage("Обхват бедер"), - "hips" : MessageLookupByLibrary.simpleMessage("Бедра"), - "hour" : MessageLookupByLibrary.simpleMessage("час"), - "hours" : MessageLookupByLibrary.simpleMessage("часов"), - "in_progress" : MessageLookupByLibrary.simpleMessage("В процессе"), - "inactive_diet_state" : MessageLookupByLibrary.simpleMessage("Черновик"), - "infoAboutOrder" : MessageLookupByLibrary.simpleMessage("Информация о заказе"), - "ingredients" : MessageLookupByLibrary.simpleMessage("Ингредиенты"), - "initial_measurements" : MessageLookupByLibrary.simpleMessage("Первичные замеры"), - "invite" : MessageLookupByLibrary.simpleMessage("Пригласить"), - "invited_people_count" : MessageLookupByLibrary.simpleMessage("Количество приглашенных"), - "itCantBeRecovered" : MessageLookupByLibrary.simpleMessage("Его нельзя будет восстановить"), - "label" : MessageLookupByLibrary.simpleMessage("Название"), - "language" : MessageLookupByLibrary.simpleMessage("Язык"), - "last_name" : MessageLookupByLibrary.simpleMessage("Фамилия"), - "last_name_empty" : MessageLookupByLibrary.simpleMessage("Фамилия обязательна для заполнения"), - "last_name_error" : MessageLookupByLibrary.simpleMessage("Фамилия обязательна для заполнения"), - "last_name_short" : MessageLookupByLibrary.simpleMessage("В фамилии должен быть минимум 6 символов"), - "last_step" : MessageLookupByLibrary.simpleMessage("Последний шаг"), - "lawViolation" : MessageLookupByLibrary.simpleMessage("Нарушение законодательства"), - "lbl_english" : MessageLookupByLibrary.simpleMessage("English"), - "leaveComplainRequest" : MessageLookupByLibrary.simpleMessage("Подать жалобу"), - "letsInvite" : MessageLookupByLibrary.simpleMessage("Давайте пригласим близких в итвио"), - "light_type" : MessageLookupByLibrary.simpleMessage("Легкая"), - "light_type_desc" : MessageLookupByLibrary.simpleMessage("С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками."), - "liked_groceries" : MessageLookupByLibrary.simpleMessage("Любимые продукты"), - "link_was_copied" : MessageLookupByLibrary.simpleMessage("Ссылка успешно скопирована"), - "loading" : MessageLookupByLibrary.simpleMessage("Загрузка..."), - "login" : MessageLookupByLibrary.simpleMessage("Войти в аккаунт"), - "lower" : MessageLookupByLibrary.simpleMessage("Нижнее"), - "mail_was_copied" : MessageLookupByLibrary.simpleMessage("Почта успешно скопирована"), - "male" : MessageLookupByLibrary.simpleMessage("Мужской"), - "male_short" : MessageLookupByLibrary.simpleMessage("М"), - "markAsRead" : MessageLookupByLibrary.simpleMessage("Отметить всё прочитанным"), - "meal" : MessageLookupByLibrary.simpleMessage("Приём пищи"), - "mealComment" : MessageLookupByLibrary.simpleMessage("Комментарий к приему пищи"), - "meat" : MessageLookupByLibrary.simpleMessage("Мясо"), - "meat_type" : MessageLookupByLibrary.simpleMessage("С мясом"), - "meat_type_desc" : MessageLookupByLibrary.simpleMessage("Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму."), - "milliliter" : MessageLookupByLibrary.simpleMessage("мл"), - "minPlanPrice" : MessageLookupByLibrary.simpleMessage("Минимальная сумма 1200₽"), - "minimal_customer_price" : MessageLookupByLibrary.simpleMessage("Минимальная цена для покупателя: 1200₽"), - "minute" : MessageLookupByLibrary.simpleMessage("минута"), - "minutes" : MessageLookupByLibrary.simpleMessage("минуты"), - "misrepresentation" : MessageLookupByLibrary.simpleMessage("Введение в заблуждение"), - "misrepresentation_description" : MessageLookupByLibrary.simpleMessage("Новости, которые могут вызвать широкий резонанс или несут угрозу, распространяемые с целью введения людей в заблуждение."), - "moneySentToCard" : MessageLookupByLibrary.simpleMessage("Средства отправлены на карту"), - "more_about_order" : MessageLookupByLibrary.simpleMessage("Подробнее о заказе"), - "most_new" : MessageLookupByLibrary.simpleMessage("Самые новые"), - "most_old" : MessageLookupByLibrary.simpleMessage("Самые старые"), - "msg_network_err" : MessageLookupByLibrary.simpleMessage("Сетевая ошибка!"), - "msg_something_went_wrong" : MessageLookupByLibrary.simpleMessage("Что то пошло не так!"), - "my_blog" : MessageLookupByLibrary.simpleMessage("Мой блог"), - "my_cards" : MessageLookupByLibrary.simpleMessage("Мои карты"), - "my_diets" : MessageLookupByLibrary.simpleMessage("Мои диеты"), - "my_plans" : MessageLookupByLibrary.simpleMessage("Мои планы"), - "my_settings" : MessageLookupByLibrary.simpleMessage("Мои настройки"), - "name_empty" : MessageLookupByLibrary.simpleMessage("Имя пользователя обязательно для заполнения"), - "name_short" : MessageLookupByLibrary.simpleMessage("В имени пользователя должно быть минимум 6 символов"), - "new_card" : MessageLookupByLibrary.simpleMessage("Добавить карту"), - "next" : MessageLookupByLibrary.simpleMessage("Далее"), - "nicotine" : MessageLookupByLibrary.simpleMessage("Никотин"), - "no" : MessageLookupByLibrary.simpleMessage("Нет"), - "no_account" : MessageLookupByLibrary.simpleMessage("У меня нет аккаунта"), - "no_default_cards" : MessageLookupByLibrary.simpleMessage("У вас нет привязанных карт. Что бы начать работу, привяжите карту"), - "not_liked_groceries" : MessageLookupByLibrary.simpleMessage("Не любимые продукты"), - "notifications" : MessageLookupByLibrary.simpleMessage("Уведомления"), - "ok" : MessageLookupByLibrary.simpleMessage("Хорошо"), - "one_option" : MessageLookupByLibrary.simpleMessage("1 опция"), - "option" : MessageLookupByLibrary.simpleMessage("Опция"), - "option_content" : MessageLookupByLibrary.simpleMessage("Содержание опции"), - "option_content_hint_text" : MessageLookupByLibrary.simpleMessage("На связи 7 дней в неделю"), - "option_desc" : MessageLookupByLibrary.simpleMessage("Описание опции"), - "option_desc_hint_text" : MessageLookupByLibrary.simpleMessage("Этот план питания для похудения на 7 дней сбалансированный и разнообразный"), - "option_duration" : MessageLookupByLibrary.simpleMessage("Продолжительность опции"), - "option_personal_diet_desc" : MessageLookupByLibrary.simpleMessage("Опция подразумевает создание индивидуальной диеты"), - "option_title" : MessageLookupByLibrary.simpleMessage("Заголовок опции"), - "order" : MessageLookupByLibrary.simpleMessage("Порядок"), - "orderCanceled" : MessageLookupByLibrary.simpleMessage("Заказ отменен"), - "order_created" : MessageLookupByLibrary.simpleMessage("Заказ создан"), - "order_paid" : MessageLookupByLibrary.simpleMessage("Заказ оплачен"), - "order_price" : MessageLookupByLibrary.simpleMessage("Сумма заказа"), - "order_status" : MessageLookupByLibrary.simpleMessage("Статус заказа"), - "orederCancelation" : MessageLookupByLibrary.simpleMessage("Отмена заказа"), - "other" : MessageLookupByLibrary.simpleMessage("Другое"), - "other_info" : MessageLookupByLibrary.simpleMessage("Прочая информация"), - "password" : MessageLookupByLibrary.simpleMessage("Пароль"), - "password_confirmation" : MessageLookupByLibrary.simpleMessage("Подтвердите пароль"), - "password_confirmation_mismatch" : MessageLookupByLibrary.simpleMessage("Пароли не совпадают"), - "password_desc" : MessageLookupByLibrary.simpleMessage("Сохраните его в надежном месте! Вы сможете изменить пароль в настройках профиля"), - "password_empty" : MessageLookupByLibrary.simpleMessage("Пароль обязателен для заполнения"), - "password_short" : MessageLookupByLibrary.simpleMessage("В пароле должно быть минимум 6 символов"), - "pay" : MessageLookupByLibrary.simpleMessage("Оплатить"), - "payment_failed" : MessageLookupByLibrary.simpleMessage("Оплата не прошла"), - "pcs" : MessageLookupByLibrary.simpleMessage("шт"), - "pending_payment" : MessageLookupByLibrary.simpleMessage("Ожидается оплата"), - "personal" : MessageLookupByLibrary.simpleMessage("Персональные"), - "personalDietCreating" : MessageLookupByLibrary.simpleMessage("Составление индивидуальной диеты"), - "personal_diet_set" : MessageLookupByLibrary.simpleMessage("Персональная диета установлена"), - "personal_diet_state" : MessageLookupByLibrary.simpleMessage("Персональная"), - "phisical_activity" : MessageLookupByLibrary.simpleMessage("Уровень физической активности"), - "phone" : MessageLookupByLibrary.simpleMessage("Телефон"), - "phone_error" : MessageLookupByLibrary.simpleMessage("Некорректный номер телефона"), - "photo" : MessageLookupByLibrary.simpleMessage("Фото"), - "physical_fitness" : MessageLookupByLibrary.simpleMessage("Физическая форма"), - "place_of_living" : MessageLookupByLibrary.simpleMessage("Место проживания"), - "planStarted" : m1, - "planWillBeConfirmedAfterThreeDays" : MessageLookupByLibrary.simpleMessage("Если вы не подтвердите, то план через три дня подтвердится автоматически"), - "planWithUserStarted" : m2, - "plan_author" : MessageLookupByLibrary.simpleMessage("Автор плана"), - "plan_desc" : MessageLookupByLibrary.simpleMessage("Описание плана"), - "plan_desc_example" : MessageLookupByLibrary.simpleMessage("Большое подробное, привлекательное описание плана"), - "plan_duration" : MessageLookupByLibrary.simpleMessage("Срок плана"), - "plan_label_desc" : MessageLookupByLibrary.simpleMessage("План для поддержания формы"), - "plan_seller" : MessageLookupByLibrary.simpleMessage("Продавец плана"), - "plan_type" : MessageLookupByLibrary.simpleMessage("Тип плана"), - "plans_complete" : MessageLookupByLibrary.simpleMessage("Пройденные планы"), - "pleaseConfirmPlan" : MessageLookupByLibrary.simpleMessage("Просим вас подтвердить прохождение плана"), - "please_try_again_later" : MessageLookupByLibrary.simpleMessage("Пожалуйста, попробуйте еще раз позже"), - "popular" : MessageLookupByLibrary.simpleMessage("Популярные"), - "preferred_language" : MessageLookupByLibrary.simpleMessage("Предпочитаемый язык общения"), - "pressure" : MessageLookupByLibrary.simpleMessage("Давление"), - "pressure_empty" : MessageLookupByLibrary.simpleMessage("Все показатели давления обязательны к заполнению"), - "pressure_is_not_a_number" : MessageLookupByLibrary.simpleMessage("Все показатели давления должны быть числами"), - "preview" : MessageLookupByLibrary.simpleMessage("Превью"), - "price" : MessageLookupByLibrary.simpleMessage("Цена"), - "price_explanation" : MessageLookupByLibrary.simpleMessage("Разница в ценах, это комиссия Итвио"), - "profile" : MessageLookupByLibrary.simpleMessage("Профиль"), - "prostitution" : MessageLookupByLibrary.simpleMessage("Проституция"), - "proteins" : MessageLookupByLibrary.simpleMessage("Белки"), - "public_diet_state" : MessageLookupByLibrary.simpleMessage("Публичная"), - "publish" : MessageLookupByLibrary.simpleMessage("Опубликовать"), - "published" : MessageLookupByLibrary.simpleMessage("Опубликованные"), - "published_diets_count" : MessageLookupByLibrary.simpleMessage("Кол-во опубликованных диет"), - "published_posts_count" : MessageLookupByLibrary.simpleMessage("Количество опубликованных постов"), - "published_recipes_count" : MessageLookupByLibrary.simpleMessage("Кол-во опубликованных рецептов"), - "rating_and_statistics" : MessageLookupByLibrary.simpleMessage("Рейтинг и статистика"), - "rating_history" : MessageLookupByLibrary.simpleMessage("Начисление рейтинга"), - "reasonExample" : MessageLookupByLibrary.simpleMessage("Заказал по ошибке"), - "recipe_author" : MessageLookupByLibrary.simpleMessage("Автор рецепта"), - "recipe_publishing" : MessageLookupByLibrary.simpleMessage("Публикация рецепта"), - "refuse_order" : MessageLookupByLibrary.simpleMessage("Отказаться от заказа"), - "register" : MessageLookupByLibrary.simpleMessage("Зарегистрироваться"), - "registration_completed" : MessageLookupByLibrary.simpleMessage("Регистрация завершена!"), - "removeFromActive" : MessageLookupByLibrary.simpleMessage("Снять с публикации"), - "reply" : MessageLookupByLibrary.simpleMessage("Ответить"), - "resend" : MessageLookupByLibrary.simpleMessage("Отправить повторно"), - "save" : MessageLookupByLibrary.simpleMessage("Сохранить"), - "send" : MessageLookupByLibrary.simpleMessage("Отправить"), - "send_complain" : MessageLookupByLibrary.simpleMessage("Отправить жалобу"), - "services" : MessageLookupByLibrary.simpleMessage("Оказание услуг"), - "settings" : MessageLookupByLibrary.simpleMessage("Настройки"), - "sex" : MessageLookupByLibrary.simpleMessage("Пол"), - "share" : MessageLookupByLibrary.simpleMessage("Поделиться"), - "signUpFailed" : MessageLookupByLibrary.simpleMessage("Регистрация не удалась!"), - "skip" : MessageLookupByLibrary.simpleMessage("Пропустить"), - "slim" : MessageLookupByLibrary.simpleMessage("Похудение"), - "slim_type" : MessageLookupByLibrary.simpleMessage("Похудение"), - "slim_type_desc" : MessageLookupByLibrary.simpleMessage("План питания для похудения должен быть разработан с учётом индивидуальных особенностей организма, возраста, пола, уровня физической активности и состояния здоровья. Общие принципы: \n● Снижение калорийности; \n● Сбалансированный рацион; \n● Разнообразие продуктов; \n● Питьевой режим; \n● Ограничение вредных продуктов;"), - "smth_went_wrong_payment_failed" : MessageLookupByLibrary.simpleMessage("Что-то пошло не так, оплата не прошла"), - "some_error_occurred" : MessageLookupByLibrary.simpleMessage("Упс! Произошла ошибка"), - "some_error_occurred_description" : MessageLookupByLibrary.simpleMessage("Произошла ошибка. Мы уже работаем над ее устранением. Попробуйте позже."), - "something_went_wrong" : MessageLookupByLibrary.simpleMessage("Упс! Что-то пошло не так"), - "sorry_we_did_not_find_the_plan" : MessageLookupByLibrary.simpleMessage("Извините, план где-то потерялся, мы уже ищем его"), - "spam" : MessageLookupByLibrary.simpleMessage("Спам"), - "spam_description" : MessageLookupByLibrary.simpleMessage("Отправьте жалобу, если Вы заметили рекламу, размещенную в не предназначенном для этого месте."), - "sport_hobbies" : MessageLookupByLibrary.simpleMessage("Спортивные увлечения"), - "stage" : MessageLookupByLibrary.simpleMessage("этап"), - "stages" : MessageLookupByLibrary.simpleMessage("этапов"), - "standard" : MessageLookupByLibrary.simpleMessage("Стандарт"), - "startDateHasBeenSet" : MessageLookupByLibrary.simpleMessage("Выбрана дата старта"), - "startDiet" : MessageLookupByLibrary.simpleMessage("Начать диету"), - "statistic" : MessageLookupByLibrary.simpleMessage("Статистика"), - "step" : MessageLookupByLibrary.simpleMessage("Шаг"), - "step_by_step_photo_recipe" : MessageLookupByLibrary.simpleMessage("Пошаговый фоторецепт"), - "step_widget" : m3, - "successfully_published" : MessageLookupByLibrary.simpleMessage("успешно опубликован"), - "suggestDiet" : MessageLookupByLibrary.simpleMessage("Предложить диету"), - "suicide" : MessageLookupByLibrary.simpleMessage("Склонение к самоубийству"), - "takes_pills" : MessageLookupByLibrary.simpleMessage("Принимает лекарства"), - "tap_on_link_to_pay" : MessageLookupByLibrary.simpleMessage("Перейдите по ссылке для оплаты консультации"), - "tell_your_schedule" : MessageLookupByLibrary.simpleMessage("Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:"), - "text_was_copied" : MessageLookupByLibrary.simpleMessage("Text copied successfully"), - "there_is_a_video" : MessageLookupByLibrary.simpleMessage("Есть видео"), - "three_options" : MessageLookupByLibrary.simpleMessage("3 опции"), - "time" : MessageLookupByLibrary.simpleMessage("Время прохождения"), - "time_to_complete_plan" : MessageLookupByLibrary.simpleMessage("Время выполнения плана"), - "toOffer" : MessageLookupByLibrary.simpleMessage("Предложить"), - "to_draft" : MessageLookupByLibrary.simpleMessage("В черновик"), - "to_order" : MessageLookupByLibrary.simpleMessage("Заказать"), - "tommorowPlanWithUserWillStart" : m4, - "tomorrowYourPlanWillStart" : m5, - "try_again" : MessageLookupByLibrary.simpleMessage("Попробовать снова"), - "try_again_2" : MessageLookupByLibrary.simpleMessage("Попробуйте ещё раз"), - "typeAmoutOfReturn" : MessageLookupByLibrary.simpleMessage("Укажите сумму которую вы хотите вернуть"), - "typeDayComment" : MessageLookupByLibrary.simpleMessage("Как можно подробнее прокомментируйте дневник пользователя"), - "typeMealComment" : MessageLookupByLibrary.simpleMessage("Как можно подробнее прокомментируйте прием пищи"), - "typePortionComment" : MessageLookupByLibrary.simpleMessage("Прокомментируйте блюдо"), - "type_email" : MessageLookupByLibrary.simpleMessage("Введите email"), - "type_height" : MessageLookupByLibrary.simpleMessage("Введите рост"), - "type_here_your_complaint" : MessageLookupByLibrary.simpleMessage("Напишите здесь свою жалобу"), - "type_weight" : MessageLookupByLibrary.simpleMessage("Введите вес"), - "unfavorite_foods" : MessageLookupByLibrary.simpleMessage("Нелюбимые продукты"), - "up_pressure" : MessageLookupByLibrary.simpleMessage("Верхние показатели давления:"), - "upper" : MessageLookupByLibrary.simpleMessage("Верхнее"), - "userCanceldThePlanSubscription" : m6, - "userConfirmedPlanCompletion" : MessageLookupByLibrary.simpleMessage("Пользователь подтвердил прохождения плана. В ближайшее время Вы получите"), - "userConfirmedPlanCompletionWithoutSum" : MessageLookupByLibrary.simpleMessage("Пользователь подтвердил прохождения плана."), - "userPaidThePlan" : m7, - "userSubscribedToPlan" : m8, - "user_authorization" : MessageLookupByLibrary.simpleMessage("Аутентификация"), - "user_data" : MessageLookupByLibrary.simpleMessage("Данные пользователя"), - "user_data_desc" : MessageLookupByLibrary.simpleMessage("Эти данные нужны для корректной работы дневника питания и расчета вашей дневной нормы потребления КБЖУ"), - "user_info" : MessageLookupByLibrary.simpleMessage("Анкета пользователя"), - "user_registration" : MessageLookupByLibrary.simpleMessage("Регистрация пользователя"), - "username" : MessageLookupByLibrary.simpleMessage("Имя пользователя"), - "vegan" : MessageLookupByLibrary.simpleMessage("Веган."), - "vegan_type" : MessageLookupByLibrary.simpleMessage("Вегетарианская"), - "vegan_type_desc" : MessageLookupByLibrary.simpleMessage("Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья."), - "violenceAndHostility" : MessageLookupByLibrary.simpleMessage("Насилие и вражда"), - "violence_against_people_or_animal" : MessageLookupByLibrary.simpleMessage("Насилие над людьми или животными"), - "waist" : MessageLookupByLibrary.simpleMessage("Талия"), - "waist_circumference" : MessageLookupByLibrary.simpleMessage("Обхват талии"), - "wait_for_start_day" : MessageLookupByLibrary.simpleMessage("Ожидайте начала плана питания"), - "want_to_see_tomorrow" : MessageLookupByLibrary.simpleMessage("Хотите заглянуть в будущее?"), - "weAreLookingFor" : MessageLookupByLibrary.simpleMessage("Мы собираем самое большое сообщество людей, желающих вести здоровый образ жизни!"), - "weapon" : MessageLookupByLibrary.simpleMessage("Оружие"), - "weight" : MessageLookupByLibrary.simpleMessage("Вес"), - "weight_chart" : MessageLookupByLibrary.simpleMessage("График веса"), - "weight_error" : MessageLookupByLibrary.simpleMessage("Введите вес"), - "weight_measurements" : MessageLookupByLibrary.simpleMessage("Замер веса"), - "wellness" : MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), - "wellness_type" : MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), - "wellness_type_desc" : MessageLookupByLibrary.simpleMessage("Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы."), - "what_do_you_want_to_complaint_about" : MessageLookupByLibrary.simpleMessage("На что Вы хотите пожаловаться?"), - "what_is_your_name" : MessageLookupByLibrary.simpleMessage("Как вас зовут?"), - "wrong_credentials" : MessageLookupByLibrary.simpleMessage("Неверные данные пользователя"), - "youCanComplain" : MessageLookupByLibrary.simpleMessage("Если вас что-то не устроило, вы можете подать жалобу"), - "youCanceledSubscriptionToPlan" : m9, - "youShureYouWantToCancelOrder" : MessageLookupByLibrary.simpleMessage("Вы уверены, что хотите отменить заказ?"), - "youShureYouWantToDeleteAccount" : MessageLookupByLibrary.simpleMessage("Вы уверены, что хотите удалить аккаунт?"), - "youWithUs" : MessageLookupByLibrary.simpleMessage("Вы с итвио уже\n"), - "you_can_not_open_this_day" : MessageLookupByLibrary.simpleMessage("Вы не можете перейти в этот день"), - "you_can_not_start_plan_until_end_of_prev_one" : MessageLookupByLibrary.simpleMessage("Вы не можете начать план, пока не закончите прохождение предыдущего"), - "you_will_get" : MessageLookupByLibrary.simpleMessage("Вы получите"), - "your_blood_pressure" : MessageLookupByLibrary.simpleMessage("Ваше артериальное давление?"), - "your_favorite_sports" : MessageLookupByLibrary.simpleMessage("Ваши спортивные увлечения?"), - "your_gender" : MessageLookupByLibrary.simpleMessage("Ваш пол?"), - "your_height" : MessageLookupByLibrary.simpleMessage("Ваш рост:"), - "your_last_name" : MessageLookupByLibrary.simpleMessage("Ваша фамилия"), - "your_name" : MessageLookupByLibrary.simpleMessage("Ваше имя"), - "your_rating" : MessageLookupByLibrary.simpleMessage("Ваш рейтинг"), - "your_schedule" : MessageLookupByLibrary.simpleMessage("Ваш режим дня?"), - "your_weight" : MessageLookupByLibrary.simpleMessage("Ваш вес:") + static Map _notInlinedMessages(_) => { + "Moscow": MessageLookupByLibrary.simpleMessage("Москва"), + "Russia": MessageLookupByLibrary.simpleMessage("Россия"), + "about_diet": MessageLookupByLibrary.simpleMessage("Об этой диете"), + "about_plan": MessageLookupByLibrary.simpleMessage("Об этом плане"), + "about_recipe": MessageLookupByLibrary.simpleMessage("Об этом рецепте"), + "acc_has_been_created": MessageLookupByLibrary.simpleMessage( + "Ваш аккаунт создан. Для входа используйте этот пароль:", + ), + "acc_has_been_created_btn": MessageLookupByLibrary.simpleMessage( + "Войти в аккаунт", + ), + "accountDeleting": MessageLookupByLibrary.simpleMessage( + "Удаление аккаунта", + ), + "active": MessageLookupByLibrary.simpleMessage("Активен"), + "active_consultations_count": MessageLookupByLibrary.simpleMessage( + "Кол-во активных консультаций", + ), + "active_diet_state": MessageLookupByLibrary.simpleMessage("Активная"), + "activity_fifth_value": MessageLookupByLibrary.simpleMessage( + "1,9 — экстремальный (несколько интенсивных тренировок в день)", + ), + "activity_first_value": MessageLookupByLibrary.simpleMessage( + "1,2 — минимальный (сидячая работа, отсутствие физических нагрузок)", + ), + "activity_fourth_value": MessageLookupByLibrary.simpleMessage( + "1,7 — высокий (тренировки 30–60 мин 5–7 раза в неделю; тяжёлая физическая работа)", + ), + "activity_second_value": MessageLookupByLibrary.simpleMessage( + "1,375 — низкий (тренировки не менее 20 мин 1–3 раза в неделю)", + ), + "activity_third_value": MessageLookupByLibrary.simpleMessage( + "1,55 — умеренный (тренировки 30–60 мин 3–4 раза в неделю)", + ), + "add": MessageLookupByLibrary.simpleMessage("Добавить"), + "addAtLeastOneItem": MessageLookupByLibrary.simpleMessage( + "Добавьте хотя бы одину опцию", + ), + "add_card": MessageLookupByLibrary.simpleMessage("Привязать карту"), + "add_cover": MessageLookupByLibrary.simpleMessage("Добавьте обложку"), + "add_measure": MessageLookupByLibrary.simpleMessage("Добавить замер"), + "added_products_in_glossary": MessageLookupByLibrary.simpleMessage( + "Кол-во продуктов добавленных в глоссарий", + ), + "adding_plan": MessageLookupByLibrary.simpleMessage("Добавление плана"), + "additional_information": MessageLookupByLibrary.simpleMessage( + "Дополнительная информация", + ), + "admin": MessageLookupByLibrary.simpleMessage("Админ"), + "alcohol": MessageLookupByLibrary.simpleMessage("Алкоголь"), + "all": MessageLookupByLibrary.simpleMessage("Все"), + "allergies_presence": MessageLookupByLibrary.simpleMessage( + "Наличие аллергии", + ), + "allowAccess": MessageLookupByLibrary.simpleMessage("Разрешить доступ"), + "allowAccessToCamera": MessageLookupByLibrary.simpleMessage( + "Разрешите доступ к камере", + ), + "allowAccessToCameraDescription": MessageLookupByLibrary.simpleMessage( + "Предоставление доступа позволит вам делать фотографии и добавлять к записям", + ), + "allowAcessToGalery": MessageLookupByLibrary.simpleMessage( + "Разрешите доступ к фото", + ), + "allowAcessToGaleryDescription": MessageLookupByLibrary.simpleMessage( + "Предоставление доступа позволит вам добавлять фото к записям", + ), + "another_form_of_comment": MessageLookupByLibrary.simpleMessage( + "комментария", + ), + "another_form_of_day": MessageLookupByLibrary.simpleMessage("дня"), + "another_form_of_hour": MessageLookupByLibrary.simpleMessage("часа"), + "another_form_of_minute": MessageLookupByLibrary.simpleMessage("минут"), + "another_form_of_stage": MessageLookupByLibrary.simpleMessage("этапа"), + "answer": MessageLookupByLibrary.simpleMessage("Ответить"), + "archived": MessageLookupByLibrary.simpleMessage("В архиве"), + "atLeast3Symbols": MessageLookupByLibrary.simpleMessage( + "Минимум 3 символа", + ), + "authentificate": MessageLookupByLibrary.simpleMessage("Войти"), + "authorization": MessageLookupByLibrary.simpleMessage("Authorization"), + "average_pressure": MessageLookupByLibrary.simpleMessage( + "Средние показатели давления:", + ), + "back_to_chat": MessageLookupByLibrary.simpleMessage("Вернуться в чат"), + "bodymass_chart": MessageLookupByLibrary.simpleMessage("График ИМТ"), + "by_default": MessageLookupByLibrary.simpleMessage("По умолчанию"), + "calls_for_bullying": MessageLookupByLibrary.simpleMessage( + "Призывы к травле", + ), + "calories": MessageLookupByLibrary.simpleMessage("Калории"), + "can_not_choose_start_date": MessageLookupByLibrary.simpleMessage( + "Дату старта плана невозможно выбрать, пока Вы не привяжите карту", + ), + "can_not_load_data_please_try_again": MessageLookupByLibrary.simpleMessage( + "Не удалось загрузить данные. Попробуйте обновить страницу", + ), + "can_not_see_next_day": MessageLookupByLibrary.simpleMessage( + "Просмотр последующего дня возможен только при прохождении диеты", + ), + "cancel": MessageLookupByLibrary.simpleMessage("Отменить"), + "cancelConsultation": MessageLookupByLibrary.simpleMessage( + "Отменить консультацию", + ), + "cancel_diet": MessageLookupByLibrary.simpleMessage("Отменить диету?"), + "cancel_order": MessageLookupByLibrary.simpleMessage("Отменить заказ"), + "cannotDeleteAccount": MessageLookupByLibrary.simpleMessage( + "Не получилось удалить ваш аккаунт", + ), + "carb_type": MessageLookupByLibrary.simpleMessage("Мучное"), + "carb_type_desc": MessageLookupByLibrary.simpleMessage( + "Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы.", + ), + "carbohydrates": MessageLookupByLibrary.simpleMessage("Углеводы"), + "changeDiet": MessageLookupByLibrary.simpleMessage("Заменить диету"), + "chargeApproved": MessageLookupByLibrary.simpleMessage("Выплата одобрена"), + "chargeCollectionFailed": MessageLookupByLibrary.simpleMessage( + "Не удалось оформить выплату", + ), + "chat": MessageLookupByLibrary.simpleMessage("Чат"), + "check_out_video_recipe": MessageLookupByLibrary.simpleMessage( + "Посмотреть видео рецепт", + ), + "chest": MessageLookupByLibrary.simpleMessage("Грудь"), + "chest_circumference": MessageLookupByLibrary.simpleMessage("Обхват груди"), + "choose_date": MessageLookupByLibrary.simpleMessage("Выбрать дату"), + "choose_diet_duration": MessageLookupByLibrary.simpleMessage( + "Выберите срок диеты", + ), + "choose_plan_duration": MessageLookupByLibrary.simpleMessage( + "Выберите срок плана", + ), + "choose_plan_start_date": MessageLookupByLibrary.simpleMessage( + "Выберите дату старта плана питания", + ), + "choose_plan_start_date_with_personal_diet": + MessageLookupByLibrary.simpleMessage( + "Выберите дату старта плана питания с учетом составления персональной диеты", + ), + "choose_start_diet_date": MessageLookupByLibrary.simpleMessage( + "Выберите дату старты диеты. Она отобразиться у Вас в дневнике", + ), + "chosePlanType": MessageLookupByLibrary.simpleMessage("Выберите тип плана"), + "chose_plan_start_date_2": MessageLookupByLibrary.simpleMessage( + "Выберите дату старты плана. Она отобразиться в дневнике пользователя", + ), + "chosenPlanStartDateDescr": 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("Город проживания"), + "collectCharge": MessageLookupByLibrary.simpleMessage("Получить выплату"), + "comfort": MessageLookupByLibrary.simpleMessage("Комфорт"), + "comment": MessageLookupByLibrary.simpleMessage("комментарий"), + "commentForMeal": MessageLookupByLibrary.simpleMessage( + "Прокомментировать прием пищи", + ), + "comment_hint": MessageLookupByLibrary.simpleMessage("Комментарий"), + "comments": MessageLookupByLibrary.simpleMessage("Комментарии"), + "comments_plural": MessageLookupByLibrary.simpleMessage("комментариев"), + "complain": MessageLookupByLibrary.simpleMessage("Пожаловаться"), + "complaint": MessageLookupByLibrary.simpleMessage("Жалоба"), + "complaint_question": MessageLookupByLibrary.simpleMessage( + "Что именно в этом материале Вы считаете неприемлемым и нарушающим правила?", + ), + "complaint_sent": MessageLookupByLibrary.simpleMessage( + "Жалоба успешно отправлена", + ), + "complaint_sent_description": MessageLookupByLibrary.simpleMessage( + "Ваше обращение принято! Мы рассмотрим его в ближайшее время и примем необходимые меры. Спасибо за вашу бдительность и помощь в улучшении нашего сервиса.", + ), + "confirm": MessageLookupByLibrary.simpleMessage("Подтвердить"), + "congratsYouHaveFinishedPlan": MessageLookupByLibrary.simpleMessage( + "Поздравляем, Вы закончили план", + ), + "congratulations": MessageLookupByLibrary.simpleMessage("Поздравляем!"), + "consultantLeftComment": m0, + "consultations_count": MessageLookupByLibrary.simpleMessage( + "Кол-во проведенных консулдьтаций", + ), + "contactSupport": MessageLookupByLibrary.simpleMessage( + "Обратитесь в поддержку", + ), + "continueButton": MessageLookupByLibrary.simpleMessage("Продолжить"), + "continue_": MessageLookupByLibrary.simpleMessage("Продолжить"), + "copied": MessageLookupByLibrary.simpleMessage("cкопирован"), + "copied2": MessageLookupByLibrary.simpleMessage("Скопировано!"), + "copy": MessageLookupByLibrary.simpleMessage("Скопировать"), + "copy_link": MessageLookupByLibrary.simpleMessage("Скопировать ссылку"), + "copy_referral_link": MessageLookupByLibrary.simpleMessage( + "Скопировать пригласительную ссылку", + ), + "couldNotCancelOrder": MessageLookupByLibrary.simpleMessage( + "Не удалось отменить заказ", + ), + "could_not_cancel_diet": MessageLookupByLibrary.simpleMessage( + "Не удалось отменить диету", + ), + "could_not_delete_blog_post": MessageLookupByLibrary.simpleMessage( + "Не удалось удалить пост", + ), + "could_not_launch_video": MessageLookupByLibrary.simpleMessage( + "Не удалось запустить видео", + ), + "could_not_publish_blog_post": MessageLookupByLibrary.simpleMessage( + "Не удалось опубликовать пост", + ), + "could_not_publish_diet": MessageLookupByLibrary.simpleMessage( + "Не удалось опубликовать диету", + ), + "could_not_publish_recipe": MessageLookupByLibrary.simpleMessage( + "Не удалось опубликовать рецепт", + ), + "could_not_send_complain": MessageLookupByLibrary.simpleMessage( + "Не удалось отправить жалобу", + ), + "could_not_update_blog_post": MessageLookupByLibrary.simpleMessage( + "Не удалось обновить пост", + ), + "could_not_update_diet": MessageLookupByLibrary.simpleMessage( + "Не удалось обновить диету", + ), + "country": MessageLookupByLibrary.simpleMessage("Страна"), + "createPersonalDiet": MessageLookupByLibrary.simpleMessage( + "Составьте персональную диету", + ), + "create_diet": MessageLookupByLibrary.simpleMessage("Создание диеты"), + "cunsutation_was_paid_successfully": MessageLookupByLibrary.simpleMessage( + "Поздравляем, консультация успешно оплачена", + ), + "customer": MessageLookupByLibrary.simpleMessage("Покупатель"), + "customer_price": MessageLookupByLibrary.simpleMessage( + "Цена для покупателя", + ), + "date_has_ben_set": MessageLookupByLibrary.simpleMessage( + "Дата старта начала консультации установлена", + ), + "date_of_birth": MessageLookupByLibrary.simpleMessage("Дата рождения"), + "date_of_birth_error": MessageLookupByLibrary.simpleMessage( + "Некорректная дата рождения", + ), + "day": MessageLookupByLibrary.simpleMessage("День"), + "dayComment": MessageLookupByLibrary.simpleMessage( + "Комментарий ко всему дню", + ), + "dayCommentTitle": MessageLookupByLibrary.simpleMessage( + "Прокомментировать день", + ), + "days": MessageLookupByLibrary.simpleMessage("дней"), + "deception": MessageLookupByLibrary.simpleMessage("Обман"), + "delete": MessageLookupByLibrary.simpleMessage("Удалить"), + "deleteComment": MessageLookupByLibrary.simpleMessage( + "Удалить комментарий", + ), + "deleted": MessageLookupByLibrary.simpleMessage("Удалена"), + "diary": MessageLookupByLibrary.simpleMessage("Дневник"), + "diet": MessageLookupByLibrary.simpleMessage("Диета"), + "dietSuggestion": MessageLookupByLibrary.simpleMessage("Предложение диеты"), + "diet_author": MessageLookupByLibrary.simpleMessage("Автор диеты"), + "diet_has_been_sent_to_draft": MessageLookupByLibrary.simpleMessage( + "снята с публикации и перенесена в черновик", + ), + "diet_plan": MessageLookupByLibrary.simpleMessage("План диеты"), + "diet_started": MessageLookupByLibrary.simpleMessage("Диета уже начата"), + "diet_state": MessageLookupByLibrary.simpleMessage("Статус диеты"), + "diet_type": MessageLookupByLibrary.simpleMessage("Тип диеты"), + "do_you_have_hypertension_tendency": MessageLookupByLibrary.simpleMessage( + "Есть ли у вас гипертония?", + ), + "do_you_have_hypotension_tendency": MessageLookupByLibrary.simpleMessage( + "Есть ли у вас гипотония?", + ), + "do_you_take_pills": MessageLookupByLibrary.simpleMessage( + "Принимаете ли вы лекарства или бады?", + ), + "done": MessageLookupByLibrary.simpleMessage("Завершен"), + "down_pressure": MessageLookupByLibrary.simpleMessage( + "Нижние показатели давления:", + ), + "draft": MessageLookupByLibrary.simpleMessage("Черновик"), + "drafted": MessageLookupByLibrary.simpleMessage("Черновики"), + "drugs": MessageLookupByLibrary.simpleMessage("Наркотики"), + "eating_behavior": MessageLookupByLibrary.simpleMessage( + "Пищевое поведение", + ), + "eating_behavior_type": MessageLookupByLibrary.simpleMessage( + "Формирование пищевого поведения", + ), + "eating_behavior_type_desc": MessageLookupByLibrary.simpleMessage( + "Формирование здорового пищевого поведения — это процесс, который включает в себя изменение привычек и отношения к еде. Он направлен на то, чтобы помочь людям научиться правильно питаться и поддерживать здоровый образ жизни.Основные принципы формирования здорового пищевого поведения: \n● Разнообразие продуктов; \n● Сбалансированный рацион; \n● Питьевой режим; \n● Ограничение вредных продуктов; \n● Регулярные приёмы пищи; \n● Умеренность;Осознанное питание; \n● Физическая активность;", + ), + "eatvioIsAHelthyHabbit": MessageLookupByLibrary.simpleMessage( + "Итвио — это полезная привычка", + ), + "economy": MessageLookupByLibrary.simpleMessage("Эконом"), + "edit": MessageLookupByLibrary.simpleMessage("Редактировать"), + "email": MessageLookupByLibrary.simpleMessage("Электронная почта"), + "email_empty": MessageLookupByLibrary.simpleMessage( + "Необходимо ввести адрес электронной почты", + ), + "email_error": MessageLookupByLibrary.simpleMessage( + "Некорректный адрес электронной почты", + ), + "email_invalid": MessageLookupByLibrary.simpleMessage( + "Некорректный адрес электронной почты", + ), + "end_previous_plan": MessageLookupByLibrary.simpleMessage( + "Закончите прохождение предыдущего плана", + ), + "enter_additional_information": MessageLookupByLibrary.simpleMessage( + "Введите любую дополнительную информацию на своё усмотрение:", + ), + "enter_diet_description": MessageLookupByLibrary.simpleMessage( + "Введите описание диеты", + ), + "enter_diet_name": MessageLookupByLibrary.simpleMessage( + "Выведите название диеты", + ), + "enter_information": MessageLookupByLibrary.simpleMessage( + "Введите информацию...", + ), + "error_desc": MessageLookupByLibrary.simpleMessage( + "Произошла ошибка. Мы уже работаем над её устранением. Попробуйте позже", + ), + "exit": MessageLookupByLibrary.simpleMessage("Выйти"), + "expand": MessageLookupByLibrary.simpleMessage("Показать полностью"), + "explainResonOfCancelation": MessageLookupByLibrary.simpleMessage( + "Опишите причину отказа", + ), + "explicitImage": MessageLookupByLibrary.simpleMessage( + "Откровенное изображение", + ), + "explicitImages": MessageLookupByLibrary.simpleMessage( + "Откровенные изображения", + ), + "explicitImagesDescription": MessageLookupByLibrary.simpleMessage( + "Отправьте жалобу, если кто-то разместил откровенные изображения", + ), + "extremism": MessageLookupByLibrary.simpleMessage("Экстремизм"), + "fake_documents": MessageLookupByLibrary.simpleMessage( + "Поддельные документы", + ), + "fats": MessageLookupByLibrary.simpleMessage("Жиры"), + "favorite_foods": MessageLookupByLibrary.simpleMessage("Любимые продукты"), + "favorite_unfavorite_foods": MessageLookupByLibrary.simpleMessage( + "Ваши любимые/нелюбимые продукты питания?", + ), + "female": MessageLookupByLibrary.simpleMessage("Женский"), + "female_short": MessageLookupByLibrary.simpleMessage("Ж"), + "fillYasterday": 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 символ", + ), + "first_name_validation_error": MessageLookupByLibrary.simpleMessage( + "Имя обязательно к заполнению", + ), + "fit_type": MessageLookupByLibrary.simpleMessage("Поддержание формы"), + "fit_type_desc": MessageLookupByLibrary.simpleMessage( + "План питания для поддержания формы сбалансированный и разнообразный, чтобы обеспечить организм всеми необходимыми питательными веществами. Общие принципы: \n● Дробное питание; \n● Разнообразие продуктов; \n● Контроль порций; \n● Питьевой режим; \n● Ограничение вредных продуктов;", + ), + "fitness": MessageLookupByLibrary.simpleMessage("Поддержка формы"), + "for_a_month": MessageLookupByLibrary.simpleMessage("За месяц"), + "for_a_week": MessageLookupByLibrary.simpleMessage("За неделю"), + "for_a_year": MessageLookupByLibrary.simpleMessage("За год"), + "for_whole_period_of_time": MessageLookupByLibrary.simpleMessage( + "За всё время", + ), + "fourteenDays": MessageLookupByLibrary.simpleMessage("14 дней"), + "fraud": MessageLookupByLibrary.simpleMessage("Мошенничество"), + "fraud_description": MessageLookupByLibrary.simpleMessage( + "Мошенничество с целью наживы. Если вас обманули, пожалуйста, сообщите об этом в правоохранительные органы.", + ), + "from": MessageLookupByLibrary.simpleMessage("от"), + "from_a_to_z": MessageLookupByLibrary.simpleMessage("Название: А-Я"), + "from_z_to_a": MessageLookupByLibrary.simpleMessage("Название: Я-А"), + "gallery": MessageLookupByLibrary.simpleMessage("Галерея"), + "gender_error": MessageLookupByLibrary.simpleMessage("Выберите пол"), + "general_info": MessageLookupByLibrary.simpleMessage("Общая информация"), + "goToMyDiets": MessageLookupByLibrary.simpleMessage( + "Перейти к моим диетам", + ), + "go_to_diary": MessageLookupByLibrary.simpleMessage("Перейти в дневник"), + "gr": MessageLookupByLibrary.simpleMessage("гр"), + "grams": MessageLookupByLibrary.simpleMessage("гр"), + "has_alergy": MessageLookupByLibrary.simpleMessage("Наличие аллергии"), + "has_hyper": MessageLookupByLibrary.simpleMessage( + "Склонность к гипертонии", + ), + "has_hypo": MessageLookupByLibrary.simpleMessage("Склонность к гипотонии"), + "has_not_filled_it_yet": MessageLookupByLibrary.simpleMessage( + "ещё не закончил(a) этот день", + ), + "hatred": MessageLookupByLibrary.simpleMessage("Оскорбление"), + "hatred_description": MessageLookupByLibrary.simpleMessage( + "Враждебные высказывания", + ), + "height": MessageLookupByLibrary.simpleMessage("Рост"), + "height_error": MessageLookupByLibrary.simpleMessage("Введите рост"), + "height_measurements": MessageLookupByLibrary.simpleMessage("Замер роста"), + "hide": MessageLookupByLibrary.simpleMessage("Свернуть"), + "hip_circumference": MessageLookupByLibrary.simpleMessage("Обхват бедер"), + "hips": MessageLookupByLibrary.simpleMessage("Бедра"), + "hour": MessageLookupByLibrary.simpleMessage("час"), + "hours": MessageLookupByLibrary.simpleMessage("часов"), + "in_progress": MessageLookupByLibrary.simpleMessage("В процессе"), + "inactive_diet_state": MessageLookupByLibrary.simpleMessage("Черновик"), + "infoAboutOrder": MessageLookupByLibrary.simpleMessage( + "Информация о заказе", + ), + "ingredients": MessageLookupByLibrary.simpleMessage("Ингредиенты"), + "initial_measurements": MessageLookupByLibrary.simpleMessage( + "Первичные замеры", + ), + "invite": MessageLookupByLibrary.simpleMessage("Пригласить"), + "invited_people_count": MessageLookupByLibrary.simpleMessage( + "Количество приглашенных", + ), + "itCantBeRecovered": MessageLookupByLibrary.simpleMessage( + "Его нельзя будет восстановить", + ), + "label": MessageLookupByLibrary.simpleMessage("Название"), + "language": MessageLookupByLibrary.simpleMessage("Язык"), + "last_name": MessageLookupByLibrary.simpleMessage("Фамилия"), + "last_name_empty": MessageLookupByLibrary.simpleMessage( + "Фамилия обязательна для заполнения", + ), + "last_name_error": MessageLookupByLibrary.simpleMessage( + "Фамилия обязательна для заполнения", + ), + "last_name_short": MessageLookupByLibrary.simpleMessage( + "В фамилии должен быть минимум 6 символов", + ), + "last_step": MessageLookupByLibrary.simpleMessage("Последний шаг"), + "lawViolation": MessageLookupByLibrary.simpleMessage( + "Нарушение законодательства", + ), + "lbl_english": MessageLookupByLibrary.simpleMessage("English"), + "leaveComplainRequest": MessageLookupByLibrary.simpleMessage( + "Подать жалобу", + ), + "letsInvite": MessageLookupByLibrary.simpleMessage( + "Давайте пригласим близких в итвио", + ), + "light_type": MessageLookupByLibrary.simpleMessage("Легкая"), + "light_type_desc": MessageLookupByLibrary.simpleMessage( + "С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками.", + ), + "liked_groceries": MessageLookupByLibrary.simpleMessage("Любимые продукты"), + "link_was_copied": MessageLookupByLibrary.simpleMessage( + "Ссылка успешно скопирована", + ), + "loading": MessageLookupByLibrary.simpleMessage("Загрузка..."), + "login": MessageLookupByLibrary.simpleMessage("Войти в аккаунт"), + "lower": MessageLookupByLibrary.simpleMessage("Нижнее"), + "mail_was_copied": MessageLookupByLibrary.simpleMessage( + "Почта успешно скопирована", + ), + "male": MessageLookupByLibrary.simpleMessage("Мужской"), + "male_short": MessageLookupByLibrary.simpleMessage("М"), + "markAsRead": MessageLookupByLibrary.simpleMessage( + "Отметить всё прочитанным", + ), + "meal": MessageLookupByLibrary.simpleMessage("Приём пищи"), + "mealComment": MessageLookupByLibrary.simpleMessage( + "Комментарий к приему пищи", + ), + "meat": MessageLookupByLibrary.simpleMessage("Мясо"), + "meat_type": MessageLookupByLibrary.simpleMessage("С мясом"), + "meat_type_desc": MessageLookupByLibrary.simpleMessage( + "Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму.", + ), + "milliliter": MessageLookupByLibrary.simpleMessage("мл"), + "minPlanPrice": MessageLookupByLibrary.simpleMessage( + "Минимальная сумма 1200₽", + ), + "minimal_customer_price": MessageLookupByLibrary.simpleMessage( + "Минимальная цена для покупателя: 1200₽", + ), + "minute": MessageLookupByLibrary.simpleMessage("минута"), + "minutes": MessageLookupByLibrary.simpleMessage("минуты"), + "misrepresentation": MessageLookupByLibrary.simpleMessage( + "Введение в заблуждение", + ), + "misrepresentation_description": MessageLookupByLibrary.simpleMessage( + "Новости, которые могут вызвать широкий резонанс или несут угрозу, распространяемые с целью введения людей в заблуждение.", + ), + "moneySentToCard": MessageLookupByLibrary.simpleMessage( + "Средства отправлены на карту", + ), + "more_about_order": MessageLookupByLibrary.simpleMessage( + "Подробнее о заказе", + ), + "most_new": MessageLookupByLibrary.simpleMessage("Самые новые"), + "most_old": MessageLookupByLibrary.simpleMessage("Самые старые"), + "msg_network_err": MessageLookupByLibrary.simpleMessage("Сетевая ошибка!"), + "msg_something_went_wrong": MessageLookupByLibrary.simpleMessage( + "Что то пошло не так!", + ), + "my_blog": MessageLookupByLibrary.simpleMessage("Мой блог"), + "my_cards": MessageLookupByLibrary.simpleMessage("Мои карты"), + "my_diets": MessageLookupByLibrary.simpleMessage("Мои диеты"), + "my_plans": MessageLookupByLibrary.simpleMessage("Мои планы"), + "my_settings": MessageLookupByLibrary.simpleMessage("Мои настройки"), + "name_empty": MessageLookupByLibrary.simpleMessage( + "Имя пользователя обязательно для заполнения", + ), + "name_short": MessageLookupByLibrary.simpleMessage( + "В имени пользователя должно быть минимум 6 символов", + ), + "new_card": MessageLookupByLibrary.simpleMessage("Добавить карту"), + "next": MessageLookupByLibrary.simpleMessage("Далее"), + "nicotine": MessageLookupByLibrary.simpleMessage("Никотин"), + "no": MessageLookupByLibrary.simpleMessage("Нет"), + "no_account": MessageLookupByLibrary.simpleMessage("У меня нет аккаунта"), + "no_default_cards": MessageLookupByLibrary.simpleMessage( + "У вас нет привязанных карт. Что бы начать работу, привяжите карту", + ), + "not_liked_groceries": MessageLookupByLibrary.simpleMessage( + "Не любимые продукты", + ), + "notifications": MessageLookupByLibrary.simpleMessage("Уведомления"), + "ok": MessageLookupByLibrary.simpleMessage("Хорошо"), + "one_option": MessageLookupByLibrary.simpleMessage("1 опция"), + "option": MessageLookupByLibrary.simpleMessage("Опция"), + "option_content": MessageLookupByLibrary.simpleMessage("Содержание опции"), + "option_content_hint_text": MessageLookupByLibrary.simpleMessage( + "На связи 7 дней в неделю", + ), + "option_desc": MessageLookupByLibrary.simpleMessage("Описание опции"), + "option_desc_hint_text": MessageLookupByLibrary.simpleMessage( + "Этот план питания для похудения на 7 дней сбалансированный и разнообразный", + ), + "option_duration": MessageLookupByLibrary.simpleMessage( + "Продолжительность опции", + ), + "option_personal_diet_desc": MessageLookupByLibrary.simpleMessage( + "Опция подразумевает создание индивидуальной диеты", + ), + "option_title": MessageLookupByLibrary.simpleMessage("Заголовок опции"), + "order": MessageLookupByLibrary.simpleMessage("Порядок"), + "orderCanceled": MessageLookupByLibrary.simpleMessage("Заказ отменен"), + "order_created": MessageLookupByLibrary.simpleMessage("Заказ создан"), + "order_paid": MessageLookupByLibrary.simpleMessage("Заказ оплачен"), + "order_price": MessageLookupByLibrary.simpleMessage("Сумма заказа"), + "order_status": MessageLookupByLibrary.simpleMessage("Статус заказа"), + "orederCancelation": MessageLookupByLibrary.simpleMessage("Отмена заказа"), + "other": MessageLookupByLibrary.simpleMessage("Другое"), + "other_info": MessageLookupByLibrary.simpleMessage("Прочая информация"), + "password": MessageLookupByLibrary.simpleMessage("Пароль"), + "password_confirmation": MessageLookupByLibrary.simpleMessage( + "Подтвердите пароль", + ), + "password_confirmation_mismatch": MessageLookupByLibrary.simpleMessage( + "Пароли не совпадают", + ), + "password_desc": MessageLookupByLibrary.simpleMessage( + "Сохраните его в надежном месте! Вы сможете изменить пароль в настройках профиля", + ), + "password_empty": MessageLookupByLibrary.simpleMessage( + "Пароль обязателен для заполнения", + ), + "password_short": MessageLookupByLibrary.simpleMessage( + "В пароле должно быть минимум 6 символов", + ), + "pay": MessageLookupByLibrary.simpleMessage("Оплатить"), + "payment_failed": MessageLookupByLibrary.simpleMessage("Оплата не прошла"), + "pcs": MessageLookupByLibrary.simpleMessage("шт"), + "pending_payment": MessageLookupByLibrary.simpleMessage("Ожидается оплата"), + "personal": MessageLookupByLibrary.simpleMessage("Персональные"), + "personalDietCreating": MessageLookupByLibrary.simpleMessage( + "Составление индивидуальной диеты", + ), + "personal_diet_set": MessageLookupByLibrary.simpleMessage( + "Персональная диета установлена", + ), + "personal_diet_state": MessageLookupByLibrary.simpleMessage("Персональная"), + "phisical_activity": MessageLookupByLibrary.simpleMessage( + "Уровень физической активности", + ), + "phone": MessageLookupByLibrary.simpleMessage("Телефон"), + "phone_error": MessageLookupByLibrary.simpleMessage( + "Некорректный номер телефона", + ), + "photo": MessageLookupByLibrary.simpleMessage("Фото"), + "physical_fitness": MessageLookupByLibrary.simpleMessage( + "Физическая форма", + ), + "place_of_living": MessageLookupByLibrary.simpleMessage("Место проживания"), + "planStarted": m1, + "planWillBeConfirmedAfterThreeDays": MessageLookupByLibrary.simpleMessage( + "Если вы не подтвердите, то план через три дня подтвердится автоматически", + ), + "planWithUserStarted": m2, + "plan_author": MessageLookupByLibrary.simpleMessage("Автор плана"), + "plan_desc": MessageLookupByLibrary.simpleMessage("Описание плана"), + "plan_desc_example": MessageLookupByLibrary.simpleMessage( + "Большое подробное, привлекательное описание плана", + ), + "plan_duration": MessageLookupByLibrary.simpleMessage("Срок плана"), + "plan_label_desc": MessageLookupByLibrary.simpleMessage( + "План для поддержания формы", + ), + "plan_seller": MessageLookupByLibrary.simpleMessage("Продавец плана"), + "plan_type": MessageLookupByLibrary.simpleMessage("Тип плана"), + "plans_complete": MessageLookupByLibrary.simpleMessage("Пройденные планы"), + "pleaseConfirmPlan": MessageLookupByLibrary.simpleMessage( + "Просим вас подтвердить прохождение плана", + ), + "please_try_again_later": MessageLookupByLibrary.simpleMessage( + "Пожалуйста, попробуйте еще раз позже", + ), + "popular": MessageLookupByLibrary.simpleMessage("Популярные"), + "preferred_language": MessageLookupByLibrary.simpleMessage( + "Предпочитаемый язык общения", + ), + "pressure": MessageLookupByLibrary.simpleMessage("Давление"), + "pressure_empty": MessageLookupByLibrary.simpleMessage( + "Все показатели давления обязательны к заполнению", + ), + "pressure_is_not_a_number": MessageLookupByLibrary.simpleMessage( + "Все показатели давления должны быть числами", + ), + "preview": MessageLookupByLibrary.simpleMessage("Превью"), + "price": MessageLookupByLibrary.simpleMessage("Цена"), + "price_explanation": MessageLookupByLibrary.simpleMessage( + "Разница в ценах, это комиссия Итвио", + ), + "profile": MessageLookupByLibrary.simpleMessage("Профиль"), + "prostitution": MessageLookupByLibrary.simpleMessage("Проституция"), + "proteins": MessageLookupByLibrary.simpleMessage("Белки"), + "public_diet_state": MessageLookupByLibrary.simpleMessage("Публичная"), + "publish": MessageLookupByLibrary.simpleMessage("Опубликовать"), + "published": MessageLookupByLibrary.simpleMessage("Опубликованные"), + "published_diets_count": MessageLookupByLibrary.simpleMessage( + "Кол-во опубликованных диет", + ), + "published_posts_count": MessageLookupByLibrary.simpleMessage( + "Количество опубликованных постов", + ), + "published_recipes_count": MessageLookupByLibrary.simpleMessage( + "Кол-во опубликованных рецептов", + ), + "rating_and_statistics": MessageLookupByLibrary.simpleMessage( + "Рейтинг и статистика", + ), + "rating_history": MessageLookupByLibrary.simpleMessage( + "Начисление рейтинга", + ), + "reasonExample": MessageLookupByLibrary.simpleMessage("Заказал по ошибке"), + "recipe_author": MessageLookupByLibrary.simpleMessage("Автор рецепта"), + "recipe_publishing": MessageLookupByLibrary.simpleMessage( + "Публикация рецепта", + ), + "refuse_order": MessageLookupByLibrary.simpleMessage( + "Отказаться от заказа", + ), + "register": MessageLookupByLibrary.simpleMessage("Зарегистрироваться"), + "registration_completed": MessageLookupByLibrary.simpleMessage( + "Регистрация завершена!", + ), + "removeFromActive": MessageLookupByLibrary.simpleMessage( + "Снять с публикации", + ), + "reply": MessageLookupByLibrary.simpleMessage("Ответить"), + "resend": MessageLookupByLibrary.simpleMessage("Отправить повторно"), + "save": MessageLookupByLibrary.simpleMessage("Сохранить"), + "send": MessageLookupByLibrary.simpleMessage("Отправить"), + "send_complain": MessageLookupByLibrary.simpleMessage("Отправить жалобу"), + "services": MessageLookupByLibrary.simpleMessage("Оказание услуг"), + "settings": MessageLookupByLibrary.simpleMessage("Настройки"), + "sex": MessageLookupByLibrary.simpleMessage("Пол"), + "share": MessageLookupByLibrary.simpleMessage("Поделиться"), + "signUpFailed": MessageLookupByLibrary.simpleMessage( + "Регистрация не удалась!", + ), + "skip": MessageLookupByLibrary.simpleMessage("Пропустить"), + "slim": MessageLookupByLibrary.simpleMessage("Похудение"), + "slim_type": MessageLookupByLibrary.simpleMessage("Похудение"), + "slim_type_desc": MessageLookupByLibrary.simpleMessage( + "План питания для похудения должен быть разработан с учётом индивидуальных особенностей организма, возраста, пола, уровня физической активности и состояния здоровья. Общие принципы: \n● Снижение калорийности; \n● Сбалансированный рацион; \n● Разнообразие продуктов; \n● Питьевой режим; \n● Ограничение вредных продуктов;", + ), + "smth_went_wrong_payment_failed": MessageLookupByLibrary.simpleMessage( + "Что-то пошло не так, оплата не прошла", + ), + "some_error_occurred": MessageLookupByLibrary.simpleMessage( + "Упс! Произошла ошибка", + ), + "some_error_occurred_description": MessageLookupByLibrary.simpleMessage( + "Произошла ошибка. Мы уже работаем над ее устранением. Попробуйте позже.", + ), + "something_went_wrong": MessageLookupByLibrary.simpleMessage( + "Упс! Что-то пошло не так", + ), + "sorry_we_did_not_find_the_plan": MessageLookupByLibrary.simpleMessage( + "Извините, план где-то потерялся, мы уже ищем его", + ), + "spam": MessageLookupByLibrary.simpleMessage("Спам"), + "spam_description": MessageLookupByLibrary.simpleMessage( + "Отправьте жалобу, если Вы заметили рекламу, размещенную в не предназначенном для этого месте.", + ), + "sport_hobbies": MessageLookupByLibrary.simpleMessage( + "Спортивные увлечения", + ), + "stage": MessageLookupByLibrary.simpleMessage("этап"), + "stages": MessageLookupByLibrary.simpleMessage("этапов"), + "standard": MessageLookupByLibrary.simpleMessage("Стандарт"), + "startDateHasBeenSet": MessageLookupByLibrary.simpleMessage( + "Выбрана дата старта", + ), + "startDiet": MessageLookupByLibrary.simpleMessage("Начать диету"), + "statistic": MessageLookupByLibrary.simpleMessage("Статистика"), + "step": MessageLookupByLibrary.simpleMessage("Шаг"), + "step_by_step_photo_recipe": MessageLookupByLibrary.simpleMessage( + "Пошаговый фоторецепт", + ), + "step_widget": m3, + "successfully_published": MessageLookupByLibrary.simpleMessage( + "успешно опубликован", + ), + "suggestDiet": MessageLookupByLibrary.simpleMessage("Предложить диету"), + "suicide": MessageLookupByLibrary.simpleMessage("Склонение к самоубийству"), + "takes_pills": MessageLookupByLibrary.simpleMessage("Принимает лекарства"), + "tap_on_link_to_pay": MessageLookupByLibrary.simpleMessage( + "Перейдите по ссылке для оплаты консультации", + ), + "tell_your_schedule": MessageLookupByLibrary.simpleMessage( + "Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:", + ), + "text_was_copied": MessageLookupByLibrary.simpleMessage( + "Text copied successfully", + ), + "there_is_a_video": MessageLookupByLibrary.simpleMessage("Есть видео"), + "three_options": MessageLookupByLibrary.simpleMessage("3 опции"), + "time": MessageLookupByLibrary.simpleMessage("Время прохождения"), + "time_to_complete_plan": MessageLookupByLibrary.simpleMessage( + "Время выполнения плана", + ), + "toOffer": MessageLookupByLibrary.simpleMessage("Предложить"), + "to_draft": MessageLookupByLibrary.simpleMessage("В черновик"), + "to_order": MessageLookupByLibrary.simpleMessage("Заказать"), + "tommorowPlanWithUserWillStart": m4, + "tomorrowYourPlanWillStart": m5, + "try_again": MessageLookupByLibrary.simpleMessage("Попробовать снова"), + "try_again_2": MessageLookupByLibrary.simpleMessage("Попробуйте ещё раз"), + "typeAmoutOfReturn": MessageLookupByLibrary.simpleMessage( + "Укажите сумму которую вы хотите вернуть", + ), + "typeDayComment": MessageLookupByLibrary.simpleMessage( + "Как можно подробнее прокомментируйте дневник пользователя", + ), + "typeMealComment": MessageLookupByLibrary.simpleMessage( + "Как можно подробнее прокомментируйте прием пищи", + ), + "typePortionComment": MessageLookupByLibrary.simpleMessage( + "Прокомментируйте блюдо", + ), + "type_email": MessageLookupByLibrary.simpleMessage("Введите email"), + "type_height": MessageLookupByLibrary.simpleMessage("Введите рост"), + "type_here_your_complaint": MessageLookupByLibrary.simpleMessage( + "Напишите здесь свою жалобу", + ), + "type_weight": MessageLookupByLibrary.simpleMessage("Введите вес"), + "unfavorite_foods": MessageLookupByLibrary.simpleMessage( + "Нелюбимые продукты", + ), + "up_pressure": MessageLookupByLibrary.simpleMessage( + "Верхние показатели давления:", + ), + "upper": MessageLookupByLibrary.simpleMessage("Верхнее"), + "userCanceldThePlanSubscription": m6, + "userConfirmedPlanCompletion": MessageLookupByLibrary.simpleMessage( + "Пользователь подтвердил прохождения плана. В ближайшее время Вы получите", + ), + "userConfirmedPlanCompletionWithoutSum": + MessageLookupByLibrary.simpleMessage( + "Пользователь подтвердил прохождения плана.", + ), + "userPaidThePlan": m7, + "userSubscribedToPlan": m8, + "user_authorization": MessageLookupByLibrary.simpleMessage( + "Аутентификация", + ), + "user_data": MessageLookupByLibrary.simpleMessage("Данные пользователя"), + "user_data_desc": MessageLookupByLibrary.simpleMessage( + "Эти данные нужны для корректной работы дневника питания и расчета вашей дневной нормы потребления КБЖУ", + ), + "user_info": MessageLookupByLibrary.simpleMessage("Анкета пользователя"), + "user_registration": MessageLookupByLibrary.simpleMessage( + "Регистрация пользователя", + ), + "username": MessageLookupByLibrary.simpleMessage("Имя пользователя"), + "vegan": MessageLookupByLibrary.simpleMessage("Веган."), + "vegan_type": MessageLookupByLibrary.simpleMessage("Вегетарианская"), + "vegan_type_desc": MessageLookupByLibrary.simpleMessage( + "Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья.", + ), + "violenceAndHostility": MessageLookupByLibrary.simpleMessage( + "Насилие и вражда", + ), + "violence_against_people_or_animal": MessageLookupByLibrary.simpleMessage( + "Насилие над людьми или животными", + ), + "waist": MessageLookupByLibrary.simpleMessage("Талия"), + "waist_circumference": MessageLookupByLibrary.simpleMessage("Обхват талии"), + "wait_for_start_day": MessageLookupByLibrary.simpleMessage( + "Ожидайте начала плана питания", + ), + "want_to_see_tomorrow": MessageLookupByLibrary.simpleMessage( + "Хотите заглянуть в будущее?", + ), + "weAreLookingFor": MessageLookupByLibrary.simpleMessage( + "Мы собираем самое большое сообщество людей, желающих вести здоровый образ жизни!", + ), + "weapon": MessageLookupByLibrary.simpleMessage("Оружие"), + "weight": MessageLookupByLibrary.simpleMessage("Вес"), + "weight_chart": MessageLookupByLibrary.simpleMessage("График веса"), + "weight_error": MessageLookupByLibrary.simpleMessage("Введите вес"), + "weight_measurements": MessageLookupByLibrary.simpleMessage("Замер веса"), + "wellness": MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), + "wellness_type": MessageLookupByLibrary.simpleMessage( + "Улучшение самочувствия", + ), + "wellness_type_desc": MessageLookupByLibrary.simpleMessage( + "Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы.", + ), + "what_do_you_want_to_complaint_about": MessageLookupByLibrary.simpleMessage( + "На что Вы хотите пожаловаться?", + ), + "what_is_your_name": MessageLookupByLibrary.simpleMessage("Как вас зовут?"), + "wrong_credentials": MessageLookupByLibrary.simpleMessage( + "Неверные данные пользователя", + ), + "youCanComplain": MessageLookupByLibrary.simpleMessage( + "Если вас что-то не устроило, вы можете подать жалобу", + ), + "youCanceledSubscriptionToPlan": m9, + "youShureYouWantToCancelOrder": MessageLookupByLibrary.simpleMessage( + "Вы уверены, что хотите отменить заказ?", + ), + "youShureYouWantToDeleteAccount": MessageLookupByLibrary.simpleMessage( + "Вы уверены, что хотите удалить аккаунт?", + ), + "youWithUs": MessageLookupByLibrary.simpleMessage("Вы с итвио уже\n"), + "you_can_not_open_this_day": MessageLookupByLibrary.simpleMessage( + "Вы не можете перейти в этот день", + ), + "you_can_not_start_plan_until_end_of_prev_one": + MessageLookupByLibrary.simpleMessage( + "Вы не можете начать план, пока не закончите прохождение предыдущего", + ), + "you_will_get": MessageLookupByLibrary.simpleMessage("Вы получите"), + "your_blood_pressure": MessageLookupByLibrary.simpleMessage( + "Ваше артериальное давление?", + ), + "your_favorite_sports": MessageLookupByLibrary.simpleMessage( + "Ваши спортивные увлечения?", + ), + "your_gender": MessageLookupByLibrary.simpleMessage("Ваш пол?"), + "your_height": MessageLookupByLibrary.simpleMessage("Ваш рост:"), + "your_last_name": MessageLookupByLibrary.simpleMessage("Ваша фамилия"), + "your_name": MessageLookupByLibrary.simpleMessage("Ваше имя"), + "your_rating": 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 index 9d334dc3..11fd6fb1 100644 --- a/lib/generated/intl/messages_ru.dart +++ b/lib/generated/intl/messages_ru.dart @@ -7,7 +7,8 @@ // 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 +// 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'; @@ -20,223 +21,364 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'ru'; final messages = _notInlinedMessages(_notInlinedMessages); - static _notInlinedMessages(_) => { - "Moscow" : MessageLookupByLibrary.simpleMessage("Москва"), - "Russia" : MessageLookupByLibrary.simpleMessage("Россия"), - "about_diet" : MessageLookupByLibrary.simpleMessage("Об этой диете"), - "about_plan" : MessageLookupByLibrary.simpleMessage("Об этом плане"), - "active" : MessageLookupByLibrary.simpleMessage("Активен"), - "active_diet_state" : MessageLookupByLibrary.simpleMessage("Активная"), - "add" : MessageLookupByLibrary.simpleMessage("Добавить"), - "add_cover" : MessageLookupByLibrary.simpleMessage("Добавьте обложку"), - "add_measure" : MessageLookupByLibrary.simpleMessage("Добавить замер"), - "adding_plan" : MessageLookupByLibrary.simpleMessage("Добавление плана"), - "additional_information" : MessageLookupByLibrary.simpleMessage("Дополнительная информация"), - "admin" : MessageLookupByLibrary.simpleMessage("Админ"), - "all" : MessageLookupByLibrary.simpleMessage("Все"), - "allergies_presence" : 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("График ИМТ"), - "by_default" : MessageLookupByLibrary.simpleMessage("По умолчанию"), - "calories" : MessageLookupByLibrary.simpleMessage("Калории"), - "carb_type" : MessageLookupByLibrary.simpleMessage("Мучное"), - "carb_type_desc" : MessageLookupByLibrary.simpleMessage("Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы."), - "carbohydrates" : MessageLookupByLibrary.simpleMessage("Углеводы"), - "chat" : MessageLookupByLibrary.simpleMessage("Чат"), - "chest" : MessageLookupByLibrary.simpleMessage("Грудь"), - "chest_circumference" : MessageLookupByLibrary.simpleMessage("Обхват груди"), - "choose_diet_duration" : MessageLookupByLibrary.simpleMessage("Выберите срок диеты"), - "choose_plan_duration" : MessageLookupByLibrary.simpleMessage("Выберите срок плана"), - "choose_start_diet_date" : 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("Город проживания"), - "comfort" : MessageLookupByLibrary.simpleMessage("Комфорт"), - "comment" : MessageLookupByLibrary.simpleMessage("комментарий"), - "comment_hint" : MessageLookupByLibrary.simpleMessage("Комментарий"), - "comments" : MessageLookupByLibrary.simpleMessage("Комментарии"), - "comments_plural" : MessageLookupByLibrary.simpleMessage("комментариев"), - "complain" : MessageLookupByLibrary.simpleMessage("Пожаловаться"), - "continueButton" : MessageLookupByLibrary.simpleMessage("Продолжить"), - "continue_" : MessageLookupByLibrary.simpleMessage("Продолжить"), - "copied" : MessageLookupByLibrary.simpleMessage("cкопирован"), - "copy_link" : MessageLookupByLibrary.simpleMessage("Скопировать ссылку"), - "country" : MessageLookupByLibrary.simpleMessage("Страна"), - "create_diet" : MessageLookupByLibrary.simpleMessage("Создание диеты"), - "customer_price" : MessageLookupByLibrary.simpleMessage("Цена для покупателя"), - "date_of_birth" : MessageLookupByLibrary.simpleMessage("Дата рождения"), - "day" : MessageLookupByLibrary.simpleMessage("День"), - "days" : MessageLookupByLibrary.simpleMessage("дней"), - "deleted" : MessageLookupByLibrary.simpleMessage("Удалена"), - "diary" : MessageLookupByLibrary.simpleMessage("Дневник"), - "diet" : MessageLookupByLibrary.simpleMessage("Диета"), - "diet_author" : MessageLookupByLibrary.simpleMessage("Автор диеты"), - "diet_plan" : MessageLookupByLibrary.simpleMessage("План диеты"), - "diet_state" : MessageLookupByLibrary.simpleMessage("Статус диеты"), - "diet_type" : 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("Черновик"), - "drafted" : MessageLookupByLibrary.simpleMessage("Черновики"), - "eating_behavior" : MessageLookupByLibrary.simpleMessage("Пищевое поведение"), - "eating_behavior_type" : MessageLookupByLibrary.simpleMessage("Формирование пищевого поведения"), - "eating_behavior_type_desc" : MessageLookupByLibrary.simpleMessage("Формирование здорового пищевого поведения — это процесс, который включает в себя изменение привычек и отношения к еде. Он направлен на то, чтобы помочь людям научиться правильно питаться и поддерживать здоровый образ жизни.Основные принципы формирования здорового пищевого поведения: \n● Разнообразие продуктов; \n● Сбалансированный рацион; \n● Питьевой режим; \n● Ограничение вредных продуктов; \n● Регулярные приёмы пищи; \n● Умеренность;Осознанное питание; \n● Физическая активность;"), - "economy" : MessageLookupByLibrary.simpleMessage("Эконом"), - "edit" : MessageLookupByLibrary.simpleMessage("Редактировать"), - "email" : MessageLookupByLibrary.simpleMessage("Электронная почта"), - "email_empty" : MessageLookupByLibrary.simpleMessage("Необходимо ввести адрес электронной почты"), - "email_invalid" : MessageLookupByLibrary.simpleMessage("Некорректный адрес электронной почты"), - "enter_additional_information" : MessageLookupByLibrary.simpleMessage("Введите любую дополнительную информацию на своё усмотрение:"), - "enter_diet_description" : MessageLookupByLibrary.simpleMessage("Введите описание диеты"), - "enter_diet_name" : MessageLookupByLibrary.simpleMessage("Выведите название диеты"), - "enter_information" : MessageLookupByLibrary.simpleMessage("Введите информацию..."), - "exit" : MessageLookupByLibrary.simpleMessage("Выйти"), - "expand" : MessageLookupByLibrary.simpleMessage("Показать полностью"), - "fats" : 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 символ"), - "fit_type" : MessageLookupByLibrary.simpleMessage("Поддержание формы"), - "fit_type_desc" : MessageLookupByLibrary.simpleMessage("План питания для поддержания формы сбалансированный и разнообразный, чтобы обеспечить организм всеми необходимыми питательными веществами. Общие принципы: \n● Дробное питание; \n● Разнообразие продуктов; \n● Контроль порций; \n● Питьевой режим; \n● Ограничение вредных продуктов;"), - "fitness" : MessageLookupByLibrary.simpleMessage("Поддержка формы"), - "from" : MessageLookupByLibrary.simpleMessage("от"), - "from_a_to_z" : MessageLookupByLibrary.simpleMessage("Название: А-Я"), - "from_z_to_a" : MessageLookupByLibrary.simpleMessage("Название: Я-А"), - "gallery" : MessageLookupByLibrary.simpleMessage("Галерея"), - "gr" : MessageLookupByLibrary.simpleMessage("гр"), - "grams" : MessageLookupByLibrary.simpleMessage("гр"), - "height_measurements" : MessageLookupByLibrary.simpleMessage("Замер роста"), - "hide" : MessageLookupByLibrary.simpleMessage("Свернуть"), - "hip_circumference" : MessageLookupByLibrary.simpleMessage("Обхват бедер"), - "hips" : MessageLookupByLibrary.simpleMessage("Бедра"), - "in_progress" : MessageLookupByLibrary.simpleMessage("В процессе"), - "inactive_diet_state" : MessageLookupByLibrary.simpleMessage("Черновик"), - "infoAboutOrder" : MessageLookupByLibrary.simpleMessage("Информация о заказе"), - "initial_measurements" : MessageLookupByLibrary.simpleMessage("Первичные замеры"), - "label" : 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"), - "light_type" : MessageLookupByLibrary.simpleMessage("Легкая"), - "light_type_desc" : MessageLookupByLibrary.simpleMessage("С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками."), - "link_was_copied" : MessageLookupByLibrary.simpleMessage("Ссылка успешно скопирована"), - "loading" : MessageLookupByLibrary.simpleMessage("Загрузка..."), - "mail_was_copied" : MessageLookupByLibrary.simpleMessage("Почта успешно скопирована"), - "male" : MessageLookupByLibrary.simpleMessage("Мужской"), - "meal" : MessageLookupByLibrary.simpleMessage("Приём пищи"), - "meat" : MessageLookupByLibrary.simpleMessage("Мясо"), - "meat_type" : MessageLookupByLibrary.simpleMessage("С мясом"), - "meat_type_desc" : MessageLookupByLibrary.simpleMessage("Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму."), - "milliliter" : MessageLookupByLibrary.simpleMessage("мл"), - "minimal_customer_price" : MessageLookupByLibrary.simpleMessage("Минимальная цена для покупателя: 1200₽"), - "most_new" : MessageLookupByLibrary.simpleMessage("Самые новые"), - "most_old" : MessageLookupByLibrary.simpleMessage("Самые старые"), - "msg_network_err" : MessageLookupByLibrary.simpleMessage("Сетевая ошибка!"), - "msg_something_went_wrong" : MessageLookupByLibrary.simpleMessage("Что то пошло не так!"), - "my_blog" : MessageLookupByLibrary.simpleMessage("Мой блог"), - "my_diets" : MessageLookupByLibrary.simpleMessage("Мои диеты"), - "my_plans" : MessageLookupByLibrary.simpleMessage("Мои планы"), - "my_settings" : MessageLookupByLibrary.simpleMessage("Мои настройки"), - "name_empty" : MessageLookupByLibrary.simpleMessage("Имя пользователя обязательно для заполнения"), - "name_short" : MessageLookupByLibrary.simpleMessage("В имени пользователя должно быть минимум 6 символов"), - "no" : MessageLookupByLibrary.simpleMessage("Нет"), - "no_account" : MessageLookupByLibrary.simpleMessage("У меня нет аккаунта"), - "notifications" : MessageLookupByLibrary.simpleMessage("Уведомления"), - "one_option" : MessageLookupByLibrary.simpleMessage("1 опция"), - "option" : MessageLookupByLibrary.simpleMessage("Опция"), - "option_content" : MessageLookupByLibrary.simpleMessage("Содержание опции"), - "option_content_hint_text" : MessageLookupByLibrary.simpleMessage("На связи 7 дней в неделю"), - "option_desc" : MessageLookupByLibrary.simpleMessage("Описание опции"), - "option_desc_hint_text" : MessageLookupByLibrary.simpleMessage("Этот план питания для похудения на 7 дней сбалансированный и разнообразный"), - "option_duration" : MessageLookupByLibrary.simpleMessage("Продолжительность опции"), - "option_personal_diet_desc" : MessageLookupByLibrary.simpleMessage("Опция подразумевает создание индивидуальной диеты"), - "option_title" : MessageLookupByLibrary.simpleMessage("Заголовок опции"), - "order" : 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("шт"), - "personal" : MessageLookupByLibrary.simpleMessage("Персональные"), - "personal_diet_state" : MessageLookupByLibrary.simpleMessage("Персональная"), - "photo" : MessageLookupByLibrary.simpleMessage("Фото"), - "place_of_living" : MessageLookupByLibrary.simpleMessage("Место проживания"), - "plan_author" : MessageLookupByLibrary.simpleMessage("Автор плана"), - "plan_desc" : MessageLookupByLibrary.simpleMessage("Описание плана"), - "plan_desc_example" : MessageLookupByLibrary.simpleMessage("Большое подробное, привлекательное описание плана"), - "plan_duration" : MessageLookupByLibrary.simpleMessage("Срок плана"), - "plan_label_desc" : MessageLookupByLibrary.simpleMessage("План для поддержания формы"), - "plans_complete" : MessageLookupByLibrary.simpleMessage("Пройденные планы"), - "popular" : MessageLookupByLibrary.simpleMessage("Популярные"), - "preferred_language" : MessageLookupByLibrary.simpleMessage("Предпочитаемый язык общения"), - "pressure_empty" : MessageLookupByLibrary.simpleMessage("Все показатели давления обязательны к заполнению"), - "pressure_is_not_a_number" : MessageLookupByLibrary.simpleMessage("Все показатели давления должны быть числами"), - "preview" : MessageLookupByLibrary.simpleMessage("Превью"), - "price" : MessageLookupByLibrary.simpleMessage("Цена"), - "price_explanation" : MessageLookupByLibrary.simpleMessage("Разница в ценах, это комиссия Итвио"), - "profile" : MessageLookupByLibrary.simpleMessage("Профиль"), - "proteins" : MessageLookupByLibrary.simpleMessage("Белки"), - "public_diet_state" : MessageLookupByLibrary.simpleMessage("Публичная"), - "publish" : MessageLookupByLibrary.simpleMessage("Опубликовать"), - "published" : MessageLookupByLibrary.simpleMessage("Опубликованные"), - "removeFromActive" : MessageLookupByLibrary.simpleMessage("Снять с публикации"), - "save" : MessageLookupByLibrary.simpleMessage("Сохранить"), - "services" : MessageLookupByLibrary.simpleMessage("Оказание услуг"), - "settings" : MessageLookupByLibrary.simpleMessage("Настройки"), - "share" : MessageLookupByLibrary.simpleMessage("Поделиться"), - "skip" : MessageLookupByLibrary.simpleMessage("Пропустить"), - "slim" : MessageLookupByLibrary.simpleMessage("Похудение"), - "slim_type" : MessageLookupByLibrary.simpleMessage("Похудение"), - "slim_type_desc" : MessageLookupByLibrary.simpleMessage("План питания для похудения должен быть разработан с учётом индивидуальных особенностей организма, возраста, пола, уровня физической активности и состояния здоровья. Общие принципы: \n● Снижение калорийности; \n● Сбалансированный рацион; \n● Разнообразие продуктов; \n● Питьевой режим; \n● Ограничение вредных продуктов;"), - "standard" : MessageLookupByLibrary.simpleMessage("Стандарт"), - "startDiet" : MessageLookupByLibrary.simpleMessage("Начать диету"), - "tell_your_schedule" : MessageLookupByLibrary.simpleMessage("Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:"), - "text_was_copied" : MessageLookupByLibrary.simpleMessage("Текст успешно скопирован"), - "three_options" : MessageLookupByLibrary.simpleMessage("3 опции"), - "toOffer" : MessageLookupByLibrary.simpleMessage("Предложить"), - "to_draft" : MessageLookupByLibrary.simpleMessage("В черновик"), - "unfavorite_foods" : MessageLookupByLibrary.simpleMessage("Нелюбимые продукты"), - "up_pressure" : MessageLookupByLibrary.simpleMessage("Верхние показатели давления:"), - "user_authorization" : MessageLookupByLibrary.simpleMessage("Аутентификация"), - "user_data" : MessageLookupByLibrary.simpleMessage("Данные пользователя"), - "user_registration" : MessageLookupByLibrary.simpleMessage("Регистрация пользователя"), - "username" : MessageLookupByLibrary.simpleMessage("Имя пользователя"), - "vegan" : MessageLookupByLibrary.simpleMessage("Веган."), - "vegan_type" : MessageLookupByLibrary.simpleMessage("Вегетарианская"), - "vegan_type_desc" : MessageLookupByLibrary.simpleMessage("Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья."), - "waist" : MessageLookupByLibrary.simpleMessage("Талия"), - "waist_circumference" : MessageLookupByLibrary.simpleMessage("Обхват талии"), - "weight" : MessageLookupByLibrary.simpleMessage("Вес"), - "weight_chart" : MessageLookupByLibrary.simpleMessage("График веса"), - "weight_measurements" : MessageLookupByLibrary.simpleMessage("Замер веса"), - "wellness" : MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), - "wellness_type" : MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), - "wellness_type_desc" : MessageLookupByLibrary.simpleMessage("Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы."), - "what_is_your_name" : MessageLookupByLibrary.simpleMessage("Как вас зовут?"), - "wrong_credentials" : MessageLookupByLibrary.simpleMessage("Неверные данные пользователя"), - "you_will_get" : 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("Ваш вес:") + static Map _notInlinedMessages(_) => { + "Moscow": MessageLookupByLibrary.simpleMessage("Москва"), + "Russia": MessageLookupByLibrary.simpleMessage("Россия"), + "about_diet": MessageLookupByLibrary.simpleMessage("Об этой диете"), + "about_plan": MessageLookupByLibrary.simpleMessage("Об этом плане"), + "active": MessageLookupByLibrary.simpleMessage("Активен"), + "active_diet_state": MessageLookupByLibrary.simpleMessage("Активная"), + "add": MessageLookupByLibrary.simpleMessage("Добавить"), + "add_cover": MessageLookupByLibrary.simpleMessage("Добавьте обложку"), + "add_measure": MessageLookupByLibrary.simpleMessage("Добавить замер"), + "adding_plan": MessageLookupByLibrary.simpleMessage("Добавление плана"), + "additional_information": MessageLookupByLibrary.simpleMessage( + "Дополнительная информация", + ), + "admin": MessageLookupByLibrary.simpleMessage("Админ"), + "all": MessageLookupByLibrary.simpleMessage("Все"), + "allergies_presence": MessageLookupByLibrary.simpleMessage( + "Наличие аллергии", + ), + "another_form_of_comment": MessageLookupByLibrary.simpleMessage( + "комментария", + ), + "another_form_of_day": MessageLookupByLibrary.simpleMessage("дня"), + "answer": MessageLookupByLibrary.simpleMessage("Ответить"), + "archived": MessageLookupByLibrary.simpleMessage("В архиве"), + "authentificate": MessageLookupByLibrary.simpleMessage("Войти"), + "authorization": MessageLookupByLibrary.simpleMessage("Авторизация"), + "average_pressure": MessageLookupByLibrary.simpleMessage( + "Средние показатели давления:", + ), + "bodymass_chart": MessageLookupByLibrary.simpleMessage("График ИМТ"), + "by_default": MessageLookupByLibrary.simpleMessage("По умолчанию"), + "calories": MessageLookupByLibrary.simpleMessage("Калории"), + "carb_type": MessageLookupByLibrary.simpleMessage("Мучное"), + "carb_type_desc": MessageLookupByLibrary.simpleMessage( + "Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы.", + ), + "carbohydrates": MessageLookupByLibrary.simpleMessage("Углеводы"), + "chat": MessageLookupByLibrary.simpleMessage("Чат"), + "chest": MessageLookupByLibrary.simpleMessage("Грудь"), + "chest_circumference": MessageLookupByLibrary.simpleMessage("Обхват груди"), + "choose_diet_duration": MessageLookupByLibrary.simpleMessage( + "Выберите срок диеты", + ), + "choose_plan_duration": MessageLookupByLibrary.simpleMessage( + "Выберите срок плана", + ), + "choose_start_diet_date": 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("Город проживания"), + "comfort": MessageLookupByLibrary.simpleMessage("Комфорт"), + "comment": MessageLookupByLibrary.simpleMessage("комментарий"), + "comment_hint": MessageLookupByLibrary.simpleMessage("Комментарий"), + "comments": MessageLookupByLibrary.simpleMessage("Комментарии"), + "comments_plural": MessageLookupByLibrary.simpleMessage("комментариев"), + "complain": MessageLookupByLibrary.simpleMessage("Пожаловаться"), + "continueButton": MessageLookupByLibrary.simpleMessage("Продолжить"), + "continue_": MessageLookupByLibrary.simpleMessage("Продолжить"), + "copied": MessageLookupByLibrary.simpleMessage("cкопирован"), + "copy_link": MessageLookupByLibrary.simpleMessage("Скопировать ссылку"), + "country": MessageLookupByLibrary.simpleMessage("Страна"), + "create_diet": MessageLookupByLibrary.simpleMessage("Создание диеты"), + "customer_price": MessageLookupByLibrary.simpleMessage( + "Цена для покупателя", + ), + "date_of_birth": MessageLookupByLibrary.simpleMessage("Дата рождения"), + "day": MessageLookupByLibrary.simpleMessage("День"), + "days": MessageLookupByLibrary.simpleMessage("дней"), + "deleted": MessageLookupByLibrary.simpleMessage("Удалена"), + "diary": MessageLookupByLibrary.simpleMessage("Дневник"), + "diet": MessageLookupByLibrary.simpleMessage("Диета"), + "diet_author": MessageLookupByLibrary.simpleMessage("Автор диеты"), + "diet_plan": MessageLookupByLibrary.simpleMessage("План диеты"), + "diet_state": MessageLookupByLibrary.simpleMessage("Статус диеты"), + "diet_type": 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("Черновик"), + "drafted": MessageLookupByLibrary.simpleMessage("Черновики"), + "eating_behavior": MessageLookupByLibrary.simpleMessage( + "Пищевое поведение", + ), + "eating_behavior_type": MessageLookupByLibrary.simpleMessage( + "Формирование пищевого поведения", + ), + "eating_behavior_type_desc": MessageLookupByLibrary.simpleMessage( + "Формирование здорового пищевого поведения — это процесс, который включает в себя изменение привычек и отношения к еде. Он направлен на то, чтобы помочь людям научиться правильно питаться и поддерживать здоровый образ жизни.Основные принципы формирования здорового пищевого поведения: \n● Разнообразие продуктов; \n● Сбалансированный рацион; \n● Питьевой режим; \n● Ограничение вредных продуктов; \n● Регулярные приёмы пищи; \n● Умеренность;Осознанное питание; \n● Физическая активность;", + ), + "economy": MessageLookupByLibrary.simpleMessage("Эконом"), + "edit": MessageLookupByLibrary.simpleMessage("Редактировать"), + "email": MessageLookupByLibrary.simpleMessage("Электронная почта"), + "email_empty": MessageLookupByLibrary.simpleMessage( + "Необходимо ввести адрес электронной почты", + ), + "email_invalid": MessageLookupByLibrary.simpleMessage( + "Некорректный адрес электронной почты", + ), + "enter_additional_information": MessageLookupByLibrary.simpleMessage( + "Введите любую дополнительную информацию на своё усмотрение:", + ), + "enter_diet_description": MessageLookupByLibrary.simpleMessage( + "Введите описание диеты", + ), + "enter_diet_name": MessageLookupByLibrary.simpleMessage( + "Выведите название диеты", + ), + "enter_information": MessageLookupByLibrary.simpleMessage( + "Введите информацию...", + ), + "exit": MessageLookupByLibrary.simpleMessage("Выйти"), + "expand": MessageLookupByLibrary.simpleMessage("Показать полностью"), + "fats": 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 символ", + ), + "fit_type": MessageLookupByLibrary.simpleMessage("Поддержание формы"), + "fit_type_desc": MessageLookupByLibrary.simpleMessage( + "План питания для поддержания формы сбалансированный и разнообразный, чтобы обеспечить организм всеми необходимыми питательными веществами. Общие принципы: \n● Дробное питание; \n● Разнообразие продуктов; \n● Контроль порций; \n● Питьевой режим; \n● Ограничение вредных продуктов;", + ), + "fitness": MessageLookupByLibrary.simpleMessage("Поддержка формы"), + "from": MessageLookupByLibrary.simpleMessage("от"), + "from_a_to_z": MessageLookupByLibrary.simpleMessage("Название: А-Я"), + "from_z_to_a": MessageLookupByLibrary.simpleMessage("Название: Я-А"), + "gallery": MessageLookupByLibrary.simpleMessage("Галерея"), + "gr": MessageLookupByLibrary.simpleMessage("гр"), + "grams": MessageLookupByLibrary.simpleMessage("гр"), + "height_measurements": MessageLookupByLibrary.simpleMessage("Замер роста"), + "hide": MessageLookupByLibrary.simpleMessage("Свернуть"), + "hip_circumference": MessageLookupByLibrary.simpleMessage("Обхват бедер"), + "hips": MessageLookupByLibrary.simpleMessage("Бедра"), + "in_progress": MessageLookupByLibrary.simpleMessage("В процессе"), + "inactive_diet_state": MessageLookupByLibrary.simpleMessage("Черновик"), + "infoAboutOrder": MessageLookupByLibrary.simpleMessage( + "Информация о заказе", + ), + "initial_measurements": MessageLookupByLibrary.simpleMessage( + "Первичные замеры", + ), + "label": 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"), + "light_type": MessageLookupByLibrary.simpleMessage("Легкая"), + "light_type_desc": MessageLookupByLibrary.simpleMessage( + "С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками.", + ), + "link_was_copied": MessageLookupByLibrary.simpleMessage( + "Ссылка успешно скопирована", + ), + "loading": MessageLookupByLibrary.simpleMessage("Загрузка..."), + "mail_was_copied": MessageLookupByLibrary.simpleMessage( + "Почта успешно скопирована", + ), + "male": MessageLookupByLibrary.simpleMessage("Мужской"), + "meal": MessageLookupByLibrary.simpleMessage("Приём пищи"), + "meat": MessageLookupByLibrary.simpleMessage("Мясо"), + "meat_type": MessageLookupByLibrary.simpleMessage("С мясом"), + "meat_type_desc": MessageLookupByLibrary.simpleMessage( + "Диета с мясом полезная и сбалансированная. Включает в себя нежирное мясо: курицу, индейку, кролика или говядину. В сочетании с овощами получаете все необходимые витамины и минералы. Не забывайте о порциях и старайтесь есть медленно, прислушиваясь к своему организму.", + ), + "milliliter": MessageLookupByLibrary.simpleMessage("мл"), + "minimal_customer_price": MessageLookupByLibrary.simpleMessage( + "Минимальная цена для покупателя: 1200₽", + ), + "most_new": MessageLookupByLibrary.simpleMessage("Самые новые"), + "most_old": MessageLookupByLibrary.simpleMessage("Самые старые"), + "msg_network_err": MessageLookupByLibrary.simpleMessage("Сетевая ошибка!"), + "msg_something_went_wrong": MessageLookupByLibrary.simpleMessage( + "Что то пошло не так!", + ), + "my_blog": MessageLookupByLibrary.simpleMessage("Мой блог"), + "my_diets": MessageLookupByLibrary.simpleMessage("Мои диеты"), + "my_plans": MessageLookupByLibrary.simpleMessage("Мои планы"), + "my_settings": MessageLookupByLibrary.simpleMessage("Мои настройки"), + "name_empty": MessageLookupByLibrary.simpleMessage( + "Имя пользователя обязательно для заполнения", + ), + "name_short": MessageLookupByLibrary.simpleMessage( + "В имени пользователя должно быть минимум 6 символов", + ), + "no": MessageLookupByLibrary.simpleMessage("Нет"), + "no_account": MessageLookupByLibrary.simpleMessage("У меня нет аккаунта"), + "notifications": MessageLookupByLibrary.simpleMessage("Уведомления"), + "one_option": MessageLookupByLibrary.simpleMessage("1 опция"), + "option": MessageLookupByLibrary.simpleMessage("Опция"), + "option_content": MessageLookupByLibrary.simpleMessage("Содержание опции"), + "option_content_hint_text": MessageLookupByLibrary.simpleMessage( + "На связи 7 дней в неделю", + ), + "option_desc": MessageLookupByLibrary.simpleMessage("Описание опции"), + "option_desc_hint_text": MessageLookupByLibrary.simpleMessage( + "Этот план питания для похудения на 7 дней сбалансированный и разнообразный", + ), + "option_duration": MessageLookupByLibrary.simpleMessage( + "Продолжительность опции", + ), + "option_personal_diet_desc": MessageLookupByLibrary.simpleMessage( + "Опция подразумевает создание индивидуальной диеты", + ), + "option_title": MessageLookupByLibrary.simpleMessage("Заголовок опции"), + "order": 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("шт"), + "personal": MessageLookupByLibrary.simpleMessage("Персональные"), + "personal_diet_state": MessageLookupByLibrary.simpleMessage("Персональная"), + "photo": MessageLookupByLibrary.simpleMessage("Фото"), + "place_of_living": MessageLookupByLibrary.simpleMessage("Место проживания"), + "plan_author": MessageLookupByLibrary.simpleMessage("Автор плана"), + "plan_desc": MessageLookupByLibrary.simpleMessage("Описание плана"), + "plan_desc_example": MessageLookupByLibrary.simpleMessage( + "Большое подробное, привлекательное описание плана", + ), + "plan_duration": MessageLookupByLibrary.simpleMessage("Срок плана"), + "plan_label_desc": MessageLookupByLibrary.simpleMessage( + "План для поддержания формы", + ), + "plans_complete": MessageLookupByLibrary.simpleMessage("Пройденные планы"), + "popular": MessageLookupByLibrary.simpleMessage("Популярные"), + "preferred_language": MessageLookupByLibrary.simpleMessage( + "Предпочитаемый язык общения", + ), + "pressure_empty": MessageLookupByLibrary.simpleMessage( + "Все показатели давления обязательны к заполнению", + ), + "pressure_is_not_a_number": MessageLookupByLibrary.simpleMessage( + "Все показатели давления должны быть числами", + ), + "preview": MessageLookupByLibrary.simpleMessage("Превью"), + "price": MessageLookupByLibrary.simpleMessage("Цена"), + "price_explanation": MessageLookupByLibrary.simpleMessage( + "Разница в ценах, это комиссия Итвио", + ), + "profile": MessageLookupByLibrary.simpleMessage("Профиль"), + "proteins": MessageLookupByLibrary.simpleMessage("Белки"), + "public_diet_state": MessageLookupByLibrary.simpleMessage("Публичная"), + "publish": MessageLookupByLibrary.simpleMessage("Опубликовать"), + "published": MessageLookupByLibrary.simpleMessage("Опубликованные"), + "removeFromActive": MessageLookupByLibrary.simpleMessage( + "Снять с публикации", + ), + "save": MessageLookupByLibrary.simpleMessage("Сохранить"), + "services": MessageLookupByLibrary.simpleMessage("Оказание услуг"), + "settings": MessageLookupByLibrary.simpleMessage("Настройки"), + "share": MessageLookupByLibrary.simpleMessage("Поделиться"), + "skip": MessageLookupByLibrary.simpleMessage("Пропустить"), + "slim": MessageLookupByLibrary.simpleMessage("Похудение"), + "slim_type": MessageLookupByLibrary.simpleMessage("Похудение"), + "slim_type_desc": MessageLookupByLibrary.simpleMessage( + "План питания для похудения должен быть разработан с учётом индивидуальных особенностей организма, возраста, пола, уровня физической активности и состояния здоровья. Общие принципы: \n● Снижение калорийности; \n● Сбалансированный рацион; \n● Разнообразие продуктов; \n● Питьевой режим; \n● Ограничение вредных продуктов;", + ), + "standard": MessageLookupByLibrary.simpleMessage("Стандарт"), + "startDiet": MessageLookupByLibrary.simpleMessage("Начать диету"), + "tell_your_schedule": MessageLookupByLibrary.simpleMessage( + "Расскажите в свободной форме о том как просыпаетесь, когда едите, когда ложитесь спать:", + ), + "text_was_copied": MessageLookupByLibrary.simpleMessage( + "Текст успешно скопирован", + ), + "three_options": MessageLookupByLibrary.simpleMessage("3 опции"), + "toOffer": MessageLookupByLibrary.simpleMessage("Предложить"), + "to_draft": MessageLookupByLibrary.simpleMessage("В черновик"), + "unfavorite_foods": MessageLookupByLibrary.simpleMessage( + "Нелюбимые продукты", + ), + "up_pressure": MessageLookupByLibrary.simpleMessage( + "Верхние показатели давления:", + ), + "user_authorization": MessageLookupByLibrary.simpleMessage( + "Аутентификация", + ), + "user_data": MessageLookupByLibrary.simpleMessage("Данные пользователя"), + "user_registration": MessageLookupByLibrary.simpleMessage( + "Регистрация пользователя", + ), + "username": MessageLookupByLibrary.simpleMessage("Имя пользователя"), + "vegan": MessageLookupByLibrary.simpleMessage("Веган."), + "vegan_type": MessageLookupByLibrary.simpleMessage("Вегетарианская"), + "vegan_type_desc": MessageLookupByLibrary.simpleMessage( + "Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья.", + ), + "waist": MessageLookupByLibrary.simpleMessage("Талия"), + "waist_circumference": MessageLookupByLibrary.simpleMessage("Обхват талии"), + "weight": MessageLookupByLibrary.simpleMessage("Вес"), + "weight_chart": MessageLookupByLibrary.simpleMessage("График веса"), + "weight_measurements": MessageLookupByLibrary.simpleMessage("Замер веса"), + "wellness": MessageLookupByLibrary.simpleMessage("Улучшение самочувствия"), + "wellness_type": MessageLookupByLibrary.simpleMessage( + "Улучшение самочувствия", + ), + "wellness_type_desc": MessageLookupByLibrary.simpleMessage( + "Если вы любите мучные продукты, но хотите придерживаться диеты, вам подходит диета с добавленим мучных блюд на основе цельнозерновых вариантов. В них больше сложных углеводов и клетчатки, что способствует длительному чувству сытости и поддерживает здоровье пищеварительной системы.", + ), + "what_is_your_name": MessageLookupByLibrary.simpleMessage("Как вас зовут?"), + "wrong_credentials": MessageLookupByLibrary.simpleMessage( + "Неверные данные пользователя", + ), + "you_will_get": 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 ce3062c9..4118b48b 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -10,7 +10,7 @@ import 'intl/messages_all.dart'; // ignore_for_file: non_constant_identifier_names, lines_longer_than_80_chars // ignore_for_file: join_return_with_assignment, prefer_final_in_for_each -// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_redundant_argument_values, avoid_escaping_inner_quotes class S { S(); @@ -18,28 +18,35 @@ class S { static S? _current; static S get current { - assert(_current != null, 'No instance of S was loaded. Try to initialize the S delegate before accessing S.current.'); + assert( + _current != null, + 'No instance of S was loaded. Try to initialize the S delegate before accessing S.current.', + ); return _current!; } - static const AppLocalizationDelegate delegate = - AppLocalizationDelegate(); + static const AppLocalizationDelegate delegate = AppLocalizationDelegate(); static Future load(Locale locale) { - final name = (locale.countryCode?.isEmpty ?? false) ? locale.languageCode : locale.toString(); - final localeName = Intl.canonicalizedLocale(name); + final name = (locale.countryCode?.isEmpty ?? false) + ? locale.languageCode + : locale.toString(); + final localeName = Intl.canonicalizedLocale(name); return initializeMessages(localeName).then((_) { Intl.defaultLocale = localeName; final instance = S(); S._current = instance; - + return instance; }); - } + } static S of(BuildContext context) { final instance = S.maybeOf(context); - assert(instance != null, 'No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates?'); + assert( + instance != null, + 'No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates?', + ); return instance!; } @@ -59,12 +66,7 @@ class S { /// `Электронная почта` String get email { - return Intl.message( - 'Электронная почта', - name: 'email', - desc: '', - args: [], - ); + return Intl.message('Электронная почта', name: 'email', desc: '', args: []); } /// `Имя пользователя` @@ -79,12 +81,7 @@ class S { /// `Пароль` String get password { - return Intl.message( - 'Пароль', - name: 'password', - desc: '', - args: [], - ); + return Intl.message('Пароль', name: 'password', desc: '', args: []); } /// `Подтвердите пароль` @@ -109,22 +106,12 @@ class S { /// `Имя` String get first_name { - return Intl.message( - 'Имя', - name: 'first_name', - desc: '', - args: [], - ); + return Intl.message('Имя', name: 'first_name', desc: '', args: []); } /// `Фамилия` String get last_name { - return Intl.message( - 'Фамилия', - name: 'last_name', - desc: '', - args: [], - ); + return Intl.message('Фамилия', name: 'last_name', desc: '', args: []); } /// `Как вас зовут?` @@ -149,42 +136,22 @@ class S { /// `Страна` String get country { - return Intl.message( - 'Страна', - name: 'country', - desc: '', - args: [], - ); + return Intl.message('Страна', name: 'country', desc: '', args: []); } /// `Россия` String get Russia { - return Intl.message( - 'Россия', - name: 'Russia', - desc: '', - args: [], - ); + return Intl.message('Россия', name: 'Russia', desc: '', args: []); } /// `Город` String get city { - return Intl.message( - 'Город', - name: 'city', - desc: '', - args: [], - ); + return Intl.message('Город', name: 'city', desc: '', args: []); } /// `Москва` String get Moscow { - return Intl.message( - 'Москва', - name: 'Moscow', - desc: '', - args: [], - ); + return Intl.message('Москва', name: 'Moscow', desc: '', args: []); } /// `Место проживания` @@ -239,22 +206,12 @@ class S { /// `Мужской` String get male { - return Intl.message( - 'Мужской', - name: 'male', - desc: '', - args: [], - ); + return Intl.message('Мужской', name: 'male', desc: '', args: []); } /// `Женский` String get female { - return Intl.message( - 'Женский', - name: 'female', - desc: '', - args: [], - ); + return Intl.message('Женский', name: 'female', desc: '', args: []); } /// `Замер веса` @@ -269,12 +226,7 @@ class S { /// `Ваш вес:` String get your_weight { - return Intl.message( - 'Ваш вес:', - name: 'your_weight', - desc: '', - args: [], - ); + return Intl.message('Ваш вес:', name: 'your_weight', desc: '', args: []); } /// `Замер роста` @@ -289,12 +241,7 @@ class S { /// `Ваш рост:` String get your_height { - return Intl.message( - 'Ваш рост:', - name: 'your_height', - desc: '', - args: [], - ); + return Intl.message('Ваш рост:', name: 'your_height', desc: '', args: []); } /// `Наличие аллергии` @@ -319,22 +266,12 @@ class S { /// `Ваш пол?` String get your_gender { - return Intl.message( - 'Ваш пол?', - name: 'your_gender', - desc: '', - args: [], - ); + return Intl.message('Ваш пол?', name: 'your_gender', desc: '', args: []); } /// `Нет` String get no { - return Intl.message( - 'Нет', - name: 'no', - desc: '', - args: [], - ); + return Intl.message('Нет', name: 'no', desc: '', args: []); } /// `Есть ли у вас гипертония?` @@ -479,22 +416,12 @@ class S { /// `English` String get lbl_english { - return Intl.message( - 'English', - name: 'lbl_english', - desc: '', - args: [], - ); + return Intl.message('English', name: 'lbl_english', desc: '', args: []); } /// `Завершить` String get finish { - return Intl.message( - 'Завершить', - name: 'finish', - desc: '', - args: [], - ); + return Intl.message('Завершить', name: 'finish', desc: '', args: []); } /// `Предпочитаемый язык общения` @@ -519,12 +446,7 @@ class S { /// `Пропустить` String get skip { - return Intl.message( - 'Пропустить', - name: 'skip', - desc: '', - args: [], - ); + return Intl.message('Пропустить', name: 'skip', desc: '', args: []); } /// `Заполните информацию:` @@ -729,12 +651,7 @@ class S { /// `Войти` String get authentificate { - return Intl.message( - 'Войти', - name: 'authentificate', - desc: '', - args: [], - ); + return Intl.message('Войти', name: 'authentificate', desc: '', args: []); } /// `Аутентификация` @@ -747,16 +664,21 @@ class S { ); } - /// `Загрузка...` - String get loading { + /// `Authorization` + String get authorization { return Intl.message( - 'Загрузка...', - name: 'loading', + 'Authorization', + name: 'authorization', desc: '', args: [], ); } + /// `Загрузка...` + String get loading { + return Intl.message('Загрузка...', name: 'loading', desc: '', args: []); + } + /// `График веса` String get weight_chart { return Intl.message( @@ -799,102 +721,52 @@ class S { /// `Грудь` String get chest { - return Intl.message( - 'Грудь', - name: 'chest', - desc: '', - args: [], - ); + return Intl.message('Грудь', name: 'chest', desc: '', args: []); } /// `Талия` String get waist { - return Intl.message( - 'Талия', - name: 'waist', - desc: '', - args: [], - ); + return Intl.message('Талия', name: 'waist', desc: '', args: []); } /// `Бедра` String get hips { - return Intl.message( - 'Бедра', - name: 'hips', - desc: '', - args: [], - ); + return Intl.message('Бедра', name: 'hips', desc: '', args: []); } /// `Выйти` String get exit { - return Intl.message( - 'Выйти', - name: 'exit', - desc: '', - args: [], - ); + return Intl.message('Выйти', name: 'exit', desc: '', args: []); } /// `Активен` String get active { - return Intl.message( - 'Активен', - name: 'active', - desc: '', - args: [], - ); + return Intl.message('Активен', name: 'active', desc: '', args: []); } /// `В архиве` String get archived { - return Intl.message( - 'В архиве', - name: 'archived', - desc: '', - args: [], - ); + return Intl.message('В архиве', name: 'archived', desc: '', args: []); } /// `Черновик` String get draft { - return Intl.message( - 'Черновик', - name: 'draft', - desc: '', - args: [], - ); + return Intl.message('Черновик', name: 'draft', desc: '', args: []); } /// `Мой блог` String get my_blog { - return Intl.message( - 'Мой блог', - name: 'my_blog', - desc: '', - args: [], - ); + return Intl.message('Мой блог', name: 'my_blog', desc: '', args: []); } /// `Язык` String get language { - return Intl.message( - 'Язык', - name: 'language', - desc: '', - args: [], - ); + return Intl.message('Язык', name: 'language', desc: '', args: []); } /// `В процессе` String get in_progress { - return Intl.message( - 'В процессе', - name: 'in_progress', - desc: '', - args: [], - ); + return Intl.message('В процессе', name: 'in_progress', desc: '', args: []); } /// `Добавить замер` @@ -909,12 +781,7 @@ class S { /// `Вес` String get weight { - return Intl.message( - 'Вес', - name: 'weight', - desc: '', - args: [], - ); + return Intl.message('Вес', name: 'weight', desc: '', args: []); } /// `Пройденные планы` @@ -939,132 +806,67 @@ class S { /// `Настройки` String get settings { - return Intl.message( - 'Настройки', - name: 'settings', - desc: '', - args: [], - ); + return Intl.message('Настройки', name: 'settings', desc: '', args: []); } /// `Профиль` String get profile { - return Intl.message( - 'Профиль', - name: 'profile', - desc: '', - args: [], - ); + return Intl.message('Профиль', name: 'profile', desc: '', args: []); } /// `Чат` String get chat { - return Intl.message( - 'Чат', - name: 'chat', - desc: '', - args: [], - ); + return Intl.message('Чат', name: 'chat', desc: '', args: []); } /// `Админ` String get admin { - return Intl.message( - 'Админ', - name: 'admin', - desc: '', - args: [], - ); + return Intl.message('Админ', name: 'admin', desc: '', args: []); } /// `Дневник` String get diary { - return Intl.message( - 'Дневник', - name: 'diary', - desc: '', - args: [], - ); + return Intl.message('Дневник', name: 'diary', desc: '', args: []); } /// `Сохранить` String get save { - return Intl.message( - 'Сохранить', - name: 'save', - desc: '', - args: [], - ); + return Intl.message('Сохранить', name: 'save', desc: '', args: []); } /// `шт` String get pcs { - return Intl.message( - 'шт', - name: 'pcs', - desc: '', - args: [], - ); + return Intl.message('шт', name: 'pcs', desc: '', args: []); } /// `гр` String get gr { - return Intl.message( - 'гр', - name: 'gr', - desc: '', - args: [], - ); + return Intl.message('гр', name: 'gr', desc: '', args: []); } /// `мл` String get milliliter { - return Intl.message( - 'мл', - name: 'milliliter', - desc: '', - args: [], - ); + return Intl.message('мл', name: 'milliliter', desc: '', args: []); } /// `гр` String get grams { - return Intl.message( - 'гр', - name: 'grams', - desc: '', - args: [], - ); + return Intl.message('гр', name: 'grams', desc: '', args: []); } /// `Начать диету` String get startDiet { - return Intl.message( - 'Начать диету', - name: 'startDiet', - desc: '', - args: [], - ); + return Intl.message('Начать диету', name: 'startDiet', desc: '', args: []); } /// `Комментарии` String get comments { - return Intl.message( - 'Комментарии', - name: 'comments', - desc: '', - args: [], - ); + return Intl.message('Комментарии', name: 'comments', desc: '', args: []); } /// `комментарий` String get comment { - return Intl.message( - 'комментарий', - name: 'comment', - desc: '', - args: [], - ); + return Intl.message('комментарий', name: 'comment', desc: '', args: []); } /// `комментария` @@ -1089,32 +891,17 @@ class S { /// `дней` String get days { - return Intl.message( - 'дней', - name: 'days', - desc: '', - args: [], - ); + return Intl.message('дней', name: 'days', desc: '', args: []); } /// `День` String get day { - return Intl.message( - 'День', - name: 'day', - desc: '', - args: [], - ); + return Intl.message('День', name: 'day', desc: '', args: []); } /// `дня` String get another_form_of_day { - return Intl.message( - 'дня', - name: 'another_form_of_day', - desc: '', - args: [], - ); + return Intl.message('дня', name: 'another_form_of_day', desc: '', args: []); } /// `комментариев` @@ -1129,32 +916,17 @@ class S { /// `Приём пищи` String get meal { - return Intl.message( - 'Приём пищи', - name: 'meal', - desc: '', - args: [], - ); + return Intl.message('Приём пищи', name: 'meal', desc: '', args: []); } /// `Автор диеты` String get diet_author { - return Intl.message( - 'Автор диеты', - name: 'diet_author', - desc: '', - args: [], - ); + return Intl.message('Автор диеты', name: 'diet_author', desc: '', args: []); } /// `Свернуть` String get hide { - return Intl.message( - 'Свернуть', - name: 'hide', - desc: '', - args: [], - ); + return Intl.message('Свернуть', name: 'hide', desc: '', args: []); } /// `Показать полностью` @@ -1179,22 +951,12 @@ class S { /// `Поделиться` String get share { - return Intl.message( - 'Поделиться', - name: 'share', - desc: '', - args: [], - ); + return Intl.message('Поделиться', name: 'share', desc: '', args: []); } /// `Пожаловаться` String get complain { - return Intl.message( - 'Пожаловаться', - name: 'complain', - desc: '', - args: [], - ); + return Intl.message('Пожаловаться', name: 'complain', desc: '', args: []); } /// `Вегетарианская` @@ -1209,32 +971,17 @@ class S { /// `Легкая` String get light_type { - return Intl.message( - 'Легкая', - name: 'light_type', - desc: '', - args: [], - ); + return Intl.message('Легкая', name: 'light_type', desc: '', args: []); } /// `С мясом` String get meat_type { - return Intl.message( - 'С мясом', - name: 'meat_type', - desc: '', - args: [], - ); + return Intl.message('С мясом', name: 'meat_type', desc: '', args: []); } /// `Мучное` String get carb_type { - return Intl.message( - 'Мучное', - name: 'carb_type', - desc: '', - args: [], - ); + return Intl.message('Мучное', name: 'carb_type', desc: '', args: []); } /// `Диета основана на потреблении растительной пищи и отказе от продуктов животного происхождения. Такой тип питания может быть разнообразным и вкусным, а также полезным для здоровья.` @@ -1279,62 +1026,32 @@ class S { /// `План диеты` String get diet_plan { - return Intl.message( - 'План диеты', - name: 'diet_plan', - desc: '', - args: [], - ); + return Intl.message('План диеты', name: 'diet_plan', desc: '', args: []); } /// `Калории` String get calories { - return Intl.message( - 'Калории', - name: 'calories', - desc: '', - args: [], - ); + return Intl.message('Калории', name: 'calories', desc: '', args: []); } /// `Белки` String get proteins { - return Intl.message( - 'Белки', - name: 'proteins', - desc: '', - args: [], - ); + return Intl.message('Белки', name: 'proteins', desc: '', args: []); } /// `Жиры` String get fats { - return Intl.message( - 'Жиры', - name: 'fats', - desc: '', - args: [], - ); + return Intl.message('Жиры', name: 'fats', desc: '', args: []); } /// `Углеводы` String get carbohydrates { - return Intl.message( - 'Углеводы', - name: 'carbohydrates', - desc: '', - args: [], - ); + return Intl.message('Углеводы', name: 'carbohydrates', desc: '', args: []); } /// `Ответить` String get answer { - return Intl.message( - 'Ответить', - name: 'answer', - desc: '', - args: [], - ); + return Intl.message('Ответить', name: 'answer', desc: '', args: []); } /// `Ссылка успешно скопирована` @@ -1379,92 +1096,47 @@ class S { /// `Продолжить` String get continue_ { - return Intl.message( - 'Продолжить', - name: 'continue_', - desc: '', - args: [], - ); + return Intl.message('Продолжить', name: 'continue_', desc: '', args: []); } /// `Порядок` String get order { - return Intl.message( - 'Порядок', - name: 'order', - desc: '', - args: [], - ); + return Intl.message('Порядок', name: 'order', desc: '', args: []); } /// `Время прохождения` String get time { - return Intl.message( - 'Время прохождения', - name: 'time', - desc: '', - args: [], - ); + return Intl.message('Время прохождения', name: 'time', desc: '', args: []); } /// `Все` String get all { - return Intl.message( - 'Все', - name: 'all', - desc: '', - args: [], - ); + return Intl.message('Все', name: 'all', desc: '', args: []); } /// `Тип диеты` String get diet_type { - return Intl.message( - 'Тип диеты', - name: 'diet_type', - desc: '', - args: [], - ); + return Intl.message('Тип диеты', name: 'diet_type', desc: '', args: []); } /// `Тип плана` String get plan_type { - return Intl.message( - 'Тип плана', - name: 'plan_type', - desc: '', - args: [], - ); + return Intl.message('Тип плана', name: 'plan_type', desc: '', args: []); } /// `Популярные` String get popular { - return Intl.message( - 'Популярные', - name: 'popular', - desc: '', - args: [], - ); + return Intl.message('Популярные', name: 'popular', desc: '', args: []); } /// `Самые новые` String get most_new { - return Intl.message( - 'Самые новые', - name: 'most_new', - desc: '', - args: [], - ); + return Intl.message('Самые новые', name: 'most_new', desc: '', args: []); } /// `Самые старые` String get most_old { - return Intl.message( - 'Самые старые', - name: 'most_old', - desc: '', - args: [], - ); + return Intl.message('Самые старые', name: 'most_old', desc: '', args: []); } /// `Название: А-Я` @@ -1489,12 +1161,7 @@ class S { /// `По умолчанию` String get by_default { - return Intl.message( - 'По умолчанию', - name: 'by_default', - desc: '', - args: [], - ); + return Intl.message('По умолчанию', name: 'by_default', desc: '', args: []); } /// `Создание диеты` @@ -1539,12 +1206,7 @@ class S { /// `Статус диеты` String get diet_state { - return Intl.message( - 'Статус диеты', - name: 'diet_state', - desc: '', - args: [], - ); + return Intl.message('Статус диеты', name: 'diet_state', desc: '', args: []); } /// `Активная` @@ -1589,42 +1251,22 @@ class S { /// `Мясо` String get meat { - return Intl.message( - 'Мясо', - name: 'meat', - desc: '', - args: [], - ); + return Intl.message('Мясо', name: 'meat', desc: '', args: []); } /// `Веган.` String get vegan { - return Intl.message( - 'Веган.', - name: 'vegan', - desc: '', - args: [], - ); + return Intl.message('Веган.', name: 'vegan', desc: '', args: []); } /// `Фото` String get photo { - return Intl.message( - 'Фото', - name: 'photo', - desc: '', - args: [], - ); + return Intl.message('Фото', name: 'photo', desc: '', args: []); } /// `Галерея` String get gallery { - return Intl.message( - 'Галерея', - name: 'gallery', - desc: '', - args: [], - ); + return Intl.message('Галерея', name: 'gallery', desc: '', args: []); } /// `Добавьте обложку` @@ -1639,52 +1281,27 @@ class S { /// `Добавить` String get add { - return Intl.message( - 'Добавить', - name: 'add', - desc: '', - args: [], - ); + return Intl.message('Добавить', name: 'add', desc: '', args: []); } /// `cкопирован` String get copied { - return Intl.message( - 'cкопирован', - name: 'copied', - desc: '', - args: [], - ); + return Intl.message('cкопирован', name: 'copied', desc: '', args: []); } /// `В черновик` String get to_draft { - return Intl.message( - 'В черновик', - name: 'to_draft', - desc: '', - args: [], - ); + return Intl.message('В черновик', name: 'to_draft', desc: '', args: []); } /// `Превью` String get preview { - return Intl.message( - 'Превью', - name: 'preview', - desc: '', - args: [], - ); + return Intl.message('Превью', name: 'preview', desc: '', args: []); } /// `Опубликовать` String get publish { - return Intl.message( - 'Опубликовать', - name: 'publish', - desc: '', - args: [], - ); + return Intl.message('Опубликовать', name: 'publish', desc: '', args: []); } /// `Добавление плана` @@ -1699,12 +1316,7 @@ class S { /// `Название` String get label { - return Intl.message( - 'Название', - name: 'label', - desc: '', - args: [], - ); + return Intl.message('Название', name: 'label', desc: '', args: []); } /// `План для поддержания формы` @@ -1729,22 +1341,12 @@ class S { /// `Похудение` String get slim { - return Intl.message( - 'Похудение', - name: 'slim', - desc: '', - args: [], - ); + return Intl.message('Похудение', name: 'slim', desc: '', args: []); } /// `Поддержка формы` String get fitness { - return Intl.message( - 'Поддержка формы', - name: 'fitness', - desc: '', - args: [], - ); + return Intl.message('Поддержка формы', name: 'fitness', desc: '', args: []); } /// `Улучшение самочувствия` @@ -1799,72 +1401,37 @@ class S { /// `1 опция` String get one_option { - return Intl.message( - '1 опция', - name: 'one_option', - desc: '', - args: [], - ); + return Intl.message('1 опция', name: 'one_option', desc: '', args: []); } /// `3 опции` String get three_options { - return Intl.message( - '3 опции', - name: 'three_options', - desc: '', - args: [], - ); + return Intl.message('3 опции', name: 'three_options', desc: '', args: []); } /// `Опция` String get option { - return Intl.message( - 'Опция', - name: 'option', - desc: '', - args: [], - ); + return Intl.message('Опция', name: 'option', desc: '', args: []); } /// `Оказание услуг` String get services { - return Intl.message( - 'Оказание услуг', - name: 'services', - desc: '', - args: [], - ); + return Intl.message('Оказание услуг', name: 'services', desc: '', args: []); } /// `Эконом` String get economy { - return Intl.message( - 'Эконом', - name: 'economy', - desc: '', - args: [], - ); + return Intl.message('Эконом', name: 'economy', desc: '', args: []); } /// `Стандарт` String get standard { - return Intl.message( - 'Стандарт', - name: 'standard', - desc: '', - args: [], - ); + return Intl.message('Стандарт', name: 'standard', desc: '', args: []); } /// `Комфорт` String get comfort { - return Intl.message( - 'Комфорт', - name: 'comfort', - desc: '', - args: [], - ); + return Intl.message('Комфорт', name: 'comfort', desc: '', args: []); } /// `Заголовок опции` @@ -1979,12 +1546,7 @@ class S { /// `Автор плана` String get plan_author { - return Intl.message( - 'Автор плана', - name: 'plan_author', - desc: '', - args: [], - ); + return Intl.message('Автор плана', name: 'plan_author', desc: '', args: []); } /// `Продолжительность опции` @@ -2019,12 +1581,7 @@ class S { /// `Похудение` String get slim_type { - return Intl.message( - 'Похудение', - name: 'slim_type', - desc: '', - args: [], - ); + return Intl.message('Похудение', name: 'slim_type', desc: '', args: []); } /// `План питания для похудения должен быть разработан с учётом индивидуальных особенностей организма, возраста, пола, уровня физической активности и состояния здоровья. Общие принципы: \n● Снижение калорийности; \n● Сбалансированный рацион; \n● Разнообразие продуктов; \n● Питьевой режим; \n● Ограничение вредных продуктов;` @@ -2079,22 +1636,12 @@ class S { /// `Цена` String get price { - return Intl.message( - 'Цена', - name: 'price', - desc: '', - args: [], - ); + return Intl.message('Цена', name: 'price', desc: '', args: []); } /// `Мои диеты` String get my_diets { - return Intl.message( - 'Мои диеты', - name: 'my_diets', - desc: '', - args: [], - ); + return Intl.message('Мои диеты', name: 'my_diets', desc: '', args: []); } /// `Опубликованные` @@ -2109,42 +1656,22 @@ class S { /// `Черновики` String get drafted { - return Intl.message( - 'Черновики', - name: 'drafted', - desc: '', - args: [], - ); + return Intl.message('Черновики', name: 'drafted', desc: '', args: []); } /// `Персональные` String get personal { - return Intl.message( - 'Персональные', - name: 'personal', - desc: '', - args: [], - ); + return Intl.message('Персональные', name: 'personal', desc: '', args: []); } /// `Редактировать` String get edit { - return Intl.message( - 'Редактировать', - name: 'edit', - desc: '', - args: [], - ); + return Intl.message('Редактировать', name: 'edit', desc: '', args: []); } /// `Предложить` String get toOffer { - return Intl.message( - 'Предложить', - name: 'toOffer', - desc: '', - args: [], - ); + return Intl.message('Предложить', name: 'toOffer', desc: '', args: []); } /// `Снять с публикации` @@ -2159,42 +1686,22 @@ class S { /// `Диета` String get diet { - return Intl.message( - 'Диета', - name: 'diet', - desc: '', - args: [], - ); + return Intl.message('Диета', name: 'diet', desc: '', args: []); } /// `Удалена` String get deleted { - return Intl.message( - 'Удалена', - name: 'deleted', - desc: '', - args: [], - ); + return Intl.message('Удалена', name: 'deleted', desc: '', args: []); } /// `Мои планы` String get my_plans { - return Intl.message( - 'Мои планы', - name: 'my_plans', - desc: '', - args: [], - ); + return Intl.message('Мои планы', name: 'my_plans', desc: '', args: []); } /// `от` String get from { - return Intl.message( - 'от', - name: 'from', - desc: '', - args: [], - ); + return Intl.message('от', name: 'from', desc: '', args: []); } /// `Данные пользователя` @@ -2219,12 +1726,7 @@ class S { /// `Пол` String get sex { - return Intl.message( - 'Пол', - name: 'sex', - desc: '', - args: [], - ); + return Intl.message('Пол', name: 'sex', desc: '', args: []); } /// `Физическая форма` @@ -2239,42 +1741,22 @@ class S { /// `Рост` String get height { - return Intl.message( - 'Рост', - name: 'height', - desc: '', - args: [], - ); + return Intl.message('Рост', name: 'height', desc: '', args: []); } /// `Давление` String get pressure { - return Intl.message( - 'Давление', - name: 'pressure', - desc: '', - args: [], - ); + return Intl.message('Давление', name: 'pressure', desc: '', args: []); } /// `Верхнее` String get upper { - return Intl.message( - 'Верхнее', - name: 'upper', - desc: '', - args: [], - ); + return Intl.message('Верхнее', name: 'upper', desc: '', args: []); } /// `Нижнее` String get lower { - return Intl.message( - 'Нижнее', - name: 'lower', - desc: '', - args: [], - ); + return Intl.message('Нижнее', name: 'lower', desc: '', args: []); } /// `Склонность к гипотонии` @@ -2379,12 +1861,7 @@ class S { /// `Подтвердить` String get confirm { - return Intl.message( - 'Подтвердить', - name: 'confirm', - desc: '', - args: [], - ); + return Intl.message('Подтвердить', name: 'confirm', desc: '', args: []); } /// `Не удалось отменить диету` @@ -2399,22 +1876,12 @@ class S { /// `часов` String get hours { - return Intl.message( - 'часов', - name: 'hours', - desc: '', - args: [], - ); + return Intl.message('часов', name: 'hours', desc: '', args: []); } /// `час` String get hour { - return Intl.message( - 'час', - name: 'hour', - desc: '', - args: [], - ); + return Intl.message('час', name: 'hour', desc: '', args: []); } /// `часа` @@ -2429,22 +1896,12 @@ class S { /// `минуты` String get minutes { - return Intl.message( - 'минуты', - name: 'minutes', - desc: '', - args: [], - ); + return Intl.message('минуты', name: 'minutes', desc: '', args: []); } /// `минута` String get minute { - return Intl.message( - 'минута', - name: 'minute', - desc: '', - args: [], - ); + return Intl.message('минута', name: 'minute', desc: '', args: []); } /// `минут` @@ -2489,22 +1946,12 @@ class S { /// `этапов` String get stages { - return Intl.message( - 'этапов', - name: 'stages', - desc: '', - args: [], - ); + return Intl.message('этапов', name: 'stages', desc: '', args: []); } /// `этап` String get stage { - return Intl.message( - 'этап', - name: 'stage', - desc: '', - args: [], - ); + return Intl.message('этап', name: 'stage', desc: '', args: []); } /// `этапа` @@ -2539,22 +1986,12 @@ class S { /// `Ингредиенты` String get ingredients { - return Intl.message( - 'Ингредиенты', - name: 'ingredients', - desc: '', - args: [], - ); + return Intl.message('Ингредиенты', name: 'ingredients', desc: '', args: []); } /// `Шаг` String get step { - return Intl.message( - 'Шаг', - name: 'step', - desc: '', - args: [], - ); + return Intl.message('Шаг', name: 'step', desc: '', args: []); } /// `Пошаговый фоторецепт` @@ -2579,12 +2016,7 @@ class S { /// `Спам` String get spam { - return Intl.message( - 'Спам', - name: 'spam', - desc: '', - args: [], - ); + return Intl.message('Спам', name: 'spam', desc: '', args: []); } /// `Нарушение законодательства` @@ -2599,12 +2031,7 @@ class S { /// `Обман` String get deception { - return Intl.message( - 'Обман', - name: 'deception', - desc: '', - args: [], - ); + return Intl.message('Обман', name: 'deception', desc: '', args: []); } /// `Насилие и вражда` @@ -2649,12 +2076,7 @@ class S { /// `Жалоба` String get complaint { - return Intl.message( - 'Жалоба', - name: 'complaint', - desc: '', - args: [], - ); + return Intl.message('Жалоба', name: 'complaint', desc: '', args: []); } /// `Что именно в этом материале Вы считаете неприемлемым и нарушающим правила?` @@ -2719,52 +2141,27 @@ class S { /// `Хорошо` String get ok { - return Intl.message( - 'Хорошо', - name: 'ok', - desc: '', - args: [], - ); + return Intl.message('Хорошо', name: 'ok', desc: '', args: []); } /// `Алкоголь` String get alcohol { - return Intl.message( - 'Алкоголь', - name: 'alcohol', - desc: '', - args: [], - ); + return Intl.message('Алкоголь', name: 'alcohol', desc: '', args: []); } /// `Наркотики` String get drugs { - return Intl.message( - 'Наркотики', - name: 'drugs', - desc: '', - args: [], - ); + return Intl.message('Наркотики', name: 'drugs', desc: '', args: []); } /// `Никотин` String get nicotine { - return Intl.message( - 'Никотин', - name: 'nicotine', - desc: '', - args: [], - ); + return Intl.message('Никотин', name: 'nicotine', desc: '', args: []); } /// `Оружие` String get weapon { - return Intl.message( - 'Оружие', - name: 'weapon', - desc: '', - args: [], - ); + return Intl.message('Оружие', name: 'weapon', desc: '', args: []); } /// `Поддельные документы` @@ -2789,12 +2186,7 @@ class S { /// `Другое` String get other { - return Intl.message( - 'Другое', - name: 'other', - desc: '', - args: [], - ); + return Intl.message('Другое', name: 'other', desc: '', args: []); } /// `Введение в заблуждение` @@ -2819,12 +2211,7 @@ class S { /// `Мошенничество` String get fraud { - return Intl.message( - 'Мошенничество', - name: 'fraud', - desc: '', - args: [], - ); + return Intl.message('Мошенничество', name: 'fraud', desc: '', args: []); } /// `Мошенничество с целью наживы. Если вас обманули, пожалуйста, сообщите об этом в правоохранительные органы.` @@ -2849,12 +2236,7 @@ class S { /// `Оскорбление` String get hatred { - return Intl.message( - 'Оскорбление', - name: 'hatred', - desc: '', - args: [], - ); + return Intl.message('Оскорбление', name: 'hatred', desc: '', args: []); } /// `Склонение к самоубийству` @@ -2879,12 +2261,7 @@ class S { /// `Экстремизм` String get extremism { - return Intl.message( - 'Экстремизм', - name: 'extremism', - desc: '', - args: [], - ); + return Intl.message('Экстремизм', name: 'extremism', desc: '', args: []); } /// `Призывы к травле` @@ -2939,12 +2316,7 @@ class S { /// `Ваш рейтинг` String get your_rating { - return Intl.message( - 'Ваш рейтинг', - name: 'your_rating', - desc: '', - args: [], - ); + return Intl.message('Ваш рейтинг', name: 'your_rating', desc: '', args: []); } /// `Скопировать пригласительную ссылку` @@ -2959,12 +2331,7 @@ class S { /// `Статистика` String get statistic { - return Intl.message( - 'Статистика', - name: 'statistic', - desc: '', - args: [], - ); + return Intl.message('Статистика', name: 'statistic', desc: '', args: []); } /// `За всё время` @@ -2979,32 +2346,17 @@ class S { /// `За год` String get for_a_year { - return Intl.message( - 'За год', - name: 'for_a_year', - desc: '', - args: [], - ); + return Intl.message('За год', name: 'for_a_year', desc: '', args: []); } /// `За месяц` String get for_a_month { - return Intl.message( - 'За месяц', - name: 'for_a_month', - desc: '', - args: [], - ); + return Intl.message('За месяц', name: 'for_a_month', desc: '', args: []); } /// `За неделю` String get for_a_week { - return Intl.message( - 'За неделю', - name: 'for_a_week', - desc: '', - args: [], - ); + return Intl.message('За неделю', name: 'for_a_week', desc: '', args: []); } /// `Количество приглашенных` @@ -3229,12 +2581,7 @@ class S { /// `Заказать` String get to_order { - return Intl.message( - 'Заказать', - name: 'to_order', - desc: '', - args: [], - ); + return Intl.message('Заказать', name: 'to_order', desc: '', args: []); } /// `Дату старта плана невозможно выбрать, пока Вы не привяжите карту` @@ -3299,12 +2646,7 @@ class S { /// `Оплатить` String get pay { - return Intl.message( - 'Оплатить', - name: 'pay', - desc: '', - args: [], - ); + return Intl.message('Оплатить', name: 'pay', desc: '', args: []); } /// `Подробнее о заказе` @@ -3359,22 +2701,12 @@ class S { /// `Мои карты` String get my_cards { - return Intl.message( - 'Мои карты', - name: 'my_cards', - desc: '', - args: [], - ); + return Intl.message('Мои карты', name: 'my_cards', desc: '', args: []); } /// `Добавить карту` String get new_card { - return Intl.message( - 'Добавить карту', - name: 'new_card', - desc: '', - args: [], - ); + return Intl.message('Добавить карту', name: 'new_card', desc: '', args: []); } /// `У вас нет привязанных карт. Что бы начать работу, привяжите карту` @@ -3479,12 +2811,7 @@ class S { /// `Завершен` String get done { - return Intl.message( - 'Завершен', - name: 'done', - desc: '', - args: [], - ); + return Intl.message('Завершен', name: 'done', desc: '', args: []); } /// `Поздравляем, консультация успешно оплачена` @@ -3649,12 +2976,7 @@ class S { /// `Отправить` String get send { - return Intl.message( - 'Отправить', - name: 'send', - desc: '', - args: [], - ); + return Intl.message('Отправить', name: 'send', desc: '', args: []); } /// `Прокомментировать день` @@ -3739,12 +3061,7 @@ class S { /// `Отменить` String get cancel { - return Intl.message( - 'Отменить', - name: 'cancel', - desc: '', - args: [], - ); + return Intl.message('Отменить', name: 'cancel', desc: '', args: []); } /// `Заказ отменен` @@ -4109,22 +3426,12 @@ class S { /// `Скопировать` String get copy { - return Intl.message( - 'Скопировать', - name: 'copy', - desc: '', - args: [], - ); + return Intl.message('Скопировать', name: 'copy', desc: '', args: []); } /// `Ответить` String get reply { - return Intl.message( - 'Ответить', - name: 'reply', - desc: '', - args: [], - ); + return Intl.message('Ответить', name: 'reply', desc: '', args: []); } /// `Удалить комментарий` @@ -4249,12 +3556,7 @@ class S { /// `Удалить` String get delete { - return Intl.message( - 'Удалить', - name: 'delete', - desc: '', - args: [], - ); + return Intl.message('Удалить', name: 'delete', desc: '', args: []); } /// `Не получилось удалить ваш аккаунт` @@ -4299,12 +3601,7 @@ class S { /// `Ваше имя` String get your_name { - return Intl.message( - 'Ваше имя', - name: 'your_name', - desc: '', - args: [], - ); + return Intl.message('Ваше имя', name: 'your_name', desc: '', args: []); } /// `Ваша фамилия` @@ -4329,42 +3626,22 @@ class S { /// `Телефон` String get phone { - return Intl.message( - 'Телефон', - name: 'phone', - desc: '', - args: [], - ); + return Intl.message('Телефон', name: 'phone', desc: '', args: []); } /// `М` String get male_short { - return Intl.message( - 'М', - name: 'male_short', - desc: '', - args: [], - ); + return Intl.message('М', name: 'male_short', desc: '', args: []); } /// `Ж` String get female_short { - return Intl.message( - 'Ж', - name: 'female_short', - desc: '', - args: [], - ); + return Intl.message('Ж', name: 'female_short', desc: '', args: []); } /// `Далее` String get next { - return Intl.message( - 'Далее', - name: 'next', - desc: '', - args: [], - ); + return Intl.message('Далее', name: 'next', desc: '', args: []); } /// `Введите рост` @@ -4379,12 +3656,7 @@ class S { /// `Введите вес` String get type_weight { - return Intl.message( - 'Введите вес', - name: 'type_weight', - desc: '', - args: [], - ); + return Intl.message('Введите вес', name: 'type_weight', desc: '', args: []); } /// `Зарегистрироваться` @@ -4399,12 +3671,7 @@ class S { /// `Последний шаг` String get last_step { - return Intl.message( - 'Последний шаг', - name: 'last_step', - desc: '', - args: [], - ); + return Intl.message('Последний шаг', name: 'last_step', desc: '', args: []); } /// `Эти данные нужны для корректной работы дневника питания и расчета вашей дневной нормы потребления КБЖУ` @@ -4599,22 +3866,12 @@ class S { /// `Скопировано!` String get copied2 { - return Intl.message( - 'Скопировано!', - name: 'copied2', - desc: '', - args: [], - ); + return Intl.message('Скопировано!', name: 'copied2', desc: '', args: []); } /// `Войти в аккаунт` String get login { - return Intl.message( - 'Войти в аккаунт', - name: 'login', - desc: '', - args: [], - ); + return Intl.message('Войти в аккаунт', name: 'login', desc: '', args: []); } /// `Регистрация не удалась!` @@ -4639,12 +3896,7 @@ class S { /// `Покупатель` String get customer { - return Intl.message( - 'Покупатель', - name: 'customer', - desc: '', - args: [], - ); + return Intl.message('Покупатель', name: 'customer', desc: '', args: []); } /// `Персональная диета установлена` @@ -4679,12 +3931,7 @@ class S { /// `14 дней` String get fourteenDays { - return Intl.message( - '14 дней', - name: 'fourteenDays', - desc: '', - args: [], - ); + return Intl.message('14 дней', name: 'fourteenDays', desc: '', args: []); } /// `Мы собираем самое большое сообщество людей, желающих вести здоровый образ жизни!` @@ -4719,12 +3966,7 @@ class S { /// `Пригласить` String get invite { - return Intl.message( - 'Пригласить', - name: 'invite', - desc: '', - args: [], - ); + return Intl.message('Пригласить', name: 'invite', desc: '', args: []); } /// `Комментарий` @@ -4763,4 +4005,4 @@ class AppLocalizationDelegate extends LocalizationsDelegate { } return false; } -} \ No newline at end of file +} diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 0d35bac4..18c1e305 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -69,6 +69,7 @@ "no_account": "У меня нет аккаунта", "authentificate": "Войти", "user_authorization": "Аутентификация", + "authorization": "Authorization", "loading": "Загрузка...", "weight_chart": "График веса", "circumferences_chart": "График обхватов", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 32c6f650..d3dd10f5 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -69,6 +69,7 @@ "no_account": "У меня нет аккаунта", "authentificate": "Войти", "user_authorization": "Аутентификация", + "authorization": "Авторизация", "loading": "Загрузка...", "weight_chart": "График веса", "circumferences_chart": "График обхватов", diff --git a/pubspec.yaml b/pubspec.yaml index 35a43397..2be3e4c5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -83,6 +83,7 @@ dependencies: rxdart: ^0.27.7 gpassword: ^1.0.0 webview_flutter_platform_interface: ^2.14.0 + intl_utils: ^2.8.13 dev_dependencies: build_runner: ^2.10.4 From 6ccfcdedda6ba87bb88a01070c07b77e6c440e22 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Mon, 19 Jan 2026 16:06:19 +0300 Subject: [PATCH 10/10] feat: create AddProductModal for adding and editing diary product portions with glossary search functionality. --- lib/features/diary/presentation/widgets/add_product_modal.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/features/diary/presentation/widgets/add_product_modal.dart b/lib/features/diary/presentation/widgets/add_product_modal.dart index 335fdb33..c3d9067d 100644 --- a/lib/features/diary/presentation/widgets/add_product_modal.dart +++ b/lib/features/diary/presentation/widgets/add_product_modal.dart @@ -166,7 +166,7 @@ class _AddProductModalState extends State { InkWell( onTap: () { // Автоматически выбираем первый элемент, если текст точно совпадает - if (selectedGlossary == null && glossariesList.isNotEmpty && productNameController.text.trim() == glossariesList[0].name) { + if (selectedGlossary == null && glossariesList.isNotEmpty && productNameController.text.trim().toLowerCase() == glossariesList[0].name.toLowerCase()) { selectedGlossary = glossariesList[0]; }