Changed : using gettext_i18n instead of embedding the code.
This commit is contained in:
parent
fda2940cdd
commit
533742f41f
|
|
@ -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,
|
||||
],
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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({
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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({
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue