From aa2f50233f620fb3686fc0a88c90db114cf57fab Mon Sep 17 00:00:00 2001 From: debuggerx Date: Thu, 23 Sep 2021 18:40:12 +0800 Subject: [PATCH] wip: add easy_localization. --- api/lib/channel.dart | 2 +- api/test/harness/app.dart | 6 +- app/README.md | 8 +++ app/lib/extensions.dart | 9 +++ app/lib/extensions/context_extension.dart | 8 +++ app/lib/extensions/string_extension.dart | 3 + app/lib/main.dart | 107 +++++------------------------- app/lib/pages/home.dart | 33 +++++++++ app/lib/themes/dark.dart | 5 ++ app/lib/themes/light.dart | 5 ++ app/lib/widgets/footer.dart | 47 +++++++++++++ app/pubspec.yaml | 4 +- app/resources/langs/en.json | 8 +++ app/resources/langs/zh-CN.json | 8 +++ 14 files changed, 159 insertions(+), 94 deletions(-) create mode 100644 app/lib/extensions.dart create mode 100644 app/lib/extensions/context_extension.dart create mode 100644 app/lib/extensions/string_extension.dart create mode 100644 app/lib/pages/home.dart create mode 100644 app/lib/themes/dark.dart create mode 100644 app/lib/themes/light.dart create mode 100644 app/lib/widgets/footer.dart create mode 100644 app/resources/langs/en.json create mode 100644 app/resources/langs/zh-CN.json diff --git a/api/lib/channel.dart b/api/lib/channel.dart index 8a95282..2eeca45 100644 --- a/api/lib/channel.dart +++ b/api/lib/channel.dart @@ -1,5 +1,5 @@ -import 'package:dde_gesture_manager/model/model.dart'; import 'package:dde_gesture_manager/dde_gesture_manager.dart'; +import 'package:dde_gesture_manager/model/model.dart'; /// This type initializes an application. /// diff --git a/api/test/harness/app.dart b/api/test/harness/app.dart index 029207a..a78b76f 100644 --- a/api/test/harness/app.dart +++ b/api/test/harness/app.dart @@ -1,10 +1,10 @@ -import 'package:dde_gesture_manager/dde_gesture_manager.dart'; import 'package:conduit_test/conduit_test.dart'; +import 'package:dde_gesture_manager/dde_gesture_manager.dart'; -export 'package:dde_gesture_manager/dde_gesture_manager.dart'; +export 'package:conduit/conduit.dart'; export 'package:conduit_test/conduit_test.dart'; +export 'package:dde_gesture_manager/dde_gesture_manager.dart'; export 'package:test/test.dart'; -export 'package:conduit/conduit.dart'; /// A testing harness for dde_gesture_manager. /// diff --git a/app/README.md b/app/README.md index 0649c9c..a7411e9 100644 --- a/app/README.md +++ b/app/README.md @@ -45,3 +45,11 @@ class TestProvider extends Test with ChangeNotifier { } ``` + +## easy_localization +### 生成资源代码 +`flutter pub run easy_localization:generate && flutter pub run easy_localization:generate -f keys -o locale_keys.g.dart` + +### 已经支持语言 +- 简体中文(zh-CN) +- English(en) diff --git a/app/lib/extensions.dart b/app/lib/extensions.dart new file mode 100644 index 0000000..6bb96f2 --- /dev/null +++ b/app/lib/extensions.dart @@ -0,0 +1,9 @@ +library extensions; + +export 'package:dde_gesture_manager/extensions/sout_extension.dart'; +export 'package:dde_gesture_manager/extensions/string_extension.dart'; +export 'package:dde_gesture_manager/extensions/context_extension.dart'; +export 'package:dde_gesture_manager/generated/locale_keys.g.dart'; +export 'package:easy_localization/easy_localization.dart'; + +export 'package:provider/provider.dart'; \ No newline at end of file diff --git a/app/lib/extensions/context_extension.dart b/app/lib/extensions/context_extension.dart new file mode 100644 index 0000000..5607fb6 --- /dev/null +++ b/app/lib/extensions/context_extension.dart @@ -0,0 +1,8 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +extension ContextExtension on BuildContext { + ThemeData get t => Theme.of(this); + + NavigatorState get n => Navigator.of(this); +} diff --git a/app/lib/extensions/string_extension.dart b/app/lib/extensions/string_extension.dart new file mode 100644 index 0000000..6432f1b --- /dev/null +++ b/app/lib/extensions/string_extension.dart @@ -0,0 +1,3 @@ +extension StringNotNull on String? { + bool get notNull => this != null && this != ''; +} \ No newline at end of file diff --git a/app/lib/main.dart b/app/lib/main.dart index 6dc37f6..20f5b51 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -1,16 +1,30 @@ +import 'package:dde_gesture_manager/generated/codegen_loader.g.dart'; import 'package:dde_gesture_manager/models/configs.dart'; import 'package:dde_gesture_manager/models/configs.provider.dart'; import 'package:dde_gesture_manager/models/settings.provider.dart'; +import 'package:dde_gesture_manager/themes/dark.dart'; +import 'package:dde_gesture_manager/themes/light.dart'; import 'package:dde_gesture_manager/utils/init.dart'; -import 'package:flutter/foundation.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; +import 'pages/home.dart'; + Future main() async { WidgetsFlutterBinding.ensureInitialized(); await initConfigs(); - runApp(MyApp()); + runApp(EasyLocalization( + supportedLocales: [ + Locale('zh', 'CN'), + Locale('en'), + ], + fallbackLocale: Locale('zh', 'CN'), + path: 'resources/langs', + assetLoader: CodegenLoader(), + child: MyApp(), + )); } class MyApp extends StatelessWidget { @@ -32,10 +46,7 @@ class MyApp extends StatelessWidget { } return MaterialApp( title: 'Flutter Demo', - theme: ThemeData( - primarySwatch: showDarkMode ? Colors.blue : Colors.blue, - brightness: showDarkMode ? Brightness.dark : Brightness.light, - ), + theme: showDarkMode ? darkTheme : lightTheme, home: AnimatedCrossFade( crossFadeState: isDarkMode != null ? CrossFadeState.showSecond : CrossFadeState.showFirst, alignment: Alignment.center, @@ -51,7 +62,7 @@ class MyApp extends StatelessWidget { Future.microtask(() => initEvents(context)); return Container(); }), - secondChild: MyHomePage(title: 'Flutter Demo Home Page'), + secondChild: HomePage(), duration: Duration(milliseconds: 500), ), ); @@ -59,85 +70,3 @@ class MyApp extends StatelessWidget { ); } } - -class MyHomePage extends StatefulWidget { - MyHomePage({Key? key, required this.title}) : super(key: key); - - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - var brightnessMode = context.watch().brightnessMode; - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headline4, - ), - ListTile( - title: const Text('System'), - leading: Radio( - value: BrightnessMode.system, - groupValue: brightnessMode, - onChanged: (BrightnessMode? value) { - context.read().setProps(brightnessMode: value); - }, - ), - ), - ListTile( - title: const Text('Light'), - leading: Radio( - value: BrightnessMode.light, - groupValue: brightnessMode, - onChanged: (BrightnessMode? value) { - setState(() { - context.read().setProps(brightnessMode: value); - }); - }, - ), - ), - ListTile( - title: const Text('Dark'), - leading: Radio( - value: BrightnessMode.dark, - groupValue: brightnessMode, - onChanged: (BrightnessMode? value) { - setState(() { - context.read().setProps(brightnessMode: value); - }); - }, - ), - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: Icon(Icons.add), - ), - ); - } -} diff --git a/app/lib/pages/home.dart b/app/lib/pages/home.dart new file mode 100644 index 0000000..53368dc --- /dev/null +++ b/app/lib/pages/home.dart @@ -0,0 +1,33 @@ +import 'package:dde_gesture_manager/widgets/footer.dart'; +import 'package:flutter/material.dart'; + +class HomePage extends StatefulWidget { + const HomePage({Key? key}) : super(key: key); + + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Text('asd'), + ], + ), + SizedBox( + height: 32, + child: Footer(), + ), + ], + ), + ); + } +} diff --git a/app/lib/themes/dark.dart b/app/lib/themes/dark.dart new file mode 100644 index 0000000..c7d3266 --- /dev/null +++ b/app/lib/themes/dark.dart @@ -0,0 +1,5 @@ +import 'package:flutter/material.dart'; + +var darkTheme = ThemeData.dark().copyWith( + primaryColor: Colors.grey, +); diff --git a/app/lib/themes/light.dart b/app/lib/themes/light.dart new file mode 100644 index 0000000..4939083 --- /dev/null +++ b/app/lib/themes/light.dart @@ -0,0 +1,5 @@ +import 'package:flutter/material.dart'; + +var lightTheme = ThemeData.light().copyWith( + primaryColor: Colors.blue, +); \ No newline at end of file diff --git a/app/lib/widgets/footer.dart b/app/lib/widgets/footer.dart new file mode 100644 index 0000000..2b0f641 --- /dev/null +++ b/app/lib/widgets/footer.dart @@ -0,0 +1,47 @@ +import 'package:dde_gesture_manager/models/configs.dart'; +import 'package:dde_gesture_manager/models/configs.provider.dart'; +import 'package:flutter/material.dart'; +import 'package:dde_gesture_manager/extensions.dart'; + +class Footer extends StatefulWidget { + const Footer({Key? key}) : super(key: key); + + @override + _FooterState createState() => _FooterState(); +} + +class _FooterState extends State