generateMainClass method
Future<void>
generateMainClass(
- List<
LocalizationSheet> sheets, - String outputDir,
- String className,
- 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());
}