feat: Migrated strings, and translations to native flutter l10n plugin

This commit is contained in:
Anton Stubenbord
2023-02-17 00:00:13 +01:00
parent 7b55a96164
commit 14ab604118
90 changed files with 1661 additions and 683 deletions

View File

@@ -5,7 +5,7 @@ import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:paperless_mobile/features/login/services/authentication_service.dart';
import 'package:paperless_mobile/features/settings/model/color_scheme_option.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
part 'application_settings_cubit.g.dart';
part 'application_settings_state.dart';

View File

@@ -44,7 +44,7 @@ class ApplicationSettingsState {
static String get _defaultPreferredLocaleSubtag {
String preferredLocale = Platform.localeName.split("_").first;
if (!S.delegate.supportedLocales
if (!S.supportedLocales
.any((locale) => locale.languageCode == preferredLocale)) {
preferredLocale = 'en';
}

View File

@@ -10,7 +10,8 @@ import 'package:paperless_mobile/core/widgets/hint_card.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/login/cubit/authentication_cubit.dart';
import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
import 'package:paperless_mobile/helpers/message_helpers.dart';
class AccountSettingsDialog extends StatelessWidget {
@@ -24,7 +25,7 @@ class AccountSettingsDialog extends StatelessWidget {
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(S.of(context).account),
Text(S.of(context)!.account),
const CloseButton(),
],
),
@@ -49,7 +50,7 @@ class AccountSettingsDialog extends StatelessWidget {
ListTile(
dense: true,
leading: const Icon(Icons.person_add_rounded),
title: Text(S.of(context).addAnotherAccount),
title: Text(S.of(context)!.addAnotherAccount),
onTap: () {},
),
const Divider(),
@@ -60,7 +61,7 @@ class AccountSettingsDialog extends StatelessWidget {
),
),
child: Text(
S.of(context).disconnect,
S.of(context)!.disconnect,
style: TextStyle(
color: Theme.of(context).colorScheme.onError,
),

View File

@@ -5,7 +5,8 @@ import 'package:flutter/material.dart';
import 'package:paperless_mobile/features/settings/view/widgets/color_scheme_option_setting.dart';
import 'package:paperless_mobile/features/settings/view/widgets/language_selection_setting.dart';
import 'package:paperless_mobile/features/settings/view/widgets/theme_mode_setting.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
import 'package:paperless_mobile/constants.dart';
class ApplicationSettingsPage extends StatelessWidget {
@@ -15,7 +16,7 @@ class ApplicationSettingsPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(S.of(context).applicationSettings),
title: Text(S.of(context)!.applicationSettings),
),
body: ListView(
children: const [

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:paperless_mobile/features/settings/view/widgets/biometric_authentication_setting.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class SecuritySettingsPage extends StatelessWidget {
const SecuritySettingsPage({super.key});
@@ -8,7 +8,7 @@ class SecuritySettingsPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(S.of(context).security)),
appBar: AppBar(title: Text(S.of(context)!.security)),
body: ListView(
children: const [
BiometricAuthenticationSetting(),

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:paperless_mobile/features/settings/view/widgets/clear_storage_settings.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class StorageSettingsPage extends StatelessWidget {
const StorageSettingsPage({super.key});
@@ -9,7 +9,7 @@ class StorageSettingsPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(S.of(context).storage),
title: Text(S.of(context)!.storage),
),
body: ListView(
children: const [

View File

@@ -5,7 +5,7 @@ import 'package:paperless_mobile/core/bloc/paperless_server_information_state.da
import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart';
import 'package:paperless_mobile/features/settings/view/pages/application_settings_page.dart';
import 'package:paperless_mobile/features/settings/view/pages/security_settings_page.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class SettingsPage extends StatelessWidget {
const SettingsPage({super.key});
@@ -14,7 +14,7 @@ class SettingsPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(S.of(context).settings),
title: Text(S.of(context)!.settings),
),
bottomNavigationBar: BlocBuilder<PaperlessServerInformationCubit,
PaperlessServerInformationState>(
@@ -22,13 +22,13 @@ class SettingsPage extends StatelessWidget {
final info = state.information!;
return ListTile(
title: Text(
S.of(context).loggedInAs(info.username ?? 'unknown') +
S.of(context)!.loggedInAs(info.username ?? 'unknown') +
"@${info.host}",
style: Theme.of(context).textTheme.labelSmall,
textAlign: TextAlign.center,
),
subtitle: Text(
S.of(context).paperlessServerVersion +
S.of(context)!.paperlessServerVersion +
' ' +
info.version.toString() +
' (API v${info.apiVersion})',
@@ -42,21 +42,21 @@ class SettingsPage extends StatelessWidget {
children: [
ListTile(
// leading: const Icon(Icons.style_outlined),
title: Text(S.of(context).applicationSettings),
subtitle: Text(S.of(context).languageAndVisualAppearance),
title: Text(S.of(context)!.applicationSettings),
subtitle: Text(S.of(context)!.languageAndVisualAppearance),
onTap: () => _goto(const ApplicationSettingsPage(), context),
),
ListTile(
// leading: const Icon(Icons.security_outlined),
title: Text(S.of(context).security),
subtitle: Text(S.of(context).biometricAuthentication),
title: Text(S.of(context)!.security),
subtitle: Text(S.of(context)!.biometricAuthentication),
onTap: () => _goto(const SecuritySettingsPage(), context),
),
// ListTile(
// // leading: const Icon(Icons.storage_outlined),
// title: Text(S.of(context).storage),
// title: Text(S.of(context)!.storage),
// subtitle:
// Text(S.of(context).mangeFilesAndStorageSpace),
// Text(S.of(context)!.mangeFilesAndStorageSpace),
// onTap: () => _goto(const StorageSettingsPage(), context),
// ),
],

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class BiometricAuthenticationSetting extends StatelessWidget {
const BiometricAuthenticationSetting({super.key});
@@ -12,11 +12,11 @@ class BiometricAuthenticationSetting extends StatelessWidget {
builder: (context, settings) {
return SwitchListTile(
value: settings.isLocalAuthenticationEnabled,
title: Text(S.of(context).biometricAuthentication),
subtitle: Text(S.of(context).authenticateOnAppStart),
title: Text(S.of(context)!.biometricAuthentication),
subtitle: Text(S.of(context)!.authenticateOnAppStart),
onChanged: (val) async {
final String localizedReason =
S.of(context).authenticateToToggleBiometricAuthentication(
S.of(context)!.authenticateToToggleBiometricAuthentication(
val ? 'enable' : 'disable',
);
await context

View File

@@ -8,7 +8,7 @@ import 'package:paperless_mobile/core/widgets/hint_card.dart';
import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart';
import 'package:paperless_mobile/features/settings/model/color_scheme_option.dart';
import 'package:paperless_mobile/features/settings/view/widgets/radio_settings_dialog.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class ColorSchemeOptionSetting extends StatelessWidget {
const ColorSchemeOptionSetting({super.key});
@@ -18,7 +18,7 @@ class ColorSchemeOptionSetting extends StatelessWidget {
return BlocBuilder<ApplicationSettingsCubit, ApplicationSettingsState>(
builder: (context, settings) {
return ListTile(
title: Text(S.of(context).colors),
title: Text(S.of(context)!.colors),
subtitle: Text(
translateColorSchemeOption(
context,
@@ -28,8 +28,8 @@ class ColorSchemeOptionSetting extends StatelessWidget {
onTap: () => showDialog(
context: context,
builder: (_) => RadioSettingsDialog<ColorSchemeOption>(
titleText: S.of(context).colors,
descriptionText: S.of(context).colorSchemeHint,
titleText: S.of(context)!.colors,
descriptionText: S.of(context)!.colorSchemeHint,
options: [
RadioOption(
value: ColorSchemeOption.classic,
@@ -46,7 +46,7 @@ class ColorSchemeOptionSetting extends StatelessWidget {
],
footer: _isBelowAndroid12()
? HintCard(
hintText: S.of(context).colorSchemeNotSupportedWarning,
hintText: S.of(context)!.colorSchemeNotSupportedWarning,
hintIcon: Icons.warning_amber,
)
: null,

View File

@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart';
import 'package:paperless_mobile/features/settings/view/widgets/radio_settings_dialog.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class LanguageSelectionSetting extends StatefulWidget {
const LanguageSelectionSetting({super.key});
@@ -25,7 +25,7 @@ class _LanguageSelectionSettingState extends State<LanguageSelectionSetting> {
return BlocBuilder<ApplicationSettingsCubit, ApplicationSettingsState>(
builder: (context, settings) {
return ListTile(
title: Text(S.of(context).language),
title: Text(S.of(context)!.language),
subtitle: Text(_languageOptions[settings.preferredLocaleSubtag]!),
onTap: () => showDialog<String>(
context: context,
@@ -33,7 +33,7 @@ class _LanguageSelectionSettingState extends State<LanguageSelectionSetting> {
footer: const Text(
"* Work in progress, not fully translated yet. Some words may be displayed in English!",
),
titleText: S.of(context).language,
titleText: S.of(context)!.language,
options: [
RadioOption(
value: 'en',

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class RadioSettingsDialog<T> extends StatefulWidget {
final List<RadioOption<T>> options;
@@ -41,11 +41,11 @@ class _RadioSettingsDialogState<T> extends State<RadioSettingsDialog<T>> {
widget.confirmButton ??
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(S.of(context).cancel)),
child: Text(S.of(context)!.cancel)),
widget.confirmButton ??
TextButton(
onPressed: () => Navigator.pop(context, _groupValue),
child: Text(S.of(context).ok)),
child: Text(S.of(context)!.ok)),
],
title: widget.titleText != null ? Text(widget.titleText!) : null,
content: Column(

View File

@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_mobile/features/settings/cubit/application_settings_cubit.dart';
import 'package:paperless_mobile/features/settings/view/widgets/radio_settings_dialog.dart';
import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class ThemeModeSetting extends StatelessWidget {
const ThemeModeSetting({super.key});
@@ -12,13 +12,13 @@ class ThemeModeSetting extends StatelessWidget {
return BlocBuilder<ApplicationSettingsCubit, ApplicationSettingsState>(
builder: (context, settings) {
return ListTile(
title: Text(S.of(context).appearance),
title: Text(S.of(context)!.appearance),
subtitle: Text(_mapThemeModeToLocalizedString(
settings.preferredThemeMode, context)),
onTap: () => showDialog<ThemeMode>(
context: context,
builder: (_) => RadioSettingsDialog<ThemeMode>(
titleText: S.of(context).appearance,
titleText: S.of(context)!.appearance,
initialValue: context
.read<ApplicationSettingsCubit>()
.state
@@ -26,15 +26,15 @@ class ThemeModeSetting extends StatelessWidget {
options: [
RadioOption(
value: ThemeMode.system,
label: S.of(context).systemTheme,
label: S.of(context)!.systemTheme,
),
RadioOption(
value: ThemeMode.light,
label: S.of(context).lightTheme,
label: S.of(context)!.lightTheme,
),
RadioOption(
value: ThemeMode.dark,
label: S.of(context).darkTheme,
label: S.of(context)!.darkTheme,
)
],
),
@@ -51,11 +51,11 @@ class ThemeModeSetting extends StatelessWidget {
String _mapThemeModeToLocalizedString(ThemeMode theme, BuildContext context) {
switch (theme) {
case ThemeMode.system:
return S.of(context).system;
return S.of(context)!.system;
case ThemeMode.light:
return S.of(context).light;
return S.of(context)!.light;
case ThemeMode.dark:
return S.of(context).dark;
return S.of(context)!.dark;
}
}
}