diff --git a/example/.gitignore b/example/.gitignore index e2ecd8d..aeecea3 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -44,3 +44,5 @@ app.*.map.json /android/app/release *.env + +/lib/l10n/* diff --git a/lib/src/gen/crowdin_generator.dart b/lib/src/gen/crowdin_generator.dart index 7871fad..7719a31 100644 --- a/lib/src/gen/crowdin_generator.dart +++ b/lib/src/gen/crowdin_generator.dart @@ -82,9 +82,15 @@ class CrowdinLocalization extends ${l10nConfig.outputClass} { buffer.writeln( " String get $key => Crowdin.getText(localeName, '$key') ?? _fallbackTexts.$key;"); } else { - var params = generateMethodParameters(message).join(', '); - var values = - placeholders.map((placeholder) => placeholder.name).join(', '); + var paramsList = generateMethodParameters(message); + var params = l10nConfig.useNamedParameters + ? '{${paramsList.map((p) => 'required $p').join(', ')}}' + : paramsList.join(', '); + var values = l10nConfig.useNamedParameters + ? placeholders + .map((placeholder) => '${placeholder.name}: ${placeholder.name}') + .join(', ') + : placeholders.map((placeholder) => placeholder.name).join(', '); var args = placeholders .map((placeholder) => '\'${placeholder.name}\':${placeholder.name}') .join(', '); diff --git a/lib/src/gen/l10n_config.dart b/lib/src/gen/l10n_config.dart index 1c8d36f..43577b4 100644 --- a/lib/src/gen/l10n_config.dart +++ b/lib/src/gen/l10n_config.dart @@ -11,6 +11,7 @@ class L10nConfig { String templateArbFile; String outputClass; bool syntheticPackage; + bool useNamedParameters; L10nConfig({ required this.arbDir, @@ -19,6 +20,7 @@ class L10nConfig { required this.outputDir, required this.outputClass, this.syntheticPackage = false, + this.useNamedParameters = false, }); String get finalOutputDir => syntheticPackage @@ -43,6 +45,8 @@ class L10nConfig { bool syntheticPackage = yamlGenConfig['synthetic-package'] ?? false; + bool useNamedParameters = yamlGenConfig['use-named-parameters'] ?? false; + return L10nConfig( arbDir: arbDir, templateArbFile: templateArbFile, @@ -50,6 +54,7 @@ class L10nConfig { outputDir: outputDir, syntheticPackage: syntheticPackage, outputLocalizationFile: outputLocalizationFile, + useNamedParameters: useNamedParameters, ); } else { throw Exception('No l10n.yaml file'); diff --git a/test/crowdin_generator_test.dart b/test/crowdin_generator_test.dart index e6593d3..9d3cf33 100644 --- a/test/crowdin_generator_test.dart +++ b/test/crowdin_generator_test.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:crowdin_sdk/src/common/gen_l10n_types.dart'; import 'package:crowdin_sdk/src/gen/crowdin_generator.dart'; +import 'package:crowdin_sdk/src/gen/l10n_config.dart'; import 'package:flutter_test/flutter_test.dart'; import 'test_arb.dart'; @@ -28,5 +29,33 @@ void main() { String? pluralType = specifyPluralType('int', platformVersion); expect(result, ['$pluralType count', 'Object thing']); }); + + test( + 'should generate named parameters when use-named-parameters is enabled', + () { + final config = L10nConfig( + arbDir: 'lib/l10n', + templateArbFile: 'app_en.arb', + outputLocalizationFile: 'app_localizations.dart', + outputDir: null, + outputClass: 'AppLocalizations', + syntheticPackage: true, + useNamedParameters: true, + ); + + final output = generationContent( + keys: CrowdinGenerator.getKeys(testArb), + arbResource: testArb, + l10nConfig: config, + ); + + expect(output, contains('String hello({required')); + expect(output, contains('_fallbackTexts.hello(userName: userName)')); + + expect(output, contains('String nThings({required')); + expect(output, contains('_fallbackTexts.nThings(')); + expect(output, contains('count: count')); + expect(output, contains('thing: thing')); + }); }); }