Unverified Commit 485c4091 authored by Michael Goderbauer's avatar Michael Goderbauer Committed by GitHub

import pkg:intl when DateFormat or NumberFormat is used (#83122)

parent e069578f
...@@ -1020,7 +1020,7 @@ class LocalizationsGenerator { ...@@ -1020,7 +1020,7 @@ class LocalizationsGenerator {
.replaceAll('@(class)', '$className${locale.camelCase()}') .replaceAll('@(class)', '$className${locale.camelCase()}')
.replaceAll('@(localeName)', locale.toString()) .replaceAll('@(localeName)', locale.toString())
.replaceAll('@(methods)', methods.join('\n\n')) .replaceAll('@(methods)', methods.join('\n\n'))
.replaceAll('@(requiresIntlImport)', _containsPluralMessage() ? "import 'package:intl/intl.dart' as intl;" : ''); .replaceAll('@(requiresIntlImport)', _requiresIntlImport() ? "import 'package:intl/intl.dart' as intl;" : '');
} }
String _generateSubclass( String _generateSubclass(
...@@ -1159,7 +1159,7 @@ class LocalizationsGenerator { ...@@ -1159,7 +1159,7 @@ class LocalizationsGenerator {
.replaceAll('@(messageClassImports)', sortedClassImports.join('\n')) .replaceAll('@(messageClassImports)', sortedClassImports.join('\n'))
.replaceAll('@(delegateClass)', delegateClass) .replaceAll('@(delegateClass)', delegateClass)
.replaceAll('@(requiresFoundationImport)', useDeferredLoading ? '' : "import 'package:flutter/foundation.dart';") .replaceAll('@(requiresFoundationImport)', useDeferredLoading ? '' : "import 'package:flutter/foundation.dart';")
.replaceAll('@(requiresIntlImport)', _containsPluralMessage() ? "import 'package:intl/intl.dart' as intl;" : '') .replaceAll('@(requiresIntlImport)', _requiresIntlImport() ? "import 'package:intl/intl.dart' as intl;" : '')
.replaceAll('@(canBeNullable)', usesNullableGetter ? '?' : '') .replaceAll('@(canBeNullable)', usesNullableGetter ? '?' : '')
.replaceAll('@(needsNullCheck)', usesNullableGetter ? '' : '!') .replaceAll('@(needsNullCheck)', usesNullableGetter ? '' : '!')
// Removes all trailing whitespace from the generated file. // Removes all trailing whitespace from the generated file.
...@@ -1168,7 +1168,7 @@ class LocalizationsGenerator { ...@@ -1168,7 +1168,7 @@ class LocalizationsGenerator {
.replaceAll('\n\n\n', '\n\n'); .replaceAll('\n\n\n', '\n\n');
} }
bool _containsPluralMessage() => _allMessages.any((Message message) => message.isPlural); bool _requiresIntlImport() => _allMessages.any((Message message) => message.isPlural || message.placeholdersRequireFormatting);
void writeOutputFiles(Logger logger, { bool isFromYaml = false }) { void writeOutputFiles(Logger logger, { bool isFromYaml = false }) {
// First, generate the string contents of all necessary files. // First, generate the string contents of all necessary files.
......
...@@ -1489,6 +1489,41 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -1489,6 +1489,41 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
}); });
group('DateTime tests', () { group('DateTime tests', () {
testWithoutContext('imports package:intl', () {
const String singleDateMessageArbFileString = '''
{
"@@locale": "en",
"springBegins": "Spring begins on {springStartDate}",
"@springBegins": {
"description": "The first day of spring",
"placeholders": {
"springStartDate": {
"type": "DateTime",
"format": "yMd"
}
}
}
}''';
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true)
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleDateMessageArbFileString);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, contains(intlImportDartCode));
});
testWithoutContext('throws an exception when improperly formatted date is passed in', () { testWithoutContext('throws an exception when improperly formatted date is passed in', () {
const String singleDateMessageArbFileString = ''' const String singleDateMessageArbFileString = '''
{ {
...@@ -1565,6 +1600,44 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -1565,6 +1600,44 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
fail('Improper date formatting should throw an exception'); fail('Improper date formatting should throw an exception');
}); });
});
group('NumberFormat tests', () {
testWithoutContext('imports package:intl', () {
const String singleDateMessageArbFileString = '''
{
"courseCompletion": "You have completed {progress} of the course.",
"@courseCompletion": {
"description": "The amount of progress the student has made in their class.",
"placeholders": {
"progress": {
"type": "double",
"format": "percentPattern"
}
}
}
}''';
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true)
..childFile(defaultTemplateArbFileName).writeAsStringSync(
singleDateMessageArbFileString);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, contains(intlImportDartCode));
});
testWithoutContext('throws an exception when improperly formatted number is passed in', () { testWithoutContext('throws an exception when improperly formatted number is passed in', () {
const String singleDateMessageArbFileString = ''' const String singleDateMessageArbFileString = '''
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment