generationContent function

String generationContent({
  1. required List<String> keys,
  2. required Map<String, Object?> arbResource,
  3. required L10nConfig l10nConfig,
})

Implementation

String generationContent({
  required List<String> keys,
  required Map<String, Object?> arbResource,
  required L10nConfig l10nConfig,
}) {
  final buffer = StringBuffer()
    ..writeln(
      '''
import 'dart:convert';

import '${l10nConfig.outputLocalizationFile}';

import 'package:sonnet/sonnet.dart';

import 'package:flutter/widgets.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

export 'package:flutter_localizations/flutter_localizations.dart';
export 'package:sonnet/sonnet.dart';

class SonnetLocalizations extends ${l10nConfig.outputClass} {
  final ${l10nConfig.outputClass} _fallbacks;

  SonnetLocalizations(String locale, ${l10nConfig.outputClass} fallbackTexts) : _fallbacks = fallbackTexts, super(locale);

  static const LocalizationsDelegate<${l10nConfig.outputClass}> delegate = _SonnetLocalizationsDelegate();

  static const List<LocalizationsDelegate<dynamic>> localizationsDelegates = <
      LocalizationsDelegate<dynamic>>[
    delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ];

  static const List<Locale> supportedLocales = ${l10nConfig.outputClass}.supportedLocales;
 ''',
    );

  final arb = AppResourceBundle(arbResource);
  final messages = arb.resourceIds
      .map((id) => Message(arb, id, false))
      .toList(growable: false);
  for (final message in messages) {
    final key = message.resourceId;
    final placeholders = message.placeholders.values;

    if (message.placeholders.isEmpty) {
      buffer.writeln(
        """\t@override String get $key => Sonnet.get(localeName, '$key', fallback: _fallbacks.$key);""",
      );
    } else {
      final params = generateMethodParameters(message).join(', ');
      final values =
          placeholders.map((placeholder) => placeholder.name).join(', ');
      final args = placeholders
          .map((placeholder) => "'${placeholder.name}':${placeholder.name}")
          .join(', ');
      buffer.writeln(
        """\t@override String $key($params) => Sonnet.get(localeName, '$key', args: {$args}, fallback: _fallbacks.$key($values));""",
      );
    }
  }

  buffer.writeln('''
}

class _SonnetLocalizationsDelegate extends LocalizationsDelegate<${l10nConfig.outputClass}> {
  const _SonnetLocalizationsDelegate();

  @override
  Future<${l10nConfig.outputClass}> load(Locale locale) =>
      ${l10nConfig.outputClass}.delegate.load(locale)
          .then((fallback) {
            Sonnet.initialLoad(locale);
            return SonnetLocalizations(locale.toString(), fallback);
          });

  @override
  bool isSupported(Locale locale) => ${l10nConfig.outputClass}.supportedLocales.contains(locale);

  @override
  bool shouldReload(_SonnetLocalizationsDelegate old) => false;
}

extension SonnetBuildContextExt on BuildContext {
  SonnetLocalizations get sonnet => SonnetLocalizations.of(this)!;

  changeSonnetLocale(String locale) => Sonnet.changeLocale(locale);
}
''');

  return buffer.toString();
}