From f6224f368a3283584496854589ba34758fa8029d Mon Sep 17 00:00:00 2001 From: Ahmed Ashour Date: Thu, 1 Dec 2022 22:42:02 +0100 Subject: [PATCH] [gen_l10n] keys can contain dollar sign (#114808) * [gen_l10n] keys can contain dollar sign Fixes #112250 * Update packages/flutter_tools/lib/src/localizations/gen_l10n.dart Co-authored-by: Christopher Fujino --- .../lib/src/localizations/gen_l10n.dart | 8 +++--- .../generate_localizations_test.dart | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/packages/flutter_tools/lib/src/localizations/gen_l10n.dart b/packages/flutter_tools/lib/src/localizations/gen_l10n.dart index 75fc944042cb..740a54cdd269 100644 --- a/packages/flutter_tools/lib/src/localizations/gen_l10n.dart +++ b/packages/flutter_tools/lib/src/localizations/gen_l10n.dart @@ -838,15 +838,15 @@ class LocalizationsGenerator { if (name[0] == '_') { return false; } - // Dart getter and method name cannot contain non-alphanumeric symbols - if (name.contains(RegExp(r'[^a-zA-Z_\d]'))) { + // Dart identifiers can only use letters, numbers, underscores, and `$` + if (name.contains(RegExp(r'[^a-zA-Z_$\d]'))) { return false; } - // Dart method name must start with lower case character + // Dart getter and method name should start with lower case character if (name[0].contains(RegExp(r'[A-Z]'))) { return false; } - // Dart class name cannot start with a number + // Dart getter and method name cannot start with a number if (name[0].contains(RegExp(r'\d'))) { return false; } diff --git a/packages/flutter_tools/test/general.shard/generate_localizations_test.dart b/packages/flutter_tools/test/general.shard/generate_localizations_test.dart index 18ca5227b494..0a60bc946932 100644 --- a/packages/flutter_tools/test/general.shard/generate_localizations_test.dart +++ b/packages/flutter_tools/test/general.shard/generate_localizations_test.dart @@ -2704,6 +2704,31 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e )), ); }); + + testWithoutContext('can start with and contain a dollar sign', () { + const String dollarArbFile = r''' +{ + "$title$": "Stocks", + "@$title$": { + "description": "Title for the application" + } +}'''; + final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') + ..createSync(recursive: true); + l10nDirectory.childFile(defaultTemplateArbFileName) + .writeAsStringSync(dollarArbFile); + + LocalizationsGenerator( + fileSystem: fs, + inputPathString: defaultL10nPathString, + templateArbFileName: defaultTemplateArbFileName, + outputFileString: defaultOutputFileString, + classNameString: defaultClassNameString, + logger: logger, + ) + ..loadResources() + ..writeOutputFiles(); + }); }); testWithoutContext('throws when the language code is not supported', () {