fromFileModel static method

SlangFileCollection fromFileModel({
  1. required RawConfig config,
  2. required Iterable<PlainTranslationFile> files,
})

Implementation

static SlangFileCollection fromFileModel({
  required RawConfig config,
  required Iterable<PlainTranslationFile> files,
}) {
  final includeUnderscore = config.namespaces &&
      files.any((f) {
        final fileNameNoExtension = PathUtils.getFileNameNoExtension(f.path);
        final baseFileMatch =
            RegexUtils.baseFileRegex.firstMatch(fileNameNoExtension);
        if (baseFileMatch == null) {
          return false;
        }

        // It is a file without locale but has a directory locale
        return PathUtils.findDirectoryLocale(
              filePath: f.path,
              inputDirectory: config.inputDirectory,
            ) !=
            null;
      });

  return SlangFileCollection(
    config: config,
    files: files
        .map((f) {
          final fileNameNoExtension =
              PathUtils.getFileNameNoExtension(f.path);
          final baseFileMatch =
              RegexUtils.baseFileRegex.firstMatch(fileNameNoExtension);
          if (includeUnderscore || baseFileMatch != null) {
            // base file (file without locale, may be multiples due to namespaces!)
            // could also be a non-base locale when directory name is a locale

            // directory name could be a locale
            I18nLocale? directoryLocale;
            if (config.namespaces) {
              directoryLocale = PathUtils.findDirectoryLocale(
                filePath: f.path,
                inputDirectory: config.inputDirectory,
              );
            }

            return TranslationFile(
              path: f.path,
              locale: directoryLocale ?? config.baseLocale,
              namespace: fileNameNoExtension,
              read: f.read,
            );
          } else {
            // secondary files (strings_x)
            final match = RegexUtils.fileWithLocaleRegex
                .firstMatch(fileNameNoExtension);
            if (match != null) {
              final namespace = match.group(1)!;
              final locale = I18nLocale(
                language: match.group(2)!,
                script: match.group(3),
                country: match.group(4),
              );

              return TranslationFile(
                path: f.path,
                locale: locale,
                namespace: namespace,
                read: f.read,
              );
            }
          }

          return null;
        })
        // We cannot use "nonNulls" because this requires Dart 3.0
        // and slang currently supports Dart 2.17
        // ignore: deprecated_member_use
        .whereNotNull()
        .sortedBy((file) => '${file.locale}-${file.namespace}'),
  );
}