generateMainClass method

Future<void> generateMainClass(
  1. List<LocalizationSheet> sheets,
  2. String outputDir,
  3. String className,
  4. bool includeFlutterDelegates,
)

Generate main localization class file

Implementation

Future<void> generateMainClass(
  List<LocalizationSheet> sheets,
  String outputDir,
  String className,
  bool includeFlutterDelegates,
) async {
  final buffer = StringBuffer();

  // Add generation comment
  buffer.writeln('// GENERATED CODE - DO NOT MODIFY BY HAND');
  buffer.writeln('// Generated by Excel Translator');
  buffer.writeln('// ${DateTime.now()}');
  buffer.writeln();

  // Add imports based on requirements
  if (includeFlutterDelegates) {
    buffer.writeln("import 'package:flutter/material.dart';");
    buffer.writeln("import 'package:flutter/cupertino.dart';");
    buffer
        .writeln("import 'package:excel_translator/excel_translator.dart';");
    buffer.writeln("import 'dart:ui' show PlatformDispatcher;");
  }

  // Add sheet imports
  for (final sheet in sheets) {
    buffer.writeln("import '${sheet.name}_localizations.dart';");
  }
  buffer.writeln();

  // Generate main class
  buffer.writeln('class $className {');
  buffer.writeln('  final String languageCode;');
  buffer.writeln();

  // Add supported languages list
  final allLanguageCodes = <String>{};
  for (final sheet in sheets) {
    allLanguageCodes.addAll(sheet.languageCodes);
  }
  final sortedLanguages = allLanguageCodes.toList()..sort();

  buffer.writeln('  static const List<String> supportedLanguages = [');
  for (final lang in sortedLanguages) {
    buffer.writeln("    '$lang',");
  }
  buffer.writeln('  ];');
  buffer.writeln();

  // Add sheet properties
  for (final sheet in sheets) {
    final sheetClassName =
        '${StringUtils.capitalize(sheet.name)}Localizations';
    buffer.writeln('  late final $sheetClassName ${sheet.name};');
  }
  buffer.writeln();

  // Constructor
  buffer.writeln('  $className(this.languageCode) {');
  for (final sheet in sheets) {
    final sheetClassName =
        '${StringUtils.capitalize(sheet.name)}Localizations';
    buffer.writeln('    ${sheet.name} = $sheetClassName(languageCode);');
  }
  buffer.writeln('  }');
  buffer.writeln();

  if (includeFlutterDelegates) {
    // Add static helper methods for common languages
    final languageRepo = LanguageValidationRepositoryImpl();
    for (final lang in sortedLanguages.take(5)) {
      final capitalizedLang = languageRepo.getLanguageName(lang);
      buffer.writeln('  /// Get $capitalizedLang instance');
      buffer.writeln("  static $className get $lang => $className('$lang');");
    }
    buffer.writeln();

    // Add convenience static getters with full names
    for (final lang in sortedLanguages.take(5)) {
      final fullName = languageRepo.getLanguageName(lang);
      buffer.writeln(
          "  static $className get $fullName => $className('$lang');");
    }
    buffer.writeln();

    // Static method for getting instance from context
    buffer.writeln('  static $className of(BuildContext context) {');
    buffer.writeln('    final locale = Localizations.localeOf(context);');
    buffer.writeln('    return $className(locale.languageCode);');
    buffer.writeln('  }');
    buffer.writeln();

    // Get system language with fallback
    buffer.writeln('  /// Get system language with fallback');
    buffer.writeln('  static String getSystemLanguage() {');
    buffer.writeln('    try {');
    buffer.writeln(
        '      // Try to get from Flutter${String.fromCharCode(39)}s PlatformDispatcher first');
    buffer.writeln(
        '      final locales = PlatformDispatcher.instance.locales;');
    buffer.writeln('      if (locales.isNotEmpty) {');
    buffer.writeln(
        '        final locale = locales.first.languageCode.toLowerCase();');
    buffer.writeln('        if (supportedLanguages.contains(locale)) {');
    buffer.writeln('          return locale;');
    buffer.writeln('        }');
    buffer.writeln('      }');
    buffer.writeln('    } catch (e) {');
    buffer.writeln(
        '      // Fall back to other methods if PlatformDispatcher fails');
    buffer.writeln('    }');
    buffer.writeln();
    buffer.writeln('    // Final fallback to English');
    buffer.writeln("    return 'en';");
    buffer.writeln('  }');
    buffer.writeln();

    // Add current getter
    buffer.writeln('  /// Get current localization based on system language');
    buffer.writeln(
        '  static $className get current => $className(getSystemLanguage());');
    buffer.writeln();

    // Add Flutter delegates
    buffer.writeln('  /// Delegate for localizations');
    buffer.writeln(
        '  static const ${className}Delegate delegate = ${className}Delegate();');
    buffer.writeln();
    buffer.writeln(
        '  /// All localization delegates including Flutter${String.fromCharCode(39)}s built-in delegates');
    buffer.writeln(
        '  static const List<LocalizationsDelegate<dynamic>> delegates = [');
    buffer.writeln('    delegate, // Custom localizations');
    buffer.writeln('    GlobalMaterialLocalizations.delegate,');
    buffer.writeln('    GlobalWidgetsLocalizations.delegate,');
    buffer.writeln('    GlobalCupertinoLocalizations.delegate,');
    buffer.writeln('  ];');
    buffer.writeln();
  }

  buffer.writeln('}');

  // Add delegate class if Flutter delegates are enabled
  if (includeFlutterDelegates) {
    buffer.writeln();
    buffer.writeln(
        'class ${className}Delegate extends LocalizationsDelegate<$className> {');
    buffer.writeln('  const ${className}Delegate();');
    buffer.writeln();
    buffer.writeln('  @override');
    buffer.writeln('  bool isSupported(Locale locale) {');
    buffer.writeln(
        '    return $className.supportedLanguages.contains(locale.languageCode);');
    buffer.writeln('  }');
    buffer.writeln();
    buffer.writeln('  @override');
    buffer.writeln('  Future<$className> load(Locale locale) async {');
    buffer.writeln('    return $className(locale.languageCode);');
    buffer.writeln('  }');
    buffer.writeln();
    buffer.writeln('  @override');
    buffer.writeln('  bool shouldReload(${className}Delegate old) => false;');
    buffer.writeln('}');
  }

  final file = File(path.join(outputDir, 'generated_localizations.dart'));
  await file.writeAsString(buffer.toString());
}