Changed : using gettext_i18n instead of embedding the code.

This commit is contained in:
Yannick Mauray 2021-11-14 21:31:26 +01:00
parent fda2940cdd
commit 533742f41f
No known key found for this signature in database
GPG Key ID: 67C4AAC5E99CB909
17 changed files with 17 additions and 94 deletions

View File

@ -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<App> with PreferencesMixin {
Locale('fr', 'CH'),
],
localizationsDelegates: [
QuickguiLocalizationsDelegate(),
GettextLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],

View File

@ -1,7 +0,0 @@
import 'package:flutter/material.dart';
import 'quickgui_localizations.dart';
extension I18nExt on BuildContext {
t(String key, {List<Object>? args}) => QuickguiLocalizations.of(this).t(key, args);
}

View File

@ -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<QuickguiLocalizations>(context, QuickguiLocalizations)!;
String t(String key, List<Object>? 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;
}
}

View File

@ -1,31 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'quickgui_localizations.dart';
class QuickguiLocalizationsDelegate
extends LocalizationsDelegate<QuickguiLocalizations> {
@override
bool isSupported(Locale locale) => true;
@override
Future<QuickguiLocalizations> 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<QuickguiLocalizations> old) =>
true;
}

View File

@ -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({

View File

@ -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);

View File

@ -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);

View File

@ -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,

View File

@ -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);

View File

@ -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);

View File

@ -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 {

View File

@ -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({

View File

@ -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(

View File

@ -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 {

View File

@ -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 {

View File

@ -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);

View File

@ -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: