From 7eef2029ead5e4aea4efb75a8e5549fc6bb7646d Mon Sep 17 00:00:00 2001 From: andriikamaldinov1 Date: Fri, 3 Jan 2025 14:35:29 +0200 Subject: [PATCH 1/5] feat(ref: no-ref): add translations --- .../app-translation/app-translation.dart | 51 +++++++++++++++++ .../translation.extensions.dart | 14 +++++ lib/main.dart | 8 ++- lib/screens/home/home.binding.dart | 4 ++ lib/screens/home/home.screen.dart | 7 +++ .../language-switcher.controller.dart | 13 +++++ .../language-switcher/language-switcher.dart | 55 +++++++++++++++++++ .../language-switcher.enum.dart | 12 ++++ lib/screens/home/title/title.translation.dart | 17 ++++++ lib/screens/home/title/title.widget.dart | 11 ++-- .../todo/add-task/add-task.translation.dart | 17 ++++++ .../home/todo/add-task/add-task.widget.dart | 4 +- .../todo/filter-panel/filter-panel.enum.dart | 15 +++-- .../filter-panel.translation.dart | 35 ++++++++++++ .../filter-panel/filter-panel.widget.dart | 4 +- pubspec.lock | 8 +++ pubspec.yaml | 1 + 17 files changed, 264 insertions(+), 12 deletions(-) create mode 100644 lib/common/app-translation/app-translation.dart create mode 100644 lib/common/app-translation/translation.extensions.dart create mode 100644 lib/screens/home/language-switcher/language-switcher.controller.dart create mode 100644 lib/screens/home/language-switcher/language-switcher.dart create mode 100644 lib/screens/home/language-switcher/language-switcher.enum.dart create mode 100644 lib/screens/home/title/title.translation.dart create mode 100644 lib/screens/home/todo/add-task/add-task.translation.dart create mode 100644 lib/screens/home/todo/filter-panel/filter-panel.translation.dart diff --git a/lib/common/app-translation/app-translation.dart b/lib/common/app-translation/app-translation.dart new file mode 100644 index 0000000..09f7860 --- /dev/null +++ b/lib/common/app-translation/app-translation.dart @@ -0,0 +1,51 @@ +import 'package:get/get.dart'; + +import '../../screens/home/title/title.translation.dart' as home_title; +import '../../screens/home/todo/add-task/add-task.translation.dart' + as home_add_task; +import '../../screens/home/todo/filter-panel/filter-panel.translation.dart' + as home_filter_panel; + +class AppTranslation extends GetxService { + AppTranslation(); + + Map> translationsKeys = + >{ + 'en': en, + 'uk': uk, + 'ru': ru, + }; + + void _combineTranslations(Map enTranslations, + Map ukTranslations, Map ruTranslations) { + translationsKeys['en']!.addAll(enTranslations); + translationsKeys['uk']!.addAll(ukTranslations); + translationsKeys['ru']!.addAll(ruTranslations); + } + + Map> combineAllTranslations() { + _combineTranslations( + home_title.en, + home_title.uk, + home_title.ru, + ); + + _combineTranslations( + home_add_task.en, + home_add_task.uk, + home_add_task.ru, + ); + + _combineTranslations( + home_filter_panel.en, + home_filter_panel.uk, + home_filter_panel.ru, + ); + + return translationsKeys; + } +} + +final Map en = {}; +final Map uk = {}; +final Map ru = {}; diff --git a/lib/common/app-translation/translation.extensions.dart b/lib/common/app-translation/translation.extensions.dart new file mode 100644 index 0000000..3c1f8b3 --- /dev/null +++ b/lib/common/app-translation/translation.extensions.dart @@ -0,0 +1,14 @@ +import 'package:get/get.dart'; + +abstract class Translation {} + +extension Translations on Translation { + String get st => '$this'; + String get tr => st.tr; +} + +extension MapEnumExtensions on Map { + Map get st => Map.fromEntries(entries.map( + (MapEntry entry) => + MapEntry(entry.key.st, entry.value))); +} diff --git a/lib/main.dart b/lib/main.dart index 8472f82..334dbe2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,9 +1,12 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'common/app-translation/app-translation.dart'; import 'screens/home/home.binding.dart'; import 'screens/home/home.screen.dart'; -void main() { +Future main() async { + await HomeBinding().dependencies(); + runApp(const MyApp()); } @@ -14,5 +17,8 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) => GetMaterialApp( initialBinding: HomeBinding(), home: const HomeScreen(), + translationsKeys: Get.find().combineAllTranslations(), + locale: const Locale('en'), + fallbackLocale: const Locale('en'), ); } diff --git a/lib/screens/home/home.binding.dart b/lib/screens/home/home.binding.dart index 25cb19c..851bab2 100644 --- a/lib/screens/home/home.binding.dart +++ b/lib/screens/home/home.binding.dart @@ -1,4 +1,6 @@ import 'package:get/get.dart'; +import '../../common/app-translation/app-translation.dart'; +import 'language-switcher/language-switcher.controller.dart'; import 'todo/add-task/add-task.controller.dart'; import 'todo/filter-panel/filter-panel.controller.dart'; import 'todo/task-list-item/task-list-item.controller.dart'; @@ -8,7 +10,9 @@ class HomeBinding extends Bindings { @override Future dependencies() async { Get + ..lazyPut(AppTranslation.new) ..lazyPut(TodoService.new) + ..lazyPut(LocaleController.new) ..lazyPut(() => AddTaskController(Get.find())) ..lazyPut(() => FilterPanelController(Get.find())) ..lazyPut(() => TaskListItemController(Get.find(), Get.find())); diff --git a/lib/screens/home/home.screen.dart b/lib/screens/home/home.screen.dart index 2bff3c6..26fd53a 100644 --- a/lib/screens/home/home.screen.dart +++ b/lib/screens/home/home.screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'language-switcher/language-switcher.dart'; import 'todo/todo.widget.dart'; import '../home/title/title.widget.dart'; @@ -10,6 +11,12 @@ class HomeScreen extends StatelessWidget { body: ListView( children: const [ Center(child: TitleWidget()), + Padding( + padding: EdgeInsets.only(bottom: 20), + child: Center( + child: LanguageSwitcher(), + ), + ), TodoWidget(), ], ), diff --git a/lib/screens/home/language-switcher/language-switcher.controller.dart b/lib/screens/home/language-switcher/language-switcher.controller.dart new file mode 100644 index 0000000..d588075 --- /dev/null +++ b/lib/screens/home/language-switcher/language-switcher.controller.dart @@ -0,0 +1,13 @@ +import 'package:get/get.dart'; +import 'language-switcher.enum.dart'; + +class LocaleController extends GetxController { + final Rx currentLanguage = Language.en.obs; + + List get languages => Language.values; + + void updateLocale(Language language) { + currentLanguage.value = language; + Get.updateLocale(language.locale); + } +} diff --git a/lib/screens/home/language-switcher/language-switcher.dart b/lib/screens/home/language-switcher/language-switcher.dart new file mode 100644 index 0000000..2166c43 --- /dev/null +++ b/lib/screens/home/language-switcher/language-switcher.dart @@ -0,0 +1,55 @@ +// import 'package:flutter/material.dart'; +// import 'package:get/get.dart'; +// import 'language-switcher.controller.dart'; +// +// class LanguageSwitcher extends GetView { +// const LanguageSwitcher({super.key}); +// +// @override +// Widget build(BuildContext context) => Obx(() => DropdownButton( +// value: controller.locales.firstWhere( +// (Locale locale) => +// locale.languageCode == +// controller.currentLocale.value.languageCode, +// orElse: () => controller.locales.first, +// ), +// onChanged: (Locale? locale) { +// if (locale != null) { +// controller.updateLocale(locale); +// } +// }, +// items: controller.locales +// .map>( +// (Locale locale) => DropdownMenuItem( +// value: locale, +// child: Text(controller.localeNames[locale.languageCode] ?? +// locale.languageCode), +// )) +// .toList(), +// )); +// } +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'language-switcher.controller.dart'; +import 'language-switcher.enum.dart'; + +class LanguageSwitcher extends GetView { + const LanguageSwitcher({super.key}); + + @override + Widget build(BuildContext context) => Obx(() => DropdownButton( + value: controller.currentLanguage.value, + onChanged: (Language? language) { + if (language != null) { + controller.updateLocale(language); + } + }, + items: controller.languages + .map>( + (Language language) => DropdownMenuItem( + value: language, + child: Text(language.title), + )) + .toList(), + )); +} diff --git a/lib/screens/home/language-switcher/language-switcher.enum.dart b/lib/screens/home/language-switcher/language-switcher.enum.dart new file mode 100644 index 0000000..9030316 --- /dev/null +++ b/lib/screens/home/language-switcher/language-switcher.enum.dart @@ -0,0 +1,12 @@ +import 'dart:ui'; + +enum Language { + en(Locale('en'), 'English'), + ru(Locale('ru'), 'Русский'), + uk(Locale('uk'), 'Українська'); + + const Language(this.locale, this.title); + + final Locale locale; + final String title; +} diff --git a/lib/screens/home/title/title.translation.dart b/lib/screens/home/title/title.translation.dart new file mode 100644 index 0000000..9eba73c --- /dev/null +++ b/lib/screens/home/title/title.translation.dart @@ -0,0 +1,17 @@ +import '../../../common/app-translation/translation.extensions.dart'; + +enum TitleTranslationNames implements Translation { + title, +} + +final Map en = { + TitleTranslationNames.title: 'todos', +}.st; + +final Map ru = { + TitleTranslationNames.title: 'Список задач', +}.st; + +final Map uk = { + TitleTranslationNames.title: 'Список завдань', +}.st; diff --git a/lib/screens/home/title/title.widget.dart b/lib/screens/home/title/title.widget.dart index b3d815d..64c32b3 100644 --- a/lib/screens/home/title/title.widget.dart +++ b/lib/screens/home/title/title.widget.dart @@ -1,14 +1,17 @@ import 'package:flutter/material.dart'; +import 'title.translation.dart'; +import '../../../common/app-translation/translation.extensions.dart'; + class TitleWidget extends StatelessWidget { const TitleWidget({super.key}); @override - Widget build(BuildContext context) => const Padding( - padding: EdgeInsets.only(top: 50, bottom: 20), + Widget build(BuildContext context) => Padding( + padding: const EdgeInsets.only(top: 50, bottom: 20), child: Text( - 'todos', - style: TextStyle( + TitleTranslationNames.title.tr, + style: const TextStyle( fontSize: 80, fontWeight: FontWeight.w300, color: Colors.red, diff --git a/lib/screens/home/todo/add-task/add-task.translation.dart b/lib/screens/home/todo/add-task/add-task.translation.dart new file mode 100644 index 0000000..d7d62c0 --- /dev/null +++ b/lib/screens/home/todo/add-task/add-task.translation.dart @@ -0,0 +1,17 @@ +import '../../../../common/app-translation/translation.extensions.dart'; + +enum AddTaskTranslationNames implements Translation { + title, +} + +final Map en = { + AddTaskTranslationNames.title: 'What needs to be done?', +}.st; + +final Map ru = { + AddTaskTranslationNames.title: 'Что нужно сделать?', +}.st; + +final Map uk = { + AddTaskTranslationNames.title: 'Що потрібно зробити?', +}.st; diff --git a/lib/screens/home/todo/add-task/add-task.widget.dart b/lib/screens/home/todo/add-task/add-task.widget.dart index 73cf924..07b48d8 100644 --- a/lib/screens/home/todo/add-task/add-task.widget.dart +++ b/lib/screens/home/todo/add-task/add-task.widget.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import '../../../../common/app-translation/translation.extensions.dart'; import '../../../../common/input/input.widget.dart'; import 'add-task.controller.dart'; +import 'add-task.translation.dart'; class AddTaskWidget extends GetView { const AddTaskWidget({super.key}); @@ -16,7 +18,7 @@ class AddTaskWidget extends GetView { child: InputWidget( textController: controller.textController, focusNode: controller.focusNode, - hintText: 'What needs to be done?', + hintText: AddTaskTranslationNames.title.tr, onSubmitted: controller.addTask, ), ); diff --git a/lib/screens/home/todo/filter-panel/filter-panel.enum.dart b/lib/screens/home/todo/filter-panel/filter-panel.enum.dart index 49370fc..7907b2a 100644 --- a/lib/screens/home/todo/filter-panel/filter-panel.enum.dart +++ b/lib/screens/home/todo/filter-panel/filter-panel.enum.dart @@ -1,9 +1,14 @@ +import '../../../../common/app-translation/translation.extensions.dart'; +import 'filter-panel.translation.dart'; + enum FilterType { - all('All'), - active('Active'), - completed('Completed'); + all(FilterPanelTranslationNames.all), + active(FilterPanelTranslationNames.active), + completed(FilterPanelTranslationNames.completed); + + const FilterType(this.translationKey); - const FilterType(this.type); + final FilterPanelTranslationNames translationKey; - final String type; + String get type => translationKey.tr; } diff --git a/lib/screens/home/todo/filter-panel/filter-panel.translation.dart b/lib/screens/home/todo/filter-panel/filter-panel.translation.dart new file mode 100644 index 0000000..b7a9659 --- /dev/null +++ b/lib/screens/home/todo/filter-panel/filter-panel.translation.dart @@ -0,0 +1,35 @@ +import '../../../../common/app-translation/translation.extensions.dart'; + +enum FilterPanelTranslationNames implements Translation { + clearItems, + itemsLeft, + all, + active, + completed +} + +final Map en = { + FilterPanelTranslationNames.clearItems: 'Clear completed', + FilterPanelTranslationNames.all: 'All', + FilterPanelTranslationNames.active: 'Active', + FilterPanelTranslationNames.completed: 'Completed', + FilterPanelTranslationNames.itemsLeft: '@count items left', +}.st; + +final Map ru = { + FilterPanelTranslationNames.clearItems: 'Очистить выполненные', + FilterPanelTranslationNames.all: 'Все', + FilterPanelTranslationNames.active: 'Активные', + FilterPanelTranslationNames.completed: 'Выполненные', + FilterPanelTranslationNames.itemsLeft: + '@count элемент остался|@count элемента осталось|@count элементов осталось', +}.st; + +final Map uk = { + FilterPanelTranslationNames.clearItems: 'Очистити виконані', + FilterPanelTranslationNames.all: 'Усі', + FilterPanelTranslationNames.active: 'Активні', + FilterPanelTranslationNames.completed: 'Виконані', + FilterPanelTranslationNames.itemsLeft: + '@count елемент залишився|@count елементи залишились|@count елементів залишилось', +}.st; diff --git a/lib/screens/home/todo/filter-panel/filter-panel.widget.dart b/lib/screens/home/todo/filter-panel/filter-panel.widget.dart index adab1bd..f68d32e 100644 --- a/lib/screens/home/todo/filter-panel/filter-panel.widget.dart +++ b/lib/screens/home/todo/filter-panel/filter-panel.widget.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import '../../../../common/app-translation/translation.extensions.dart'; import '../../../../common/button/button.widget.dart'; import 'filter-panel-buttons/filter-panel-buttons.dart'; import 'filter-panel.controller.dart'; +import 'filter-panel.translation.dart'; class FilterPanelWidget extends GetView { const FilterPanelWidget({super.key}); @@ -29,7 +31,7 @@ class FilterPanelWidget extends GetView { if (!isMobile) const FilterPanelButtons(), ButtonWidget( onTap: controller.clearCompleted, - title: 'Clear completed', + title: FilterPanelTranslationNames.clearItems.tr, ), ], ), diff --git a/pubspec.lock b/pubspec.lock index 3c9ba11..efd253f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -256,6 +256,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.2.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" jsdaddy_custom_lints: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index f556000..5fd214c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,6 +12,7 @@ dependencies: sdk: flutter get: ^4.6.6 cupertino_icons: ^1.0.8 + intl: ^0.19.0 dev_dependencies: flutter_test: From a2866af543ee9661b3cadf7b115c01d06236984b Mon Sep 17 00:00:00 2001 From: andriikamaldinov1 Date: Fri, 3 Jan 2025 16:47:18 +0200 Subject: [PATCH 2/5] feat(ref: no-ref): add translations --- .../app-translation/app-translation.dart | 13 ++++++++ .../items-left/items-left.extensions.dart | 30 +++++++++++++++++ .../items-left/items-left.translation.dart | 25 +++++++++++++++ lib/screens/home/home.binding.dart | 2 +- .../language-switcher.controller.dart | 2 +- .../language-switcher/language-switcher.dart | 32 +------------------ .../filter-panel.translation.dart | 6 ---- .../filter-panel/filter-panel.widget.dart | 19 +++++------ 8 files changed, 79 insertions(+), 50 deletions(-) create mode 100644 lib/common/items-left/items-left.extensions.dart create mode 100644 lib/common/items-left/items-left.translation.dart diff --git a/lib/common/app-translation/app-translation.dart b/lib/common/app-translation/app-translation.dart index 09f7860..bf0cf53 100644 --- a/lib/common/app-translation/app-translation.dart +++ b/lib/common/app-translation/app-translation.dart @@ -5,6 +5,7 @@ import '../../screens/home/todo/add-task/add-task.translation.dart' as home_add_task; import '../../screens/home/todo/filter-panel/filter-panel.translation.dart' as home_filter_panel; +import '../items-left/items-left.translation.dart' as items_left; class AppTranslation extends GetxService { AppTranslation(); @@ -42,6 +43,18 @@ class AppTranslation extends GetxService { home_filter_panel.ru, ); + _combineTranslations( + home_filter_panel.en, + home_filter_panel.uk, + home_filter_panel.ru, + ); + + _combineTranslations( + items_left.en, + items_left.uk, + items_left.ru, + ); + return translationsKeys; } } diff --git a/lib/common/items-left/items-left.extensions.dart b/lib/common/items-left/items-left.extensions.dart new file mode 100644 index 0000000..c3e3943 --- /dev/null +++ b/lib/common/items-left/items-left.extensions.dart @@ -0,0 +1,30 @@ +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; + +import '../app-translation/translation.extensions.dart'; +import 'items-left.translation.dart'; + +extension ItemsLeftFormatting on int { + String get itemsLeft => _getPlural( + this, + one: ItemsLeftTranslationNames.oneItem.tr, + few: ItemsLeftTranslationNames.fewItems.tr, + many: ItemsLeftTranslationNames.manyItems.tr, + ).trim(); + + String _getPlural(int value, + {required String one, required String few, required String many}) { + if (value > 0) { + return Intl.plural( + value, + zero: '', + one: '$value $one', + few: '$value $few', + many: '$value $many', + other: '$value $many', + locale: Get.locale?.languageCode, + ); + } + return ''; + } +} diff --git a/lib/common/items-left/items-left.translation.dart b/lib/common/items-left/items-left.translation.dart new file mode 100644 index 0000000..2d2d451 --- /dev/null +++ b/lib/common/items-left/items-left.translation.dart @@ -0,0 +1,25 @@ +import '../../../../common/app-translation/translation.extensions.dart'; + +enum ItemsLeftTranslationNames implements Translation { + oneItem, + fewItems, + manyItems, +} + +final Map en = { + ItemsLeftTranslationNames.oneItem: 'item left', + ItemsLeftTranslationNames.fewItems: 'items left', + ItemsLeftTranslationNames.manyItems: 'items left', +}.st; + +final Map ru = { + ItemsLeftTranslationNames.oneItem: 'элемент остался', + ItemsLeftTranslationNames.fewItems: 'элемента осталось', + ItemsLeftTranslationNames.manyItems: 'элементов осталось', +}.st; + +final Map uk = { + ItemsLeftTranslationNames.oneItem: 'елемент залишився', + ItemsLeftTranslationNames.fewItems: 'елементи залишились', + ItemsLeftTranslationNames.manyItems: 'елементів залишилось', +}.st; diff --git a/lib/screens/home/home.binding.dart b/lib/screens/home/home.binding.dart index 851bab2..a616bf0 100644 --- a/lib/screens/home/home.binding.dart +++ b/lib/screens/home/home.binding.dart @@ -12,7 +12,7 @@ class HomeBinding extends Bindings { Get ..lazyPut(AppTranslation.new) ..lazyPut(TodoService.new) - ..lazyPut(LocaleController.new) + ..lazyPut(LanguageSwitcherController.new) ..lazyPut(() => AddTaskController(Get.find())) ..lazyPut(() => FilterPanelController(Get.find())) ..lazyPut(() => TaskListItemController(Get.find(), Get.find())); diff --git a/lib/screens/home/language-switcher/language-switcher.controller.dart b/lib/screens/home/language-switcher/language-switcher.controller.dart index d588075..210e59a 100644 --- a/lib/screens/home/language-switcher/language-switcher.controller.dart +++ b/lib/screens/home/language-switcher/language-switcher.controller.dart @@ -1,7 +1,7 @@ import 'package:get/get.dart'; import 'language-switcher.enum.dart'; -class LocaleController extends GetxController { +class LanguageSwitcherController extends GetxController { final Rx currentLanguage = Language.en.obs; List get languages => Language.values; diff --git a/lib/screens/home/language-switcher/language-switcher.dart b/lib/screens/home/language-switcher/language-switcher.dart index 2166c43..5ce93e1 100644 --- a/lib/screens/home/language-switcher/language-switcher.dart +++ b/lib/screens/home/language-switcher/language-switcher.dart @@ -1,39 +1,9 @@ -// import 'package:flutter/material.dart'; -// import 'package:get/get.dart'; -// import 'language-switcher.controller.dart'; -// -// class LanguageSwitcher extends GetView { -// const LanguageSwitcher({super.key}); -// -// @override -// Widget build(BuildContext context) => Obx(() => DropdownButton( -// value: controller.locales.firstWhere( -// (Locale locale) => -// locale.languageCode == -// controller.currentLocale.value.languageCode, -// orElse: () => controller.locales.first, -// ), -// onChanged: (Locale? locale) { -// if (locale != null) { -// controller.updateLocale(locale); -// } -// }, -// items: controller.locales -// .map>( -// (Locale locale) => DropdownMenuItem( -// value: locale, -// child: Text(controller.localeNames[locale.languageCode] ?? -// locale.languageCode), -// )) -// .toList(), -// )); -// } import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'language-switcher.controller.dart'; import 'language-switcher.enum.dart'; -class LanguageSwitcher extends GetView { +class LanguageSwitcher extends GetView { const LanguageSwitcher({super.key}); @override diff --git a/lib/screens/home/todo/filter-panel/filter-panel.translation.dart b/lib/screens/home/todo/filter-panel/filter-panel.translation.dart index b7a9659..4d105e9 100644 --- a/lib/screens/home/todo/filter-panel/filter-panel.translation.dart +++ b/lib/screens/home/todo/filter-panel/filter-panel.translation.dart @@ -2,7 +2,6 @@ import '../../../../common/app-translation/translation.extensions.dart'; enum FilterPanelTranslationNames implements Translation { clearItems, - itemsLeft, all, active, completed @@ -13,7 +12,6 @@ final Map en = { FilterPanelTranslationNames.all: 'All', FilterPanelTranslationNames.active: 'Active', FilterPanelTranslationNames.completed: 'Completed', - FilterPanelTranslationNames.itemsLeft: '@count items left', }.st; final Map ru = { @@ -21,8 +19,6 @@ final Map ru = { FilterPanelTranslationNames.all: 'Все', FilterPanelTranslationNames.active: 'Активные', FilterPanelTranslationNames.completed: 'Выполненные', - FilterPanelTranslationNames.itemsLeft: - '@count элемент остался|@count элемента осталось|@count элементов осталось', }.st; final Map uk = { @@ -30,6 +26,4 @@ final Map uk = { FilterPanelTranslationNames.all: 'Усі', FilterPanelTranslationNames.active: 'Активні', FilterPanelTranslationNames.completed: 'Виконані', - FilterPanelTranslationNames.itemsLeft: - '@count елемент залишився|@count елементи залишились|@count елементів залишилось', }.st; diff --git a/lib/screens/home/todo/filter-panel/filter-panel.widget.dart b/lib/screens/home/todo/filter-panel/filter-panel.widget.dart index f68d32e..0a3d6c3 100644 --- a/lib/screens/home/todo/filter-panel/filter-panel.widget.dart +++ b/lib/screens/home/todo/filter-panel/filter-panel.widget.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../../common/app-translation/translation.extensions.dart'; import '../../../../common/button/button.widget.dart'; +import '../../../../common/items-left/items-left.extensions.dart'; import 'filter-panel-buttons/filter-panel-buttons.dart'; import 'filter-panel.controller.dart'; import 'filter-panel.translation.dart'; @@ -11,8 +12,6 @@ class FilterPanelWidget extends GetView { @override Widget build(BuildContext context) => Obx(() { - final bool isMobile = MediaQuery.of(context).size.width < 600; - if (controller.tasks.isEmpty) { return const SizedBox(); } @@ -25,23 +24,21 @@ class FilterPanelWidget extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '${controller.activeCount} items left', + controller.activeCount.itemsLeft, style: const TextStyle(fontSize: 14, color: Colors.grey), ), - if (!isMobile) const FilterPanelButtons(), ButtonWidget( onTap: controller.clearCompleted, title: FilterPanelTranslationNames.clearItems.tr, ), ], ), - if (isMobile) - const Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FilterPanelButtons(), - ], - ), + const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FilterPanelButtons(), + ], + ), ], ), ); From 58e9afd2847a8c5ac252ede5fe7cb4ee59f8d979 Mon Sep 17 00:00:00 2001 From: andriikamaldinov1 Date: Fri, 3 Jan 2025 16:50:29 +0200 Subject: [PATCH 3/5] feat(ref: no-ref): add translations --- lib/screens/home/title/title.widget.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/screens/home/title/title.widget.dart b/lib/screens/home/title/title.widget.dart index 64c32b3..82ac4a2 100644 --- a/lib/screens/home/title/title.widget.dart +++ b/lib/screens/home/title/title.widget.dart @@ -11,6 +11,7 @@ class TitleWidget extends StatelessWidget { padding: const EdgeInsets.only(top: 50, bottom: 20), child: Text( TitleTranslationNames.title.tr, + textAlign: TextAlign.center, style: const TextStyle( fontSize: 80, fontWeight: FontWeight.w300, From b6fb185cf976cde8644518b153515089774c741a Mon Sep 17 00:00:00 2001 From: andriikamaldinov1 Date: Tue, 7 Jan 2025 15:19:21 +0200 Subject: [PATCH 4/5] feat(ref: no-ref): fix comments --- .../app-translation/app-translation.dart | 8 +++--- .../items-left/items-left.translation.dart | 25 ------------------- .../remaining-items.extensions.dart} | 12 ++++----- .../remaining-items.translation.dart | 25 +++++++++++++++++++ lib/main.dart | 4 +-- lib/screens/home/home.screen.dart | 4 +-- .../language-switcher.controller.dart | 2 -- ...her.dart => language-switcher.widget.dart} | 6 ++--- .../filter-panel/filter-panel.widget.dart | 4 +-- 9 files changed, 44 insertions(+), 46 deletions(-) delete mode 100644 lib/common/items-left/items-left.translation.dart rename lib/common/{items-left/items-left.extensions.dart => remaining-items/remaining-items.extensions.dart} (63%) create mode 100644 lib/common/remaining-items/remaining-items.translation.dart rename lib/screens/home/language-switcher/{language-switcher.dart => language-switcher.widget.dart} (82%) diff --git a/lib/common/app-translation/app-translation.dart b/lib/common/app-translation/app-translation.dart index bf0cf53..9b4bef5 100644 --- a/lib/common/app-translation/app-translation.dart +++ b/lib/common/app-translation/app-translation.dart @@ -5,7 +5,7 @@ import '../../screens/home/todo/add-task/add-task.translation.dart' as home_add_task; import '../../screens/home/todo/filter-panel/filter-panel.translation.dart' as home_filter_panel; -import '../items-left/items-left.translation.dart' as items_left; +import '../remaining-items/remaining-items.translation.dart' as remaining_items; class AppTranslation extends GetxService { AppTranslation(); @@ -50,9 +50,9 @@ class AppTranslation extends GetxService { ); _combineTranslations( - items_left.en, - items_left.uk, - items_left.ru, + remaining_items.en, + remaining_items.uk, + remaining_items.ru, ); return translationsKeys; diff --git a/lib/common/items-left/items-left.translation.dart b/lib/common/items-left/items-left.translation.dart deleted file mode 100644 index 2d2d451..0000000 --- a/lib/common/items-left/items-left.translation.dart +++ /dev/null @@ -1,25 +0,0 @@ -import '../../../../common/app-translation/translation.extensions.dart'; - -enum ItemsLeftTranslationNames implements Translation { - oneItem, - fewItems, - manyItems, -} - -final Map en = { - ItemsLeftTranslationNames.oneItem: 'item left', - ItemsLeftTranslationNames.fewItems: 'items left', - ItemsLeftTranslationNames.manyItems: 'items left', -}.st; - -final Map ru = { - ItemsLeftTranslationNames.oneItem: 'элемент остался', - ItemsLeftTranslationNames.fewItems: 'элемента осталось', - ItemsLeftTranslationNames.manyItems: 'элементов осталось', -}.st; - -final Map uk = { - ItemsLeftTranslationNames.oneItem: 'елемент залишився', - ItemsLeftTranslationNames.fewItems: 'елементи залишились', - ItemsLeftTranslationNames.manyItems: 'елементів залишилось', -}.st; diff --git a/lib/common/items-left/items-left.extensions.dart b/lib/common/remaining-items/remaining-items.extensions.dart similarity index 63% rename from lib/common/items-left/items-left.extensions.dart rename to lib/common/remaining-items/remaining-items.extensions.dart index c3e3943..6dbbaeb 100644 --- a/lib/common/items-left/items-left.extensions.dart +++ b/lib/common/remaining-items/remaining-items.extensions.dart @@ -2,14 +2,14 @@ import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../app-translation/translation.extensions.dart'; -import 'items-left.translation.dart'; +import 'remaining-items.translation.dart'; -extension ItemsLeftFormatting on int { - String get itemsLeft => _getPlural( +extension RemainingItemsFormatter on int { + String get remainingItemsText => _getPlural( this, - one: ItemsLeftTranslationNames.oneItem.tr, - few: ItemsLeftTranslationNames.fewItems.tr, - many: ItemsLeftTranslationNames.manyItems.tr, + one: RemainingItemsTranslationNames.oneItem.tr, + few: RemainingItemsTranslationNames.fewItems.tr, + many: RemainingItemsTranslationNames.manyItems.tr, ).trim(); String _getPlural(int value, diff --git a/lib/common/remaining-items/remaining-items.translation.dart b/lib/common/remaining-items/remaining-items.translation.dart new file mode 100644 index 0000000..c0a39c6 --- /dev/null +++ b/lib/common/remaining-items/remaining-items.translation.dart @@ -0,0 +1,25 @@ +import '../../../../common/app-translation/translation.extensions.dart'; + +enum RemainingItemsTranslationNames implements Translation { + oneItem, + fewItems, + manyItems, +} + +final Map en = { + RemainingItemsTranslationNames.oneItem: 'item left', + RemainingItemsTranslationNames.fewItems: 'items left', + RemainingItemsTranslationNames.manyItems: 'items left', +}.st; + +final Map ru = { + RemainingItemsTranslationNames.oneItem: 'элемент остался', + RemainingItemsTranslationNames.fewItems: 'элемента осталось', + RemainingItemsTranslationNames.manyItems: 'элементов осталось', +}.st; + +final Map uk = { + RemainingItemsTranslationNames.oneItem: 'елемент залишився', + RemainingItemsTranslationNames.fewItems: 'елементи залишились', + RemainingItemsTranslationNames.manyItems: 'елементів залишилось', +}.st; diff --git a/lib/main.dart b/lib/main.dart index 334dbe2..b44ef4c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,8 +4,8 @@ import 'common/app-translation/app-translation.dart'; import 'screens/home/home.binding.dart'; import 'screens/home/home.screen.dart'; -Future main() async { - await HomeBinding().dependencies(); +void main() { + Get.lazyPut(AppTranslation.new); runApp(const MyApp()); } diff --git a/lib/screens/home/home.screen.dart b/lib/screens/home/home.screen.dart index 26fd53a..970b0fc 100644 --- a/lib/screens/home/home.screen.dart +++ b/lib/screens/home/home.screen.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'language-switcher/language-switcher.dart'; +import 'language-switcher/language-switcher.widget.dart'; import 'todo/todo.widget.dart'; import '../home/title/title.widget.dart'; @@ -14,7 +14,7 @@ class HomeScreen extends StatelessWidget { Padding( padding: EdgeInsets.only(bottom: 20), child: Center( - child: LanguageSwitcher(), + child: LanguageSwitcherWidget(), ), ), TodoWidget(), diff --git a/lib/screens/home/language-switcher/language-switcher.controller.dart b/lib/screens/home/language-switcher/language-switcher.controller.dart index 210e59a..a1e6107 100644 --- a/lib/screens/home/language-switcher/language-switcher.controller.dart +++ b/lib/screens/home/language-switcher/language-switcher.controller.dart @@ -4,8 +4,6 @@ import 'language-switcher.enum.dart'; class LanguageSwitcherController extends GetxController { final Rx currentLanguage = Language.en.obs; - List get languages => Language.values; - void updateLocale(Language language) { currentLanguage.value = language; Get.updateLocale(language.locale); diff --git a/lib/screens/home/language-switcher/language-switcher.dart b/lib/screens/home/language-switcher/language-switcher.widget.dart similarity index 82% rename from lib/screens/home/language-switcher/language-switcher.dart rename to lib/screens/home/language-switcher/language-switcher.widget.dart index 5ce93e1..6d1a44b 100644 --- a/lib/screens/home/language-switcher/language-switcher.dart +++ b/lib/screens/home/language-switcher/language-switcher.widget.dart @@ -3,8 +3,8 @@ import 'package:get/get.dart'; import 'language-switcher.controller.dart'; import 'language-switcher.enum.dart'; -class LanguageSwitcher extends GetView { - const LanguageSwitcher({super.key}); +class LanguageSwitcherWidget extends GetView { + const LanguageSwitcherWidget({super.key}); @override Widget build(BuildContext context) => Obx(() => DropdownButton( @@ -14,7 +14,7 @@ class LanguageSwitcher extends GetView { controller.updateLocale(language); } }, - items: controller.languages + items: Language.values .map>( (Language language) => DropdownMenuItem( value: language, diff --git a/lib/screens/home/todo/filter-panel/filter-panel.widget.dart b/lib/screens/home/todo/filter-panel/filter-panel.widget.dart index 0a3d6c3..3b68ccb 100644 --- a/lib/screens/home/todo/filter-panel/filter-panel.widget.dart +++ b/lib/screens/home/todo/filter-panel/filter-panel.widget.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../../common/app-translation/translation.extensions.dart'; import '../../../../common/button/button.widget.dart'; -import '../../../../common/items-left/items-left.extensions.dart'; +import '../../../../common/remaining-items/remaining-items.extensions.dart'; import 'filter-panel-buttons/filter-panel-buttons.dart'; import 'filter-panel.controller.dart'; import 'filter-panel.translation.dart'; @@ -24,7 +24,7 @@ class FilterPanelWidget extends GetView { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - controller.activeCount.itemsLeft, + controller.activeCount.remainingItemsText, style: const TextStyle(fontSize: 14, color: Colors.grey), ), ButtonWidget( From 9de1c4bcd303bb8040ae8374a73645a4bfbe02d8 Mon Sep 17 00:00:00 2001 From: andriikamaldinov1 Date: Wed, 8 Jan 2025 11:45:30 +0200 Subject: [PATCH 5/5] feat(ref: no-ref): fix comments --- lib/common/app-translation/app-translation.dart | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/common/app-translation/app-translation.dart b/lib/common/app-translation/app-translation.dart index 9b4bef5..4eca709 100644 --- a/lib/common/app-translation/app-translation.dart +++ b/lib/common/app-translation/app-translation.dart @@ -43,12 +43,6 @@ class AppTranslation extends GetxService { home_filter_panel.ru, ); - _combineTranslations( - home_filter_panel.en, - home_filter_panel.uk, - home_filter_panel.ru, - ); - _combineTranslations( remaining_items.en, remaining_items.uk,