From 532fd3842687b8f187889ea42c6cfe65c63b0f83 Mon Sep 17 00:00:00 2001 From: Shihwan Date: Sat, 26 Oct 2024 16:32:47 +0800 Subject: [PATCH] fix: fix issue #118 add eol config to set generate files line separator. --- README.md | 1 + lib/src/config/pubspec_config.dart | 13 +++++++++++++ lib/src/generator/generator.dart | 8 ++++++-- lib/src/generator/intl_translation_helper.dart | 15 ++++++++------- lib/src/intl_translation/generate_localized.dart | 11 ++++++++--- lib/src/utils/utils.dart | 4 ++-- 6 files changed, 38 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 8143fec..3d3c586 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ flutter_intl: arb_dir: lib/l10n # Optional. Sets the directory of your ARB resource files. Provided value should be a valid path on your system. Default: lib/l10n output_dir: lib/generated # Optional. Sets the directory of generated localization files. Provided value should be a valid path on your system. Default: lib/generated use_deferred_loading: false # Optional. Must be set to true to generate localization code that is loaded with deferred loading. Default: false + eol: 'CRLF' # Optional. Line separator, CR, LF, CRLF localizely: # Optional settings if you use Localizely platform. Read more: https://localizely.com/blog/flutter-localization-step-by-step/?tab=automated-using-flutter-intl project_id: # Get it from the https://app.localizely.com/projects page. branch: # Get it from the “Branches” page on the Localizely platform, in case branching is enabled and you want to use a non-main branch. diff --git a/lib/src/config/pubspec_config.dart b/lib/src/config/pubspec_config.dart index 89dc763..00ebfac 100644 --- a/lib/src/config/pubspec_config.dart +++ b/lib/src/config/pubspec_config.dart @@ -10,6 +10,7 @@ class PubspecConfig { String? _arbDir; String? _outputDir; bool? _useDeferredLoading; + String? _lineSeparator; LocalizelyConfig? _localizelyConfig; PubspecConfig() { @@ -49,6 +50,16 @@ class PubspecConfig { _useDeferredLoading = flutterIntlConfig['use_deferred_loading'] is bool ? flutterIntlConfig['use_deferred_loading'] : null; + + String lineSeparator = flutterIntlConfig['eol'] is String + ? flutterIntlConfig['eol'] + : ''; + _lineSeparator = { + 'CR': '\r', + 'LF': '\n', + 'CRLF': '\r\n', + }[lineSeparator.toUpperCase()]; + _localizelyConfig = LocalizelyConfig.fromConfig(flutterIntlConfig['localizely']); } @@ -65,6 +76,8 @@ class PubspecConfig { bool? get useDeferredLoading => _useDeferredLoading; + String? get lineSeparator => _lineSeparator; + LocalizelyConfig? get localizelyConfig => _localizelyConfig; } diff --git a/lib/src/generator/generator.dart b/lib/src/generator/generator.dart index 853346c..cf28085 100644 --- a/lib/src/generator/generator.dart +++ b/lib/src/generator/generator.dart @@ -17,6 +17,7 @@ class Generator { late String _outputDir; late bool _useDeferredLoading; late bool _otaEnabled; + String? _lineSeparator; /// Creates a new generator with configuration from the 'pubspec.yaml' file. Generator() { @@ -67,6 +68,8 @@ class Generator { _otaEnabled = pubspecConfig.localizelyConfig?.otaEnabled ?? defaultOtaEnabled; + + _lineSeparator = pubspecConfig.lineSeparator; } /// Generates localization files. @@ -88,7 +91,8 @@ class Generator { var locales = _orderLocales(getLocales(_arbDir)); var content = generateL10nDartFileContent(_className, labels, locales, _otaEnabled); - var formattedContent = formatDartContent(content, 'l10n.dart'); + var formattedContent = + formatDartContent(content, 'l10n.dart', _lineSeparator); await updateL10nDartFile(formattedContent, _outputDir); @@ -150,6 +154,6 @@ class Generator { var arbFiles = getArbFiles(_arbDir).map((file) => file.path).toList(); var helper = IntlTranslationHelper(_useDeferredLoading); - helper.generateFromArb(outputDir, dartFiles, arbFiles); + helper.generateFromArb(outputDir, dartFiles, arbFiles, _lineSeparator); } } diff --git a/lib/src/generator/intl_translation_helper.dart b/lib/src/generator/intl_translation_helper.dart index a04d747..bf296f1 100644 --- a/lib/src/generator/intl_translation_helper.dart +++ b/lib/src/generator/intl_translation_helper.dart @@ -58,8 +58,8 @@ class IntlTranslationHelper { generation.generatedFilePrefix = ''; } - void generateFromArb( - String outputDir, List dartFiles, List arbFiles) { + void generateFromArb(String outputDir, List dartFiles, + List arbFiles, String? lineSeparator) { var allMessages = dartFiles.map((file) => extraction.parseFile(File(file))); for (var messageMap in allMessages) { messageMap.forEach( @@ -72,14 +72,14 @@ class IntlTranslationHelper { _loadData(arbFile, messagesByLocale); } messagesByLocale.forEach((locale, data) { - _generateLocaleFile(locale, data, outputDir); + _generateLocaleFile(locale, data, outputDir, lineSeparator); }); var fileName = '${generation.generatedFilePrefix}messages_all.dart'; var mainImportFile = File(path.join(outputDir, fileName)); var content = generation.generateMainImportFile(); - var formattedContent = formatDartContent(content, fileName); + var formattedContent = formatDartContent(content, fileName, lineSeparator); mainImportFile.writeAsStringSync(formattedContent); } @@ -103,8 +103,8 @@ class IntlTranslationHelper { generation.allLocales.add(locale); } - void _generateLocaleFile( - String locale, List localeData, String targetDir) { + void _generateLocaleFile(String locale, List localeData, + String targetDir, String? lineSeparator) { var translations = []; for (var jsonTranslations in localeData) { jsonTranslations.forEach((id, messageData) { @@ -114,7 +114,8 @@ class IntlTranslationHelper { } }); } - generation.generateIndividualMessageFile(locale, translations, targetDir); + generation.generateIndividualMessageFile( + locale, translations, targetDir, lineSeparator); } /// Regenerate the original IntlMessage objects from the given [data]. For diff --git a/lib/src/intl_translation/generate_localized.dart b/lib/src/intl_translation/generate_localized.dart index c3c86ac..7ef218c 100644 --- a/lib/src/intl_translation/generate_localized.dart +++ b/lib/src/intl_translation/generate_localized.dart @@ -106,11 +106,15 @@ class MessageGeneration { /// Generate a file <[generated_file_prefix]>_messages_<[locale]>.dart /// for the [translations] in [locale] and put it in [targetDir]. - void generateIndividualMessageFile(String basicLocale, - Iterable translations, String targetDir) { + void generateIndividualMessageFile( + String basicLocale, + Iterable translations, + String targetDir, + String? lineSeparator) { final fileName = '${generatedFilePrefix}messages_$basicLocale.dart'; final content = contentForLocale(basicLocale, translations); - final formattedContent = formatDartContent(content, fileName); + final formattedContent = + formatDartContent(content, fileName, lineSeparator); // To preserve compatibility, we don't use the canonical version of the // locale in the file name. @@ -477,6 +481,7 @@ abstract class TranslatedMessage { /// For backward compatibility, we still have the originalMessage API. MainMessage? get originalMessage => originalMessages?.first; + set originalMessage(MainMessage? m) { if (m != null) { originalMessages = [m]; diff --git a/lib/src/utils/utils.dart b/lib/src/utils/utils.dart index 0419be8..c1651b9 100644 --- a/lib/src/utils/utils.dart +++ b/lib/src/utils/utils.dart @@ -43,9 +43,9 @@ String formatJsonMessage(String jsonMessage) { } /// Formats Dart file content. -String formatDartContent(String content, String fileName) { +String formatDartContent(String content, String fileName, String? lineEnding) { try { - var formatter = DartFormatter(); + var formatter = DartFormatter(lineEnding: lineEnding); return formatter.format(content); } catch (e) { info('Failed to format \'$fileName\' file.');