generateSheetClass method

Future<void> generateSheetClass(
  1. LocalizationSheet sheet,
  2. String outputDir
)

Generate individual sheet class file

Implementation

Future<void> generateSheetClass(
  LocalizationSheet sheet,
  String outputDir,
) async {
  final buffer = StringBuffer();
  final className = '${StringUtils.capitalize(sheet.name)}Localizations';

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

  buffer.writeln('class $className {');
  buffer.writeln('  final String _languageCode;');
  buffer.writeln();
  buffer.writeln('  const $className(this._languageCode);');
  buffer.writeln();

  // Generate methods for each translation
  for (final translation in sheet.translations) {
    final methodName = StringUtils.sanitizeMethodName(translation.key);

    // Add comment for the translation key
    buffer.writeln('  /// Translation for key: ${translation.key}');

    // Check if the translation has interpolation
    final hasInterpolation = translation.values.values.any(
      (value) => StringUtils.hasInterpolation(value),
    );

    if (hasInterpolation) {
      // Generate method with parameters
      final params = StringUtils.extractInterpolationParams(
          translation.values.values.first);
      final paramList = params.map((p) => 'dynamic $p').join(', ');

      buffer.writeln('  String $methodName({$paramList}) {');
      buffer.writeln('    switch (_languageCode) {');

      for (final languageCode in sheet.languageCodes) {
        final translatedValue = translation.values[languageCode] ?? '';
        buffer.writeln("      case '$languageCode':");
        buffer.writeln("        return '''$translatedValue'''");

        // Add interpolation replacements
        for (final param in params) {
          buffer.writeln(
              "            .replaceAll('{$param}', $param.toString())");
        }
        buffer.writeln("            ;");
      }

      buffer.writeln("      default:");
      final defaultTranslation = translation.values.values.first;
      buffer.writeln("        return '''$defaultTranslation'''");
      for (final param in params) {
        buffer.writeln(
            "            .replaceAll('{$param}', $param.toString())");
      }
      buffer.writeln("            ;");
      buffer.writeln('    }');
      buffer.writeln('  }');
    } else {
      // Generate simple getter
      buffer.writeln('  String get $methodName {');
      buffer.writeln('    switch (_languageCode) {');

      for (final languageCode in sheet.languageCodes) {
        final translatedValue = translation.values[languageCode] ?? '';
        buffer.writeln("      case '$languageCode':");
        buffer.writeln("        return '''$translatedValue''';");
      }

      buffer.writeln("      default:");
      final defaultTranslation = translation.values.values.first;
      buffer.writeln("        return '''$defaultTranslation''';");
      buffer.writeln('    }');
      buffer.writeln('  }');
    }
    buffer.writeln();
  }

  buffer.writeln('}');

  final file = File(path.join(outputDir, '${sheet.name}_localizations.dart'));
  await file.writeAsString(buffer.toString());
}