diff --git a/lib/features/settings/language.dart b/lib/features/settings/language.dart index fa567c5..cde7b23 100644 --- a/lib/features/settings/language.dart +++ b/lib/features/settings/language.dart @@ -4,7 +4,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'language.g.dart'; @riverpod -translation(TranslationRef ref) { +StringsEn translation(TranslationRef ref) { final lan = ref.watch(languageProvider); switch (lan) { case LanguageType.ja: diff --git a/lib/features/settings/language.g.dart b/lib/features/settings/language.g.dart index 1ff6ad7..053a1b5 100644 --- a/lib/features/settings/language.g.dart +++ b/lib/features/settings/language.g.dart @@ -6,11 +6,11 @@ part of 'language.dart'; // RiverpodGenerator // ************************************************************************** -String _$translationHash() => r'e03461f49307971e50b0098c3d0a20566dd15ef9'; +String _$translationHash() => r'f846b16768f968bd6e4a727b9c38c087b43977b3'; /// See also [translation]. @ProviderFor(translation) -final translationProvider = AutoDisposeProvider.internal( +final translationProvider = AutoDisposeProvider.internal( translation, name: r'translationProvider', debugGetCreateSourceHash: @@ -19,7 +19,7 @@ final translationProvider = AutoDisposeProvider.internal( allTransitiveDependencies: null, ); -typedef TranslationRef = AutoDisposeProviderRef; +typedef TranslationRef = AutoDisposeProviderRef; String _$languageHash() => r'fffeb41dad0fe8e0e076261ae6f919921eb94529'; /// See also [Language]. diff --git a/lib/features/settings/theme.g.dart b/lib/features/settings/theme.g.dart index fe6286e..c232bed 100644 --- a/lib/features/settings/theme.g.dart +++ b/lib/features/settings/theme.g.dart @@ -6,7 +6,7 @@ part of 'theme.dart'; // RiverpodGenerator // ************************************************************************** -String _$themeHash() => r'9f8990070e2dc0d2760e9bb816e4f48494960697'; +String _$themeHash() => r'1a25a34a8f44edd362eb5411074e739b79d7528c'; /// See also [theme]. @ProviderFor(theme) diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index dbb5748..bfb1062 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -6,7 +6,7 @@ /// Locales: 2 /// Strings: 22 (11 per locale) /// -/// Built on 2023-09-24 at 11:14 UTC +/// Built on 2023-09-24 at 15:30 UTC // coverage:ignore-file // ignore_for_file: type=lint @@ -24,93 +24,20 @@ const AppLocale _baseLocale = AppLocale.en; /// - 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), - ja(languageCode: 'ja', build: _StringsJa.build); +enum AppLocale with BaseAppLocale { + en(languageCode: 'en', build: StringsEn.build), + ja(languageCode: 'ja', build: StringsJa.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, - ); + @override final TranslationBuilder build; } /// Provides utility functions without any side effects. -class AppLocaleUtils extends BaseAppLocaleUtils { +class AppLocaleUtils extends BaseAppLocaleUtils { AppLocaleUtils._() : super(baseLocale: _baseLocale, locales: AppLocale.values); static final instance = AppLocaleUtils._(); @@ -126,11 +53,11 @@ class AppLocaleUtils extends BaseAppLocaleUtils { // translations // Path: -class _StringsEn implements BaseTranslations { +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}) + 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, @@ -142,25 +69,25 @@ class _StringsEn implements BaseTranslations { } /// Metadata for the translations of . - @override final TranslationMetadata $meta; + @override final TranslationMetadata $meta; /// Access flat map dynamic operator[](String key) => $meta.getTranslation(key); - late final _StringsEn _root = this; // ignore: unused_field + late final StringsEn _root = this; // ignore: unused_field // Translations - late final _StringsPackagesPageEn packagesPage = _StringsPackagesPageEn._(_root); - late final _StringsPackageDetailsPageEn packageDetailsPage = _StringsPackageDetailsPageEn._(_root); - late final _StringsSettingsPageEn settingsPage = _StringsSettingsPageEn._(_root); - late final _StringsBottomNaviBarEn bottomNaviBar = _StringsBottomNaviBarEn._(_root); + late final StringsPackagesPageEn packagesPage = StringsPackagesPageEn._(_root); + late final StringsPackageDetailsPageEn packageDetailsPage = StringsPackageDetailsPageEn._(_root); + late final StringsSettingsPageEn settingsPage = StringsSettingsPageEn._(_root); + late final StringsBottomNaviBarEn bottomNaviBar = StringsBottomNaviBarEn._(_root); } // Path: packagesPage -class _StringsPackagesPageEn { - _StringsPackagesPageEn._(this._root); +class StringsPackagesPageEn { + StringsPackagesPageEn._(this._root); - final _StringsEn _root; // ignore: unused_field + final StringsEn _root; // ignore: unused_field // Translations String get searchPackages => 'Search Packages'; @@ -168,10 +95,10 @@ class _StringsPackagesPageEn { } // Path: packageDetailsPage -class _StringsPackageDetailsPageEn { - _StringsPackageDetailsPageEn._(this._root); +class StringsPackageDetailsPageEn { + StringsPackageDetailsPageEn._(this._root); - final _StringsEn _root; // ignore: unused_field + final StringsEn _root; // ignore: unused_field // Translations String get title => 'Details'; @@ -180,10 +107,10 @@ class _StringsPackageDetailsPageEn { } // Path: settingsPage -class _StringsSettingsPageEn { - _StringsSettingsPageEn._(this._root); +class StringsSettingsPageEn { + StringsSettingsPageEn._(this._root); - final _StringsEn _root; // ignore: unused_field + final StringsEn _root; // ignore: unused_field // Translations String get title => 'Settings'; @@ -193,10 +120,10 @@ class _StringsSettingsPageEn { } // Path: bottomNaviBar -class _StringsBottomNaviBarEn { - _StringsBottomNaviBarEn._(this._root); +class StringsBottomNaviBarEn { + StringsBottomNaviBarEn._(this._root); - final _StringsEn _root; // ignore: unused_field + final StringsEn _root; // ignore: unused_field // Translations String get search => 'Search'; @@ -204,11 +131,11 @@ class _StringsBottomNaviBarEn { } // Path: -class _StringsJa implements _StringsEn { +class StringsJa implements StringsEn { /// You can call this constructor and build your own translation instance of this locale. /// Constructing via the enum [AppLocale.build] is preferred. - _StringsJa.build({Map? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver}) + StringsJa.build({Map? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver}) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), $meta = TranslationMetadata( locale: AppLocale.ja, @@ -220,25 +147,25 @@ class _StringsJa implements _StringsEn { } /// Metadata for the translations of . - @override final TranslationMetadata $meta; + @override final TranslationMetadata $meta; /// Access flat map @override dynamic operator[](String key) => $meta.getTranslation(key); - @override late final _StringsJa _root = this; // ignore: unused_field + @override late final StringsJa _root = this; // ignore: unused_field // Translations - @override late final _StringsPackagesPageJa packagesPage = _StringsPackagesPageJa._(_root); - @override late final _StringsPackageDetailsPageJa packageDetailsPage = _StringsPackageDetailsPageJa._(_root); - @override late final _StringsSettingsPageJa settingsPage = _StringsSettingsPageJa._(_root); - @override late final _StringsBottomNaviBarJa bottomNaviBar = _StringsBottomNaviBarJa._(_root); + @override late final StringsPackagesPageJa packagesPage = StringsPackagesPageJa._(_root); + @override late final StringsPackageDetailsPageJa packageDetailsPage = StringsPackageDetailsPageJa._(_root); + @override late final StringsSettingsPageJa settingsPage = StringsSettingsPageJa._(_root); + @override late final StringsBottomNaviBarJa bottomNaviBar = StringsBottomNaviBarJa._(_root); } // Path: packagesPage -class _StringsPackagesPageJa implements _StringsPackagesPageEn { - _StringsPackagesPageJa._(this._root); +class StringsPackagesPageJa implements StringsPackagesPageEn { + StringsPackagesPageJa._(this._root); - @override final _StringsJa _root; // ignore: unused_field + @override final StringsJa _root; // ignore: unused_field // Translations @override String get searchPackages => 'パッケージを検索'; @@ -246,10 +173,10 @@ class _StringsPackagesPageJa implements _StringsPackagesPageEn { } // Path: packageDetailsPage -class _StringsPackageDetailsPageJa implements _StringsPackageDetailsPageEn { - _StringsPackageDetailsPageJa._(this._root); +class StringsPackageDetailsPageJa implements StringsPackageDetailsPageEn { + StringsPackageDetailsPageJa._(this._root); - @override final _StringsJa _root; // ignore: unused_field + @override final StringsJa _root; // ignore: unused_field // Translations @override String get title => '詳細'; @@ -258,10 +185,10 @@ class _StringsPackageDetailsPageJa implements _StringsPackageDetailsPageEn { } // Path: settingsPage -class _StringsSettingsPageJa implements _StringsSettingsPageEn { - _StringsSettingsPageJa._(this._root); +class StringsSettingsPageJa implements StringsSettingsPageEn { + StringsSettingsPageJa._(this._root); - @override final _StringsJa _root; // ignore: unused_field + @override final StringsJa _root; // ignore: unused_field // Translations @override String get title => '設定'; @@ -271,10 +198,10 @@ class _StringsSettingsPageJa implements _StringsSettingsPageEn { } // Path: bottomNaviBar -class _StringsBottomNaviBarJa implements _StringsBottomNaviBarEn { - _StringsBottomNaviBarJa._(this._root); +class StringsBottomNaviBarJa implements StringsBottomNaviBarEn { + StringsBottomNaviBarJa._(this._root); - @override final _StringsJa _root; // ignore: unused_field + @override final StringsJa _root; // ignore: unused_field // Translations @override String get search => '探す'; @@ -284,7 +211,7 @@ class _StringsBottomNaviBarJa implements _StringsBottomNaviBarEn { /// Flat map(s) containing all translations. /// Only for edge cases! For simple maps, use the map function of this library. -extension on _StringsEn { +extension on StringsEn { dynamic _flatMapFunction(String path) { switch (path) { case 'packagesPage.searchPackages': return 'Search Packages'; @@ -303,7 +230,7 @@ extension on _StringsEn { } } -extension on _StringsJa { +extension on StringsJa { dynamic _flatMapFunction(String path) { switch (path) { case 'packagesPage.searchPackages': return 'パッケージを検索'; diff --git a/lib/main.dart b/lib/main.dart index f157b1e..fd4bbb7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:npm/features/settings/language.dart'; import 'package:npm/features/settings/theme.dart'; import 'package:npm/router.dart'; +import 'package:slang_flutter/slang_flutter.dart'; void main() => runApp(const ProviderScope(child: App())); @@ -12,8 +14,10 @@ class App extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final router = ref.watch(routerProvider); final theme = ref.watch(themeProvider); + final locale = ref.watch(translationProvider).$meta.locale.flutterLocale; return MaterialApp.router( + locale: locale, debugShowCheckedModeBanner: false, routerConfig: router, theme: theme, diff --git a/slang.yaml b/slang.yaml new file mode 100644 index 0000000..79c91ab --- /dev/null +++ b/slang.yaml @@ -0,0 +1,2 @@ +locale_handling: false +translation_class_visibility: public \ No newline at end of file