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/material.dart';
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
|
|
||||||
import 'globals.dart';
|
import 'globals.dart';
|
||||||
import 'i18n/quickgui_localizations_delegate.dart';
|
|
||||||
import 'mixins/preferences_mixin.dart';
|
import 'mixins/preferences_mixin.dart';
|
||||||
import 'model/app_theme.dart';
|
import 'model/app_theme.dart';
|
||||||
import 'pages/main_page.dart';
|
import 'pages/main_page.dart';
|
||||||
|
|
@ -56,7 +56,7 @@ class _AppState extends State<App> with PreferencesMixin {
|
||||||
Locale('fr', 'CH'),
|
Locale('fr', 'CH'),
|
||||||
],
|
],
|
||||||
localizationsDelegates: [
|
localizationsDelegates: [
|
||||||
QuickguiLocalizationsDelegate(),
|
GettextLocalizationsDelegate(),
|
||||||
GlobalMaterialLocalizations.delegate,
|
GlobalMaterialLocalizations.delegate,
|
||||||
GlobalWidgetsLocalizations.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:desktop_notifications/desktop_notifications.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
|
|
||||||
import '../model/operating_system.dart';
|
import '../model/operating_system.dart';
|
||||||
import '../model/option.dart';
|
import '../model/option.dart';
|
||||||
|
|
@ -11,7 +12,6 @@ import '../model/version.dart';
|
||||||
import '../widgets/downloader/cancel_dismiss_button.dart';
|
import '../widgets/downloader/cancel_dismiss_button.dart';
|
||||||
import '../widgets/downloader/download_label.dart';
|
import '../widgets/downloader/download_label.dart';
|
||||||
import '../widgets/downloader/download_progress_bar.dart';
|
import '../widgets/downloader/download_progress_bar.dart';
|
||||||
import '../i18n/i18n_ext.dart';
|
|
||||||
|
|
||||||
class Downloader extends StatefulWidget {
|
class Downloader extends StatefulWidget {
|
||||||
const Downloader({
|
const Downloader({
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
|
|
||||||
import '../widgets/home_page/downloader_menu.dart';
|
import '../widgets/home_page/downloader_menu.dart';
|
||||||
import '../widgets/home_page/logo.dart';
|
import '../widgets/home_page/logo.dart';
|
||||||
import '../i18n/i18n_ext.dart';
|
|
||||||
|
|
||||||
class DownloaderPage extends StatelessWidget {
|
class DownloaderPage extends StatelessWidget {
|
||||||
const DownloaderPage({Key? key}) : super(key: key);
|
const DownloaderPage({Key? key}) : super(key: key);
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
|
|
||||||
import '../widgets/home_page/logo.dart';
|
import '../widgets/home_page/logo.dart';
|
||||||
import '../widgets/home_page/main_menu.dart';
|
import '../widgets/home_page/main_menu.dart';
|
||||||
import '../widgets/left_menu.dart';
|
import '../widgets/left_menu.dart';
|
||||||
import '../i18n/i18n_ext.dart';
|
|
||||||
|
|
||||||
class MainPage extends StatefulWidget {
|
class MainPage extends StatefulWidget {
|
||||||
const MainPage({Key? key, required this.title}) : super(key: key);
|
const MainPage({Key? key, required this.title}) : super(key: key);
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,17 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:core';
|
import 'dart:core';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:path/path.dart' as path;
|
import 'package:path/path.dart' as path;
|
||||||
import 'package:file_picker/file_picker.dart';
|
import 'package:file_picker/file_picker.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'dart:io';
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
|
|
||||||
import '../globals.dart';
|
import '../globals.dart';
|
||||||
import '../model/vminfo.dart';
|
import '../model/vminfo.dart';
|
||||||
import '../mixins/preferences_mixin.dart';
|
import '../mixins/preferences_mixin.dart';
|
||||||
import '../i18n/i18n_ext.dart';
|
|
||||||
|
|
||||||
/// VM manager page.
|
/// VM manager page.
|
||||||
/// Displays a list of available VMs, running state and connection info,
|
/// Displays a list of available VMs, running state and connection info,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
|
|
||||||
import '../model/operating_system.dart';
|
import '../model/operating_system.dart';
|
||||||
import '../i18n/i18n_ext.dart';
|
|
||||||
|
|
||||||
class OperatingSystemSelection extends StatefulWidget {
|
class OperatingSystemSelection extends StatefulWidget {
|
||||||
const OperatingSystemSelection({Key? key}) : super(key: key);
|
const OperatingSystemSelection({Key? key}) : super(key: key);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
|
|
||||||
import '../model/version.dart';
|
import '../model/version.dart';
|
||||||
import '../i18n/i18n_ext.dart';
|
|
||||||
|
|
||||||
class OptionSelection extends StatefulWidget {
|
class OptionSelection extends StatefulWidget {
|
||||||
const OptionSelection(this.version, {Key? key}) : super(key: key);
|
const OptionSelection(this.version, {Key? key}) : super(key: key);
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:tuple/tuple.dart';
|
import 'package:tuple/tuple.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
|
|
||||||
import '../model/operating_system.dart';
|
import '../model/operating_system.dart';
|
||||||
import '../model/option.dart';
|
import '../model/option.dart';
|
||||||
import '../model/version.dart';
|
import '../model/version.dart';
|
||||||
import '../i18n/i18n_ext.dart';
|
|
||||||
import 'option_selection.dart';
|
import 'option_selection.dart';
|
||||||
|
|
||||||
class VersionSelection extends StatefulWidget {
|
class VersionSelection extends StatefulWidget {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
import '../../i18n/i18n_ext.dart';
|
|
||||||
|
|
||||||
class CancelDismissButton extends StatelessWidget {
|
class CancelDismissButton extends StatelessWidget {
|
||||||
const CancelDismissButton({
|
const CancelDismissButton({
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
import '../../i18n/i18n_ext.dart';
|
|
||||||
|
|
||||||
class DownloadLabel extends StatelessWidget {
|
class DownloadLabel extends StatelessWidget {
|
||||||
const DownloadLabel(
|
const DownloadLabel(
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import 'dart:io';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:tuple/tuple.dart';
|
import 'package:tuple/tuple.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
|
|
||||||
import '../../model/operating_system.dart';
|
import '../../model/operating_system.dart';
|
||||||
import '../../model/option.dart';
|
import '../../model/option.dart';
|
||||||
|
|
@ -10,7 +11,6 @@ import '../../model/version.dart';
|
||||||
import '../../pages/downloader.dart';
|
import '../../pages/downloader.dart';
|
||||||
import '../../pages/operating_system_selection.dart';
|
import '../../pages/operating_system_selection.dart';
|
||||||
import '../../pages/version_selection.dart';
|
import '../../pages/version_selection.dart';
|
||||||
import '../../i18n/i18n_ext.dart';
|
|
||||||
import '../home_page/home_page_button.dart';
|
import '../home_page/home_page_button.dart';
|
||||||
|
|
||||||
class HomePageButtonGroup extends StatefulWidget {
|
class HomePageButtonGroup extends StatefulWidget {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
|
|
||||||
import '../../pages/downloader_page.dart';
|
import '../../pages/downloader_page.dart';
|
||||||
import '../../pages/manager.dart';
|
import '../../pages/manager.dart';
|
||||||
import '../../i18n/i18n_ext.dart';
|
|
||||||
import '../home_page/home_page_button.dart';
|
import '../home_page/home_page_button.dart';
|
||||||
|
|
||||||
class MainMenu extends StatelessWidget {
|
class MainMenu extends StatelessWidget {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:gettext_i18n/gettext_i18n.dart';
|
||||||
|
|
||||||
import '../globals.dart';
|
import '../globals.dart';
|
||||||
import '../mixins/app_version.dart';
|
import '../mixins/app_version.dart';
|
||||||
import '../mixins/preferences_mixin.dart';
|
import '../mixins/preferences_mixin.dart';
|
||||||
import '../model/app_theme.dart';
|
import '../model/app_theme.dart';
|
||||||
import '../i18n/i18n_ext.dart';
|
|
||||||
|
|
||||||
class LeftMenu extends StatelessWidget with PreferencesMixin {
|
class LeftMenu extends StatelessWidget with PreferencesMixin {
|
||||||
const LeftMenu({Key? key}) : super(key: key);
|
const LeftMenu({Key? key}) : super(key: key);
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ dependencies:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
desktop_notifications: ^0.6.1
|
desktop_notifications: ^0.6.1
|
||||||
flutter_svg: ^0.23.0
|
flutter_svg: ^0.23.0
|
||||||
|
gettext_i18n: ^1.0.2
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue