Skip to content

Commit

Permalink
Refactored localization (#164)
Browse files Browse the repository at this point in the history
* Refactored localization

- Created feature localizations
- Created Delegates
- Refactored folder structure a bit

* Fixed issue caused by dart-lang/build/issues/2835

* Fixed issue by creating typedef
  • Loading branch information
hawkkiller committed Apr 26, 2023
1 parent d16d503 commit 17181bc
Show file tree
Hide file tree
Showing 26 changed files with 136 additions and 45 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ build/
# Codegen
*.*.dart
generated_*
lib/src/core/localization/generated/

pubspec.lock
.metadata
6 changes: 5 additions & 1 deletion analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
include: package:sizzle_lints/sizzle_lints.yaml
include: package:sizzle_lints/sizzle_lints.yaml

analyzer:
exclude:
- "lib/src/core/localization/generated/**"
17 changes: 0 additions & 17 deletions blaze_starter.iml

This file was deleted.

8 changes: 6 additions & 2 deletions l10n.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
arb-dir: lib/src/core/localization
arb-dir: lib/src/core/localization/translations
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
output-localization-file: generated_localizations.dart
output-class: GeneratedLocalizations
nullable-getter: false
# output-dir: lib/src/core/localization/generated
# synthetic-package: false
2 changes: 1 addition & 1 deletion lib/runner_io.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:sizzle_starter/runner_shared.dart';
import 'package:sizzle_starter/src/core/model/initialization_hook.dart';
import 'package:sizzle_starter/src/feature/initialization/model/initialization_hook.dart';

// I\O runner
Future<void> run() async {
Expand Down
2 changes: 1 addition & 1 deletion lib/runner_shared.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:sizzle_starter/src/core/model/initialization_hook.dart';
import 'package:sizzle_starter/src/core/utils/logger.dart';
import 'package:sizzle_starter/src/feature/app/logic/app_runner.dart' as blaze;
import 'package:sizzle_starter/src/feature/initialization/model/initialization_hook.dart';

/// Run that uses all platforms
void sharedRun(InitializationHook hook) {
Expand Down
2 changes: 1 addition & 1 deletion lib/runner_web.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:sizzle_starter/runner_shared.dart';
import 'package:sizzle_starter/src/core/model/initialization_hook.dart';
import 'package:sizzle_starter/src/feature/initialization/model/initialization_hook.dart';

// Web runner
Future<void> run() async {
Expand Down
2 changes: 1 addition & 1 deletion lib/src/core/data/rest_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:http/http.dart' as http;
import 'package:meta/meta.dart';
import 'package:path/path.dart' as p;
import 'package:platform_info/platform_info.dart' as info;
import 'package:sizzle_starter/src/core/exception/network_exception.dart';
import 'package:sizzle_starter/src/core/utils/exception/network_exception.dart';

@immutable
class RestClient {
Expand Down
6 changes: 0 additions & 6 deletions lib/src/core/localization/app_en.arb

This file was deleted.

35 changes: 29 additions & 6 deletions lib/src/core/localization/app_localization.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,39 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_gen/gen_l10n/generated_localizations.dart';
import 'package:sizzle_starter/src/core/localization/localization_delegate.dart';
import 'package:sizzle_starter/src/feature/sample/localization/sample_localization_delegate.dart';

typedef GeneratedLocalization = GeneratedLocalizations;

/// A class which is responsible for providing the localization.
///
/// [AppLocalization] is a wrapper around [AppLocalizations].
///
/// [AppLocalization] is a wrapper around [GeneratedLocalizations].
class AppLocalization {
AppLocalization._();

static AppLocalizations of(BuildContext context) => AppLocalizations.of(context)!;
/// All the supported locales
///
/// SSOT - arb files
static const supportedLocales = GeneratedLocalizations.supportedLocales;

/// All the localizations delegates
static final localizationsDelegates = <LocalizationsDelegate<dynamic>>[
...GeneratedLocalizations.localizationsDelegates,
...featureDelegates,
];

/// Feature localization delegates
static final featureDelegates = <LocalizationDelegate<Object>>[
SampleLocalizationDelegate(),
];

/// Returns the localized strings for the given [context].
static T stringOf<T>(BuildContext context) => Localizations.of<T>(context, T)!;

static const supportedLocales = AppLocalizations.supportedLocales;
/// Returns the current locale of the [context].
static Locale? localeOf(BuildContext context) => Localizations.localeOf(context);

static const localizationsDelegates = AppLocalizations.localizationsDelegates;
/// Loads the [locale].
static Future<GeneratedLocalizations> load(Locale locale) =>
GeneratedLocalizations.delegate.load(locale);
}
20 changes: 20 additions & 0 deletions lib/src/core/localization/localization_delegate.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'package:flutter/material.dart';
import 'package:sizzle_starter/src/core/localization/app_localization.dart';

abstract class LocalizationDelegate<T> extends LocalizationsDelegate<T> {
LocalizationDelegate(this._delegateFactory);

final T Function(GeneratedLocalization appLocalizations) _delegateFactory;

@override
Future<T> load(Locale locale) async {
final appLocalizations = await GeneratedLocalization.delegate.load(locale);
return _delegateFactory(appLocalizations);
}

@override
bool shouldReload(covariant LocalizationsDelegate<T> old) => false;

@override
bool isSupported(Locale locale) => GeneratedLocalization.delegate.isSupported(locale);
}
10 changes: 10 additions & 0 deletions lib/src/core/localization/translations/app_en.arb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"appTitle": "sizzle_starter",
"@appTitle": {
"description": "The title of the application"
},
"samplePlaceholder": "Sample placeholder {value}",
"@samplePlaceholder": {
"description": "Sample placeholder"
}
}
10 changes: 10 additions & 0 deletions lib/src/core/localization/translations/app_es.arb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"appTitle": "sizzle_starter",
"@appTitle": {
"description": "El título de la aplicación"
},
"samplePlaceholder": "Espacio reservado de muestra {value}",
"@samplePlaceholder": {
"description": "Espacio reservado de muestra"
}
}
1 change: 0 additions & 1 deletion lib/src/core/router/router.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:sizzle_starter/src/feature/sample/widget/sample_screen.dart';

part 'router.gr.dart';
Expand Down
5 changes: 5 additions & 0 deletions lib/src/core/utils/extensions/context_extension.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import 'package:flutter/widgets.dart';

extension LocalizationX on BuildContext {
T stringOf<T>() => Localizations.of<T>(this, T)!;
}
2 changes: 1 addition & 1 deletion lib/src/feature/app/logic/app_runner.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:sizzle_starter/src/core/model/initialization_hook.dart';
import 'package:sizzle_starter/src/feature/app/widget/app.dart';
import 'package:sizzle_starter/src/feature/initialization/logic/initialization_processor.dart';
import 'package:sizzle_starter/src/feature/initialization/logic/initialization_steps.dart';
import 'package:sizzle_starter/src/feature/initialization/model/initialization_hook.dart';

/// A class which is responsible for initialization and running the app.
class AppRunner with InitializationSteps, InitializationProcessor, InitializationFactoryImpl {
Expand Down
1 change: 1 addition & 0 deletions lib/src/feature/app/widget/app_context.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class AppContext extends StatelessWidget {
localizationsDelegates: AppLocalization.localizationsDelegates,
theme: lightThemeData,
darkTheme: darkThemeData,
locale: const Locale('es'),
);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:flutter/foundation.dart';
import 'package:sizzle_starter/src/core/model/environment_store.dart';
import 'package:sizzle_starter/src/core/model/initialization_hook.dart';
import 'package:sizzle_starter/src/feature/app/logic/tracking_manager.dart';
import 'package:sizzle_starter/src/feature/initialization/logic/initialization_steps.dart';
import 'package:sizzle_starter/src/feature/initialization/model/environment_store.dart';
import 'package:sizzle_starter/src/feature/initialization/model/initialization_hook.dart';
import 'package:sizzle_starter/src/feature/initialization/model/initialization_progress.dart';

part 'initialization_factory.dart';
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:sizzle_starter/src/core/model/enum/environment.dart';
import 'package:sizzle_starter/src/feature/initialization/model/enum/environment.dart';

abstract class IEnvironmentStore {
abstract final Environment environment;
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import 'package:sizzle_starter/src/core/localization/app_localization.dart';
import 'package:sizzle_starter/src/core/localization/localization_delegate.dart';

abstract class SampleStrings {
String get appTitle;

String samplePlaceholder(String value);
}

class SampleLocalizationDelegate extends LocalizationDelegate<SampleStrings> {
SampleLocalizationDelegate() : super(_SampleStringsImpl.new);
}

class _SampleStringsImpl implements SampleStrings {
_SampleStringsImpl(this._appLocalizations);

final GeneratedLocalization _appLocalizations;

@override
String get appTitle => _appLocalizations.appTitle;

@override
String samplePlaceholder(String value) => _appLocalizations.samplePlaceholder(value);
}
17 changes: 15 additions & 2 deletions lib/src/feature/sample/widget/sample_screen.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:sizzle_starter/src/core/utils/extensions/context_extension.dart';
import 'package:sizzle_starter/src/feature/sample/localization/sample_localization_delegate.dart';

/// {@template sample_page}
/// SamplePage widget
Expand All @@ -10,5 +12,16 @@ class SampleScreen extends StatelessWidget {
const SampleScreen({super.key});

@override
Widget build(BuildContext context) => const Placeholder();
} // SamplePage
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: Text(context.stringOf<SampleStrings>().appTitle),
),
body: Column(
children: [
Text(
context.stringOf<SampleStrings>().samplePlaceholder('Misha'),
),
],
),
);
}
2 changes: 1 addition & 1 deletion test/unit/initialization_test.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:sizzle_starter/src/core/model/initialization_hook.dart';
import 'package:sizzle_starter/src/core/router/router.dart';
import 'package:sizzle_starter/src/feature/initialization/logic/initialization_processor.dart';
import 'package:sizzle_starter/src/feature/initialization/logic/initialization_steps.dart';
import 'package:sizzle_starter/src/feature/initialization/model/initialization_hook.dart';

void main() {
group('Initialization Processor >', () {
Expand Down
2 changes: 1 addition & 1 deletion test/unit/rest_client_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:http/http.dart' as http;
import 'package:http/testing.dart';
import 'package:sizzle_starter/src/core/data/rest_client.dart';
import 'package:sizzle_starter/src/core/exception/network_exception.dart';
import 'package:sizzle_starter/src/core/utils/exception/network_exception.dart';

void main() {
group(
Expand Down

0 comments on commit 17181bc

Please sign in to comment.