From bf2ba1fbda73233377aa89929ea72aa84738fb11 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Tue, 13 Jan 2026 12:36:12 +0300 Subject: [PATCH 1/4] 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 2/4] 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 3/4] 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 4852d2cf1042df46f6cde64efdbdd444e4fc4442 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Wed, 14 Jan 2026 14:48:32 +0300 Subject: [PATCH 4/4] 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); -}