From ea477d59818f41f9877fc8789e9cd201cfe1c11a Mon Sep 17 00:00:00 2001 From: kzrnm Date: Mon, 19 Aug 2024 00:57:30 +0900 Subject: [PATCH] [gen_l10n] `isCustomDateFormat` accepts an actual boolean (#153439) Fixes #153420 ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md --- .../lib/src/localizations/gen_l10n_types.dart | 3 +++ .../generate_localizations_test.dart | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/packages/flutter_tools/lib/src/localizations/gen_l10n_types.dart b/packages/flutter_tools/lib/src/localizations/gen_l10n_types.dart index d4c6f12c8d..e6d78c1128 100644 --- a/packages/flutter_tools/lib/src/localizations/gen_l10n_types.dart +++ b/packages/flutter_tools/lib/src/localizations/gen_l10n_types.dart @@ -283,6 +283,9 @@ class Placeholder { if (value == null) { return null; } + if (value is bool) { + return value; + } if (value != 'true' && value != 'false') { throw L10nException( 'The "$attributeName" value of the "$name" placeholder in message $resourceId ' 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 c3c28b362f..068bb6830f 100644 --- a/packages/flutter_tools/test/general.shard/generate_localizations_test.dart +++ b/packages/flutter_tools/test/general.shard/generate_localizations_test.dart @@ -1658,6 +1658,28 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e expect(content, contains(r"DateFormat('asdf o\'clock', localeName)")); }); + testWithoutContext('handle arbitrary formatted date with actual boolean', () { + setupLocalizations({ + 'en': ''' +{ + "@@locale": "en", + "springBegins": "Spring begins on {springStartDate}", + "@springBegins": { + "description": "The first day of spring", + "placeholders": { + "springStartDate": { + "type": "DateTime", + "format": "asdf o'clock", + "isCustomDateFormat": true + } + } + } +}''' + }); + final String content = getGeneratedFileContent(locale: 'en'); + expect(content, contains(r"DateFormat('asdf o\'clock', localeName)")); + }); + testWithoutContext('throws an exception when no format attribute is passed in', () { expect( () {