diff --git a/lib/src/config/pubspec_config.dart b/lib/src/config/pubspec_config.dart index 89dc763..7d4a95f 100644 --- a/lib/src/config/pubspec_config.dart +++ b/lib/src/config/pubspec_config.dart @@ -4,8 +4,10 @@ import '../utils/file_utils.dart'; import 'config_exception.dart'; class PubspecConfig { + bool? _flutter = false; bool? _enabled; String? _className; + String? _proxyName; String? _mainLocale; String? _arbDir; String? _outputDir; @@ -26,37 +28,51 @@ class PubspecConfig { "Failed to extract config from the 'pubspec.yaml' file.\nExpected YAML map but got ${pubspecYaml.runtimeType}."); } - var flutterIntlConfig = pubspecYaml['flutter_intl']; - if (flutterIntlConfig == null) { - return; - } + var intlConfig = pubspecYaml['flutter_intl']; + if (intlConfig == null) { + intlConfig = pubspecYaml['intl']; + + if( intlConfig==null) + throw ConfigException( + "Failed to detect flutter or dart context: no 'flutter_intl' or 'intl' keys found into 'pubspec.yaml' file."); + + _flutter = false; + } else + _flutter = true; - _enabled = flutterIntlConfig['enabled'] is bool - ? flutterIntlConfig['enabled'] + _enabled = intlConfig['enabled'] is bool + ? intlConfig['enabled'] : null; - _className = flutterIntlConfig['class_name'] is String - ? flutterIntlConfig['class_name'] + _className = intlConfig['class_name'] is String + ? intlConfig['class_name'] : null; - _mainLocale = flutterIntlConfig['main_locale'] is String - ? flutterIntlConfig['main_locale'] + _proxyName = intlConfig['proxy_class_name'] is String + ? intlConfig['proxy_class_name'] : null; - _arbDir = flutterIntlConfig['arb_dir'] is String - ? flutterIntlConfig['arb_dir'] + _mainLocale = intlConfig['main_locale'] is String + ? intlConfig['main_locale'] : null; - _outputDir = flutterIntlConfig['output_dir'] is String - ? flutterIntlConfig['output_dir'] + _arbDir = intlConfig['arb_dir'] is String + ? intlConfig['arb_dir'] : null; - _useDeferredLoading = flutterIntlConfig['use_deferred_loading'] is bool - ? flutterIntlConfig['use_deferred_loading'] + _outputDir = intlConfig['output_dir'] is String + ? intlConfig['output_dir'] + : null; + _useDeferredLoading = intlConfig['use_deferred_loading'] is bool + ? intlConfig['use_deferred_loading'] : null; _localizelyConfig = - LocalizelyConfig.fromConfig(flutterIntlConfig['localizely']); + LocalizelyConfig.fromConfig(intlConfig['localizely']); } + bool? get flutter => _flutter; + bool? get enabled => _enabled; String? get className => _className; + String? get proxyClassName => _proxyName; + String? get mainLocale => _mainLocale; String? get arbDir => _arbDir; diff --git a/lib/src/constants/constants.dart b/lib/src/constants/constants.dart index 48f52b8..4276d69 100644 --- a/lib/src/constants/constants.dart +++ b/lib/src/constants/constants.dart @@ -1,5 +1,6 @@ import 'package:path/path.dart'; +const defaultFlutter = false; const defaultClassName = 'S'; const defaultMainLocale = 'en'; final defaultArbDir = join('lib', 'l10n'); diff --git a/lib/src/generator/generator.dart b/lib/src/generator/generator.dart index 853346c..3fa2b14 100644 --- a/lib/src/generator/generator.dart +++ b/lib/src/generator/generator.dart @@ -1,5 +1,7 @@ import 'dart:convert'; +import 'package:intl_utils/src/generator/templates_proxy.dart'; + import '../config/pubspec_config.dart'; import '../constants/constants.dart'; import '../utils/file_utils.dart'; @@ -12,16 +14,25 @@ import 'templates.dart'; /// The generator of localization files. class Generator { late String _className; + late String _proxyClassName; late String _mainLocale; late String _arbDir; late String _outputDir; late bool _useDeferredLoading; late bool _otaEnabled; + late bool _flutter; /// Creates a new generator with configuration from the 'pubspec.yaml' file. Generator() { var pubspecConfig = PubspecConfig(); + _flutter = defaultFlutter; + if( pubspecConfig.flutter!=null ) + _flutter = pubspecConfig.flutter!; + else { + warning("Config parameter 'flutter_int' or 'intl' required."); + } + _className = defaultClassName; if (pubspecConfig.className != null) { if (isValidClassName(pubspecConfig.className!)) { @@ -32,6 +43,16 @@ class Generator { } } + _proxyClassName = defaultClassName; + if (pubspecConfig.proxyClassName != null) { + if (isValidClassName(pubspecConfig.proxyClassName!)) { + _proxyClassName = pubspecConfig.proxyClassName!; + } else { + warning( + "Config parameter 'proxy_class_name' requires valid 'UpperCamelCase' value."); + } + } + _mainLocale = defaultMainLocale; if (pubspecConfig.mainLocale != null) { if (isValidLocale(pubspecConfig.mainLocale!)) { @@ -86,12 +107,18 @@ class Generator { Future _updateGeneratedDir() async { var labels = _getLabelsFromMainArbFile(); var locales = _orderLocales(getLocales(_arbDir)); - var content = - generateL10nDartFileContent(_className, labels, locales, _otaEnabled); - var formattedContent = formatDartContent(content, 'l10n.dart'); + var content = generateL10nDartFileContent(_flutter, _className, labels, locales, _otaEnabled); + var formattedContent = formatDartContent(content, 'l10n.dart'); await updateL10nDartFile(formattedContent, _outputDir); + if( _proxyClassName!=null && _proxyClassName.isNotEmpty ) { + content = generateL10nProxyDartFileContent(_flutter, _proxyClassName, labels, locales); + formattedContent = formatDartContent(content, 'l10n_proxy.dart'); + await updateL10nProxyDartFile(formattedContent, _outputDir); + info("$_proxyClassName generated"); + } + var intlDir = getIntlDirectory(_outputDir); if (intlDir == null) { await createIntlDirectory(_outputDir); diff --git a/lib/src/generator/templates.dart b/lib/src/generator/templates.dart index 3c63dae..37d70b7 100644 --- a/lib/src/generator/templates.dart +++ b/lib/src/generator/templates.dart @@ -2,8 +2,9 @@ import '../utils/utils.dart'; import 'label.dart'; String generateL10nDartFileContent( - String className, List