diff --git a/.gitignore b/.gitignore index 53f4fe1..cce5b05 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,9 @@ app.*.map.json /android/app/profile /android/app/release +# Ignore built translations +lib/i18n/ + # NixOS .direnv .envrc diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart deleted file mode 100644 index 33eab64..0000000 --- a/lib/i18n/strings.g.dart +++ /dev/null @@ -1,322 +0,0 @@ -/// Generated file. Do not edit. -/// -/// Locales: 1 -/// Strings: 36 -/// -/// Built on 2023-06-21 at 20:15 UTC - -// coverage:ignore-file -// ignore_for_file: type=lint - -import 'package:flutter/widgets.dart'; -import 'package:slang/builder/model/node.dart'; -import 'package:slang_flutter/slang_flutter.dart'; -export 'package:slang_flutter/slang_flutter.dart'; - -const AppLocale _baseLocale = AppLocale.en; - -/// Supported locales, see extension methods below. -/// -/// Usage: -/// - LocaleSettings.setLocale(AppLocale.en) // set locale -/// - Locale locale = AppLocale.en.flutterLocale // get flutter locale from enum -/// - if (LocaleSettings.currentLocale == AppLocale.en) // locale check -enum AppLocale with BaseAppLocale { - en(languageCode: 'en', build: _StringsEn.build); - - const AppLocale({required this.languageCode, this.scriptCode, this.countryCode, required this.build}); // ignore: unused_element - - @override final String languageCode; - @override final String? scriptCode; - @override final String? countryCode; - @override final TranslationBuilder build; - - /// Gets current instance managed by [LocaleSettings]. - _StringsEn get translations => LocaleSettings.instance.translationMap[this]!; -} - -/// Method A: Simple -/// -/// No rebuild after locale change. -/// Translation happens during initialization of the widget (call of t). -/// Configurable via 'translate_var'. -/// -/// Usage: -/// String a = t.someKey.anotherKey; -/// String b = t['someKey.anotherKey']; // Only for edge cases! -_StringsEn get t => LocaleSettings.instance.currentTranslations; - -/// Method B: Advanced -/// -/// All widgets using this method will trigger a rebuild when locale changes. -/// Use this if you have e.g. a settings page where the user can select the locale during runtime. -/// -/// Step 1: -/// wrap your App with -/// TranslationProvider( -/// child: MyApp() -/// ); -/// -/// Step 2: -/// final t = Translations.of(context); // Get t variable. -/// String a = t.someKey.anotherKey; // Use t variable. -/// String b = t['someKey.anotherKey']; // Only for edge cases! -class Translations { - Translations._(); // no constructor - - static _StringsEn of(BuildContext context) => InheritedLocaleData.of(context).translations; -} - -/// The provider for method B -class TranslationProvider extends BaseTranslationProvider { - TranslationProvider({required super.child}) : super(settings: LocaleSettings.instance); - - static InheritedLocaleData of(BuildContext context) => InheritedLocaleData.of(context); -} - -/// Method B shorthand via [BuildContext] extension method. -/// Configurable via 'translate_var'. -/// -/// Usage (e.g. in a widget's build method): -/// context.t.someKey.anotherKey -extension BuildContextTranslationsExtension on BuildContext { - _StringsEn get t => TranslationProvider.of(this).translations; -} - -/// Manages all translation instances and the current locale -class LocaleSettings extends BaseFlutterLocaleSettings { - LocaleSettings._() : super(utils: AppLocaleUtils.instance); - - static final instance = LocaleSettings._(); - - // static aliases (checkout base methods for documentation) - static AppLocale get currentLocale => instance.currentLocale; - static Stream getLocaleStream() => instance.getLocaleStream(); - static AppLocale setLocale(AppLocale locale, {bool? listenToDeviceLocale = false}) => instance.setLocale(locale, listenToDeviceLocale: listenToDeviceLocale); - static AppLocale setLocaleRaw(String rawLocale, {bool? listenToDeviceLocale = false}) => instance.setLocaleRaw(rawLocale, listenToDeviceLocale: listenToDeviceLocale); - static AppLocale useDeviceLocale() => instance.useDeviceLocale(); - @Deprecated('Use [AppLocaleUtils.supportedLocales]') static List get supportedLocales => instance.supportedLocales; - @Deprecated('Use [AppLocaleUtils.supportedLocalesRaw]') static List get supportedLocalesRaw => instance.supportedLocalesRaw; - static void setPluralResolver({String? language, AppLocale? locale, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver}) => instance.setPluralResolver( - language: language, - locale: locale, - cardinalResolver: cardinalResolver, - ordinalResolver: ordinalResolver, - ); -} - -/// Provides utility functions without any side effects. -class AppLocaleUtils extends BaseAppLocaleUtils { - AppLocaleUtils._() : super(baseLocale: _baseLocale, locales: AppLocale.values); - - static final instance = AppLocaleUtils._(); - - // static aliases (checkout base methods for documentation) - static AppLocale parse(String rawLocale) => instance.parse(rawLocale); - static AppLocale parseLocaleParts({required String languageCode, String? scriptCode, String? countryCode}) => instance.parseLocaleParts(languageCode: languageCode, scriptCode: scriptCode, countryCode: countryCode); - static AppLocale findDeviceLocale() => instance.findDeviceLocale(); - static List get supportedLocales => instance.supportedLocales; - static List get supportedLocalesRaw => instance.supportedLocalesRaw; -} - -// translations - -// Path: -class _StringsEn implements BaseTranslations { - - /// You can call this constructor and build your own translation instance of this locale. - /// Constructing via the enum [AppLocale.build] is preferred. - _StringsEn.build({Map? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver}) - : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), - $meta = TranslationMetadata( - locale: AppLocale.en, - overrides: overrides ?? {}, - cardinalResolver: cardinalResolver, - ordinalResolver: ordinalResolver, - ) { - $meta.setFlatMapFunction(_flatMapFunction); - } - - /// Metadata for the translations of . - @override final TranslationMetadata $meta; - - /// Access flat map - dynamic operator[](String key) => $meta.getTranslation(key); - - late final _StringsEn _root = this; // ignore: unused_field - - // Translations - late final _StringsSettingsEn settings = _StringsSettingsEn._(_root); - late final _StringsAboutEn about = _StringsAboutEn._(_root); - late final _StringsTooltipsEn tooltips = _StringsTooltipsEn._(_root); - late final _StringsContentEn content = _StringsContentEn._(_root); - late final _StringsSearchEn search = _StringsSearchEn._(_root); - late final _StringsDetailsEn details = _StringsDetailsEn._(_root); - late final _StringsDataEn data = _StringsDataEn._(_root); -} - -// Path: settings -class _StringsSettingsEn { - _StringsSettingsEn._(this._root); - - final _StringsEn _root; // ignore: unused_field - - // Translations - String get title => 'Settings'; - String get importAnime => 'Import anime list'; - String get importAnimeDesc => 'Import anime list exported from MyAnimeList.'; - String get invalidAnimeListTitle => 'Invalid anime list'; - String get invalidAnimeListBody => 'The selected file is not a MAL anime list. It lacks the ".xml.gz" suffix.'; - String get importManga => 'Import manga list'; - String get importMangaDesc => 'Import manga list exported from MyAnimeList.'; - String get invalidMangaListTitle => 'Invalid manga list'; - String get invalidMangaListBody => 'The selected file is not a MAL manga list. It lacks the ".xml.gz" suffix.'; - String importIndicator({required Object current, required Object total}) => '${current} of ${total}'; -} - -// Path: about -class _StringsAboutEn { - _StringsAboutEn._(this._root); - - final _StringsEn _root; // ignore: unused_field - - // Translations - String get title => 'About'; - String get source => 'Source code'; -} - -// Path: tooltips -class _StringsTooltipsEn { - _StringsTooltipsEn._(this._root); - - final _StringsEn _root; // ignore: unused_field - - // Translations - String get addNewItem => 'Add new item'; -} - -// Path: content -class _StringsContentEn { - _StringsContentEn._(this._root); - - final _StringsEn _root; // ignore: unused_field - - // Translations - String get anime => 'Anime'; - String get manga => 'Manga'; -} - -// Path: search -class _StringsSearchEn { - _StringsSearchEn._(this._root); - - final _StringsEn _root; // ignore: unused_field - - // Translations - String get anime => 'Anime search'; - String get manga => 'Manga search'; - String get query => 'Search query'; -} - -// Path: details -class _StringsDetailsEn { - _StringsDetailsEn._(this._root); - - final _StringsEn _root; // ignore: unused_field - - // Translations - String get title => 'Details'; - String removeTitle({required Object title}) => 'Remove ${title}?'; - String removeBody({required Object title}) => 'Are you sure you want to remove "${title}" from the list?'; - String get removeButton => 'Remove'; - String get cancelButton => 'Cancel'; - String get watchState => 'Watch state'; - String get readState => 'Read state'; - String get episodes => 'Episodes'; - String get chapters => 'Chapters'; - String get volumesOwned => 'Volumes owned'; -} - -// Path: data -class _StringsDataEn { - _StringsDataEn._(this._root); - - final _StringsEn _root; // ignore: unused_field - - // Translations - late final _StringsDataOngoingEn ongoing = _StringsDataOngoingEn._(_root); - String get completed => 'Completed'; - late final _StringsDataPlannedEn planned = _StringsDataPlannedEn._(_root); - String get dropped => 'Dropped'; - String get paused => 'Paused'; - String get all => 'All'; -} - -// Path: data.ongoing -class _StringsDataOngoingEn { - _StringsDataOngoingEn._(this._root); - - final _StringsEn _root; // ignore: unused_field - - // Translations - String get anime => 'Watching'; - String get manga => 'Reading'; -} - -// Path: data.planned -class _StringsDataPlannedEn { - _StringsDataPlannedEn._(this._root); - - final _StringsEn _root; // ignore: unused_field - - // Translations - String get anime => 'Plan to watch'; - String get manga => 'Plan to read'; -} - -/// Flat map(s) containing all translations. -/// Only for edge cases! For simple maps, use the map function of this library. - -extension on _StringsEn { - dynamic _flatMapFunction(String path) { - switch (path) { - case 'settings.title': return 'Settings'; - case 'settings.importAnime': return 'Import anime list'; - case 'settings.importAnimeDesc': return 'Import anime list exported from MyAnimeList.'; - case 'settings.invalidAnimeListTitle': return 'Invalid anime list'; - case 'settings.invalidAnimeListBody': return 'The selected file is not a MAL anime list. It lacks the ".xml.gz" suffix.'; - case 'settings.importManga': return 'Import manga list'; - case 'settings.importMangaDesc': return 'Import manga list exported from MyAnimeList.'; - case 'settings.invalidMangaListTitle': return 'Invalid manga list'; - case 'settings.invalidMangaListBody': return 'The selected file is not a MAL manga list. It lacks the ".xml.gz" suffix.'; - case 'settings.importIndicator': return ({required Object current, required Object total}) => '${current} of ${total}'; - case 'about.title': return 'About'; - case 'about.source': return 'Source code'; - case 'tooltips.addNewItem': return 'Add new item'; - case 'content.anime': return 'Anime'; - case 'content.manga': return 'Manga'; - case 'search.anime': return 'Anime search'; - case 'search.manga': return 'Manga search'; - case 'search.query': return 'Search query'; - case 'details.title': return 'Details'; - case 'details.removeTitle': return ({required Object title}) => 'Remove ${title}?'; - case 'details.removeBody': return ({required Object title}) => 'Are you sure you want to remove "${title}" from the list?'; - case 'details.removeButton': return 'Remove'; - case 'details.cancelButton': return 'Cancel'; - case 'details.watchState': return 'Watch state'; - case 'details.readState': return 'Read state'; - case 'details.episodes': return 'Episodes'; - case 'details.chapters': return 'Chapters'; - case 'details.volumesOwned': return 'Volumes owned'; - case 'data.ongoing.anime': return 'Watching'; - case 'data.ongoing.manga': return 'Reading'; - case 'data.completed': return 'Completed'; - case 'data.planned.anime': return 'Plan to watch'; - case 'data.planned.manga': return 'Plan to read'; - case 'data.dropped': return 'Dropped'; - case 'data.paused': return 'Paused'; - case 'data.all': return 'All'; - default: return null; - } - } -}