diff --git a/lib/src/app.dart b/lib/src/app.dart index 1aaf7b7..a1c7837 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; import 'globals.dart'; -import 'i18n/quickgui_localizations_delegate.dart'; import 'mixins/preferences_mixin.dart'; import 'model/app_theme.dart'; import 'pages/main_page.dart'; @@ -56,7 +56,7 @@ class _AppState extends State with PreferencesMixin { Locale('fr', 'CH'), ], localizationsDelegates: [ - QuickguiLocalizationsDelegate(), + GettextLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], diff --git a/lib/src/i18n/i18n_ext.dart b/lib/src/i18n/i18n_ext.dart deleted file mode 100644 index 41a85c6..0000000 --- a/lib/src/i18n/i18n_ext.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'quickgui_localizations.dart'; - -extension I18nExt on BuildContext { - t(String key, {List? args}) => QuickguiLocalizations.of(this).t(key, args); -} diff --git a/lib/src/i18n/quickgui_localizations.dart b/lib/src/i18n/quickgui_localizations.dart deleted file mode 100644 index 86d63f4..0000000 --- a/lib/src/i18n/quickgui_localizations.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:gettext/gettext.dart'; -import 'package:gettext_parser/gettext_parser.dart' as gettext_parser; -import 'package:quiver/iterables.dart'; - -class QuickguiLocalizations { - final _gt = Gettext( - onWarning: ((message) { - if (kDebugMode) { - // ignore: avoid_print - print('$message\n'); - final r = RegExp(r'^No translation was found for msgid "(.*)" in msgctxt "(.*)" and domain "(.*)"$'); - final matches = r.firstMatch(message); - var msgid = matches!.group(1); - // ignore: avoid_print - print('\nmsgid "$msgid"\nmsgstr ""\n \n'); - } - }), - ); - - QuickguiLocalizations.fromPO(String poContent) { - _gt.addLocale(gettext_parser.po.parse(poContent)); - } - - static QuickguiLocalizations of(BuildContext context) => Localizations.of(context, QuickguiLocalizations)!; - - String t(String key, List? args) { - var message = _gt.gettext(key); - - if (args != null) { - for (var i in range(args.length)) { - message = message.replaceAll('{$i}', args[i.toInt()].toString()); - } - } - - return message; - } -} diff --git a/lib/src/i18n/quickgui_localizations_delegate.dart b/lib/src/i18n/quickgui_localizations_delegate.dart deleted file mode 100644 index aa8e53e..0000000 --- a/lib/src/i18n/quickgui_localizations_delegate.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'quickgui_localizations.dart'; - -class QuickguiLocalizationsDelegate - extends LocalizationsDelegate { - @override - bool isSupported(Locale locale) => true; - - @override - Future load(Locale locale) async { - var poContent = ''; - try { - poContent = await rootBundle.loadString('assets/i18n/${locale.languageCode}_${locale.countryCode}.po'); - } catch (e) { - try { - poContent = await rootBundle.loadString('assets/i18n/${locale.languageCode}.po'); - } catch (e) { - poContent = await rootBundle.loadString('assets/i18n/en.po'); - } - } - - return QuickguiLocalizations.fromPO(poContent); - } - - @override - bool shouldReload( - covariant LocalizationsDelegate old) => - true; -} diff --git a/lib/src/pages/downloader.dart b/lib/src/pages/downloader.dart index 1975ff7..91220ef 100644 --- a/lib/src/pages/downloader.dart +++ b/lib/src/pages/downloader.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:desktop_notifications/desktop_notifications.dart'; import 'package:flutter/material.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; import '../model/operating_system.dart'; import '../model/option.dart'; @@ -11,7 +12,6 @@ import '../model/version.dart'; import '../widgets/downloader/cancel_dismiss_button.dart'; import '../widgets/downloader/download_label.dart'; import '../widgets/downloader/download_progress_bar.dart'; -import '../i18n/i18n_ext.dart'; class Downloader extends StatefulWidget { const Downloader({ diff --git a/lib/src/pages/downloader_page.dart b/lib/src/pages/downloader_page.dart index d23da53..16bcb52 100644 --- a/lib/src/pages/downloader_page.dart +++ b/lib/src/pages/downloader_page.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; import '../widgets/home_page/downloader_menu.dart'; import '../widgets/home_page/logo.dart'; -import '../i18n/i18n_ext.dart'; class DownloaderPage extends StatelessWidget { const DownloaderPage({Key? key}) : super(key: key); diff --git a/lib/src/pages/main_page.dart b/lib/src/pages/main_page.dart index 7b7d963..1d302c0 100644 --- a/lib/src/pages/main_page.dart +++ b/lib/src/pages/main_page.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; import '../widgets/home_page/logo.dart'; import '../widgets/home_page/main_menu.dart'; import '../widgets/left_menu.dart'; -import '../i18n/i18n_ext.dart'; class MainPage extends StatefulWidget { const MainPage({Key? key, required this.title}) : super(key: key); diff --git a/lib/src/pages/manager.dart b/lib/src/pages/manager.dart index fb658a6..ea8db32 100644 --- a/lib/src/pages/manager.dart +++ b/lib/src/pages/manager.dart @@ -1,16 +1,17 @@ import 'dart:async'; import 'dart:convert'; import 'dart:core'; +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:path/path.dart' as path; import 'package:file_picker/file_picker.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'dart:io'; +import 'package:gettext_i18n/gettext_i18n.dart'; import '../globals.dart'; import '../model/vminfo.dart'; import '../mixins/preferences_mixin.dart'; -import '../i18n/i18n_ext.dart'; /// VM manager page. /// Displays a list of available VMs, running state and connection info, diff --git a/lib/src/pages/operating_system_selection.dart b/lib/src/pages/operating_system_selection.dart index 93714f3..9aa9709 100644 --- a/lib/src/pages/operating_system_selection.dart +++ b/lib/src/pages/operating_system_selection.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; import '../model/operating_system.dart'; -import '../i18n/i18n_ext.dart'; class OperatingSystemSelection extends StatefulWidget { const OperatingSystemSelection({Key? key}) : super(key: key); diff --git a/lib/src/pages/option_selection.dart b/lib/src/pages/option_selection.dart index 88c74be..6431650 100644 --- a/lib/src/pages/option_selection.dart +++ b/lib/src/pages/option_selection.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; import '../model/version.dart'; -import '../i18n/i18n_ext.dart'; class OptionSelection extends StatefulWidget { const OptionSelection(this.version, {Key? key}) : super(key: key); diff --git a/lib/src/pages/version_selection.dart b/lib/src/pages/version_selection.dart index 12a6aab..940f046 100644 --- a/lib/src/pages/version_selection.dart +++ b/lib/src/pages/version_selection.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:tuple/tuple.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; import '../model/operating_system.dart'; import '../model/option.dart'; import '../model/version.dart'; -import '../i18n/i18n_ext.dart'; import 'option_selection.dart'; class VersionSelection extends StatefulWidget { diff --git a/lib/src/widgets/downloader/cancel_dismiss_button.dart b/lib/src/widgets/downloader/cancel_dismiss_button.dart index 3401450..ce0ba3a 100644 --- a/lib/src/widgets/downloader/cancel_dismiss_button.dart +++ b/lib/src/widgets/downloader/cancel_dismiss_button.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; - -import '../../i18n/i18n_ext.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; class CancelDismissButton extends StatelessWidget { const CancelDismissButton({ diff --git a/lib/src/widgets/downloader/download_label.dart b/lib/src/widgets/downloader/download_label.dart index 2e025dd..ebd272d 100644 --- a/lib/src/widgets/downloader/download_label.dart +++ b/lib/src/widgets/downloader/download_label.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; - -import '../../i18n/i18n_ext.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; class DownloadLabel extends StatelessWidget { const DownloadLabel( diff --git a/lib/src/widgets/home_page/home_page_button_group.dart b/lib/src/widgets/home_page/home_page_button_group.dart index abce3f9..72da585 100644 --- a/lib/src/widgets/home_page/home_page_button_group.dart +++ b/lib/src/widgets/home_page/home_page_button_group.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:tuple/tuple.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; import '../../model/operating_system.dart'; import '../../model/option.dart'; @@ -10,7 +11,6 @@ import '../../model/version.dart'; import '../../pages/downloader.dart'; import '../../pages/operating_system_selection.dart'; import '../../pages/version_selection.dart'; -import '../../i18n/i18n_ext.dart'; import '../home_page/home_page_button.dart'; class HomePageButtonGroup extends StatefulWidget { diff --git a/lib/src/widgets/home_page/main_menu.dart b/lib/src/widgets/home_page/main_menu.dart index a2b25d0..88765e3 100644 --- a/lib/src/widgets/home_page/main_menu.dart +++ b/lib/src/widgets/home_page/main_menu.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; import '../../pages/downloader_page.dart'; import '../../pages/manager.dart'; -import '../../i18n/i18n_ext.dart'; import '../home_page/home_page_button.dart'; class MainMenu extends StatelessWidget { diff --git a/lib/src/widgets/left_menu.dart b/lib/src/widgets/left_menu.dart index 73c47d0..d38cd7b 100644 --- a/lib/src/widgets/left_menu.dart +++ b/lib/src/widgets/left_menu.dart @@ -1,12 +1,12 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:gettext_i18n/gettext_i18n.dart'; import '../globals.dart'; import '../mixins/app_version.dart'; import '../mixins/preferences_mixin.dart'; import '../model/app_theme.dart'; -import '../i18n/i18n_ext.dart'; class LeftMenu extends StatelessWidget with PreferencesMixin { const LeftMenu({Key? key}) : super(key: key); diff --git a/pubspec.yaml b/pubspec.yaml index d9f096d..268d077 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -52,6 +52,7 @@ dependencies: sdk: flutter desktop_notifications: ^0.6.1 flutter_svg: ^0.23.0 + gettext_i18n: ^1.0.2 dev_dependencies: flutter_test: