From 76523f87ddb38a38b355b75514e32aa94ec87f5c Mon Sep 17 00:00:00 2001 From: "Daniel E. Pupo Ricardo" Date: Thu, 18 Mar 2021 15:22:30 -0400 Subject: [PATCH 1/3] added null safety support - updated android embed version - updated example app - used androidX on example app --- bin/generate.dart | 8 +-- example/android/app/build.gradle | 2 +- .../android/app/src/main/AndroidManifest.xml | 26 ++++---- .../com/kingwu/genlangexample/MainActivity.kt | 9 +-- example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../ios/Flutter/flutter_export_environment.sh | 13 ++++ example/lib/generated/i18n.dart | 15 ++--- example/lib/generated/messages_all.dart | 61 ++++++++++++------- example/lib/main.dart | 22 +++---- example/pubspec.yaml | 4 +- example/res/string/_zh_CN.json | 11 ---- example/res/string/string_.json | 11 ---- example/res/string/string_es.json | 11 ++++ example/res/string/xxxxx_zh_CN.json | 11 ---- example/test/widget_test.dart | 2 +- lib/core_18n.dart | 22 ++++--- lib/extra_json_file_tool.dart | 56 ++++++++--------- lib/extra_json_message_tool.dart | 20 +++--- lib/generate_i18n_dart.dart | 24 ++++---- lib/generate_message_all.dart | 14 ++--- pubspec.yaml | 8 +-- 22 files changed, 182 insertions(+), 173 deletions(-) create mode 100755 example/ios/Flutter/flutter_export_environment.sh delete mode 100644 example/res/string/_zh_CN.json delete mode 100644 example/res/string/string_.json create mode 100644 example/res/string/string_es.json delete mode 100644 example/res/string/xxxxx_zh_CN.json diff --git a/bin/generate.dart b/bin/generate.dart index 8709184..a70bffb 100644 --- a/bin/generate.dart +++ b/bin/generate.dart @@ -25,22 +25,22 @@ I18nOption _generateI18Option(List args) { return i18nOption; } -ArgParser _generateArgParser(I18nOption i18nOption) { +ArgParser _generateArgParser(I18nOption? i18nOption) { var parser = new ArgParser(); parser.addOption('source-dir', defaultsTo: 'res/string', - callback: (String x) => i18nOption.sourceDir = x, + callback: (String? x) => i18nOption!.sourceDir = x, help: 'A source folder contains all string json files'); parser.addOption('output-dir', defaultsTo: 'lib/generated', - callback: (String x) => i18nOption.outputDir = x, + callback: (String? x) => i18nOption!.outputDir = x, help: 'A output folder stores all generated files'); parser.addOption('template-locale', defaultsTo: 'en', - callback: (String x) => i18nOption.templateLocale = x, + callback: (String? x) => i18nOption!.templateLocale = x, help: 'Use string_{template-locale}.json as a template for default value when a locale does not exist. If string_en does not exist, this script will use the first string json file as a template'); diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 9ba54f6..da2a67b 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 27 + compileSdkVersion 28 sourceSets { main.java.srcDirs += 'src/main/kotlin' diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index cb79ff9..a9c90a4 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.kingwu.genlangexample"> + android:label="gen_lang_example" + android:icon="@mipmap/ic_launcher"> + android:name=".MainActivity" + android:launchMode="singleTop" + android:theme="@style/LaunchTheme" + android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density" + android:hardwareAccelerated="true" + android:windowSoftInputMode="adjustResize"> - + + diff --git a/example/android/app/src/main/kotlin/com/kingwu/genlangexample/MainActivity.kt b/example/android/app/src/main/kotlin/com/kingwu/genlangexample/MainActivity.kt index ee5a788..1525352 100644 --- a/example/android/app/src/main/kotlin/com/kingwu/genlangexample/MainActivity.kt +++ b/example/android/app/src/main/kotlin/com/kingwu/genlangexample/MainActivity.kt @@ -1,13 +1,6 @@ package com.kingwu.genlangexample -import android.os.Bundle - -import io.flutter.app.FlutterActivity -import io.flutter.plugins.GeneratedPluginRegistrant +import io.flutter.embedding.android.FlutterActivity class MainActivity: FlutterActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - GeneratedPluginRegistrant.registerWith(this) - } } diff --git a/example/android/gradle.properties b/example/android/gradle.properties index 8bd86f6..38c8d45 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -1 +1,4 @@ org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index 2819f02..296b146 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/example/ios/Flutter/flutter_export_environment.sh b/example/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 0000000..37f697a --- /dev/null +++ b/example/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/home/vader/Android/flutter" +export "FLUTTER_APPLICATION_PATH=/home/vader/Linos/Project/gen_lang/example" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "SYMROOT=${SOURCE_ROOT}/../build/ios" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=false" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.packages" diff --git a/example/lib/generated/i18n.dart b/example/lib/generated/i18n.dart index 6cc83f9..f7cc88d 100644 --- a/example/lib/generated/i18n.dart +++ b/example/lib/generated/i18n.dart @@ -11,7 +11,7 @@ class S { static const GeneratedLocalizationsDelegate delegate = GeneratedLocalizationsDelegate(); - static S of(BuildContext context) { + static S? of(BuildContext context) { return Localizations.of(context, S); } @@ -73,13 +73,14 @@ class GeneratedLocalizationsDelegate extends LocalizationsDelegate { return const [ Locale("en", ""), Locale("ja", ""), + Locale("es", ""), Locale("zh", "TW"), ]; } - LocaleListResolutionCallback listResolution({Locale fallback}) { - return (List locales, Iterable supported) { + LocaleListResolutionCallback listResolution({Locale? fallback}) { + return (List? locales, Iterable supported) { if (locales == null || locales.isEmpty) { return fallback ?? supported.first; } else { @@ -88,13 +89,13 @@ class GeneratedLocalizationsDelegate extends LocalizationsDelegate { }; } - LocaleResolutionCallback resolution({Locale fallback}) { - return (Locale locale, Iterable supported) { + LocaleResolutionCallback resolution({Locale? fallback}) { + return (Locale? locale, Iterable supported) { return _resolve(locale, fallback, supported); }; } - Locale _resolve(Locale locale, Locale fallback, Iterable supported) { + Locale _resolve(Locale? locale, Locale? fallback, Iterable supported) { if (locale == null || !isSupported(locale)) { return fallback ?? supported.first; } @@ -116,7 +117,7 @@ class GeneratedLocalizationsDelegate extends LocalizationsDelegate { } @override - bool isSupported(Locale locale) => + bool isSupported(Locale? locale) => locale != null && supportedLocales.contains(locale); @override diff --git a/example/lib/generated/messages_all.dart b/example/lib/generated/messages_all.dart index 151961c..bbb20dd 100644 --- a/example/lib/generated/messages_all.dart +++ b/example/lib/generated/messages_all.dart @@ -23,22 +23,6 @@ class $ja extends MessageLookupByLibrary { }; } -final _$zh_TW = $zh_TW(); - -class $zh_TW extends MessageLookupByLibrary { - get localeName => 'zh_TW'; - - final messages = { - "genderMessage" : (targetGender, name) => "${Intl.genderLogic(targetGender, male: "你好 ${name},他是男。", female: "你好 ${name},她是女。", other: "你好 ${name},他/她是男/女。")}", - "locale" : MessageLookupByLibrary.simpleMessage("中文"), - "messageWithParams" : (yourName) => "你好 ${yourName},歡迎你。", - "pluralMessage" : (howMany, interviewerName) => "${Intl.pluralLogic(howMany, zero: null, one: "你好 ${interviewerName},我沒有工作經驗。", two:null, few:null, many:null, other: "你好 ${interviewerName},我有${howMany}年工作經驗。")}", - "simpleMessage" : MessageLookupByLibrary.simpleMessage("這是簡單消息"), - "specialCharactersMessage" : MessageLookupByLibrary.simpleMessage("Special Characters Nice Developer's \"Message\"\n Next Line"), - - }; -} - final _$en = $en(); class $en extends MessageLookupByLibrary { @@ -55,24 +39,59 @@ class $en extends MessageLookupByLibrary { }; } +final _$es = $es(); + +class $es extends MessageLookupByLibrary { + get localeName => 'es'; + + final messages = { + "genderMessage" : (targetGender, name) => "${Intl.genderLogic(targetGender, male: "Hola ${name}, él es u chico.", female: "Hola ${name}, ella es una chica.", other: "Hola ${name}, el/ella es chico/chica.")}", + "locale" : MessageLookupByLibrary.simpleMessage("Spanish"), + "messageWithParams" : (yourName) => "Hola ${yourName}, bienvenido!", + "pluralMessage" : (howMany, interviewerName) => "${Intl.pluralLogic(howMany, zero: null, one: "Hola ${interviewerName}, tengo un año de experiencia laboral.", two:null, few:null, many:null, other: "Hola ${interviewerName}, Tengo ${howMany} años de experiencia laboral.")}", + "simpleMessage" : MessageLookupByLibrary.simpleMessage("Este es un mensaje sencillo"), + "specialCharactersMessage" : MessageLookupByLibrary.simpleMessage("Caracteres Especiales Buenos Desarrolladores \"Mensaje\"\n Siguiente Línea"), + + }; +} + +final _$zh_TW = $zh_TW(); + +class $zh_TW extends MessageLookupByLibrary { + get localeName => 'zh_TW'; + + final messages = { + "genderMessage" : (targetGender, name) => "${Intl.genderLogic(targetGender, male: "你好 ${name},他是男。", female: "你好 ${name},她是女。", other: "你好 ${name},他/她是男/女。")}", + "locale" : MessageLookupByLibrary.simpleMessage("中文"), + "messageWithParams" : (yourName) => "你好 ${yourName},歡迎你。", + "pluralMessage" : (howMany, interviewerName) => "${Intl.pluralLogic(howMany, zero: null, one: "你好 ${interviewerName},我沒有工作經驗。", two:null, few:null, many:null, other: "你好 ${interviewerName},我有${howMany}年工作經驗。")}", + "simpleMessage" : MessageLookupByLibrary.simpleMessage("這是簡單消息"), + "specialCharactersMessage" : MessageLookupByLibrary.simpleMessage("Special Characters Nice Developer's \"Message\"\n Next Line"), + + }; +} + typedef Future LibraryLoader(); Map _deferredLibraries = { "ja": () => Future.value(null), - "zh_TW": () => Future.value(null), "en": () => Future.value(null), + "es": () => Future.value(null), + "zh_TW": () => Future.value(null), }; -MessageLookupByLibrary _findExact(localeName) { +MessageLookupByLibrary? _findExact(localeName) { switch (localeName) { case "ja": return _$ja; - case "zh_TW": - return _$zh_TW; case "en": return _$en; + case "es": + return _$es; + case "zh_TW": + return _$zh_TW; default: return null; @@ -105,7 +124,7 @@ bool _messagesExistFor(String locale) { } } -MessageLookupByLibrary _findGeneratedMessagesFor(locale) { +MessageLookupByLibrary? _findGeneratedMessagesFor(locale) { var actualLocale = Intl.verifiedLocale(locale, _messagesExistFor, onFailure: (_) => null); if (actualLocale == null) return null; diff --git a/example/lib/main.dart b/example/lib/main.dart index 6222900..2c1a6b8 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:gen_lang_example/generated/i18n.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:gen_lang_example/generated/i18n.dart'; void main() => runApp(MyApp()); @@ -33,20 +33,20 @@ class _MyAppState extends State { builder: (BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(S.of(context).locale), + title: Text(S.of(context)!.locale), ), body: Center( child: Column( children: [ - Text(S.of(context).locale), - Text(S.of(context).simpleMessage), - Text(S.of(context).messageWithParams('developer')), - Text(S.of(context).pluralMessage(1, 'KingWu')), - Text(S.of(context).pluralMessage(10, 'KingWu')), - Text(S.of(context).genderMessage('male', 'KingWu')), - Text(S.of(context).genderMessage('female', 'KingWu')), - Text(S.of(context).genderMessage('other', 'KingWu')), - Text(S.of(context).specialCharactersMessage) + Text(S.of(context)!.locale), + Text(S.of(context)!.simpleMessage), + Text(S.of(context)!.messageWithParams('developer')), + Text(S.of(context)!.pluralMessage(1, 'KingWu')), + Text(S.of(context)!.pluralMessage(10, 'KingWu')), + Text(S.of(context)!.genderMessage('male', 'KingWu')), + Text(S.of(context)!.genderMessage('female', 'KingWu')), + Text(S.of(context)!.genderMessage('other', 'KingWu')), + Text(S.of(context)!.specialCharactersMessage) ], ) ), diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 1bf3bfe..b98df0d 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -3,12 +3,12 @@ description: Demonstrates how to use the gen_lang plugin. publish_to: 'none' environment: - sdk: ">=2.0.0-dev.68.0 <3.0.0" + sdk: '>=2.12.0 <3.0.0' dependencies: flutter: sdk: flutter - cupertino_icons: ^0.1.2 + cupertino_icons: ^1.0.2 flutter_localizations: sdk: flutter diff --git a/example/res/string/_zh_CN.json b/example/res/string/_zh_CN.json deleted file mode 100644 index 88458b4..0000000 --- a/example/res/string/_zh_CN.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "genderMessageFemale":"Hi ${name}, She is girl.", - "genderMessageGOther":"Hi ${name}, he/she is boy/girl.", - "genderMessageMale":"Hi ${name}, He is boy.", - "locale":"English", - "messageWithParams":"Hi ${yourName}, Welcome you!", - "pluralMessageOne":"Hi ${interviewerName}, I have one year working experience.", - "pluralMessagePOther":"Hi ${interviewerName}, I have ${howMany} years of working experience.", - "simpleMessage":"This is a simple Message", - "specialCharactersMessage":"Special Characters Nice Developer's \"Message\"\n Next Line" -} \ No newline at end of file diff --git a/example/res/string/string_.json b/example/res/string/string_.json deleted file mode 100644 index 88458b4..0000000 --- a/example/res/string/string_.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "genderMessageFemale":"Hi ${name}, She is girl.", - "genderMessageGOther":"Hi ${name}, he/she is boy/girl.", - "genderMessageMale":"Hi ${name}, He is boy.", - "locale":"English", - "messageWithParams":"Hi ${yourName}, Welcome you!", - "pluralMessageOne":"Hi ${interviewerName}, I have one year working experience.", - "pluralMessagePOther":"Hi ${interviewerName}, I have ${howMany} years of working experience.", - "simpleMessage":"This is a simple Message", - "specialCharactersMessage":"Special Characters Nice Developer's \"Message\"\n Next Line" -} \ No newline at end of file diff --git a/example/res/string/string_es.json b/example/res/string/string_es.json new file mode 100644 index 0000000..4ae68df --- /dev/null +++ b/example/res/string/string_es.json @@ -0,0 +1,11 @@ +{ + "genderMessageFemale":"Hola ${name}, ella es una chica.", + "genderMessageGOther":"Hola ${name}, el/ella es chico/chica.", + "genderMessageMale":"Hola ${name}, él es u chico.", + "locale":"Spanish", + "messageWithParams":"Hola ${yourName}, bienvenido!", + "pluralMessageOne":"Hola ${interviewerName}, tengo un año de experiencia laboral.", + "pluralMessagePOther":"Hola ${interviewerName}, Tengo ${howMany} años de experiencia laboral.", + "simpleMessage":"Este es un mensaje sencillo", + "specialCharactersMessage":"Caracteres Especiales Buenos Desarrolladores \"Mensaje\"\n Siguiente Línea" +} diff --git a/example/res/string/xxxxx_zh_CN.json b/example/res/string/xxxxx_zh_CN.json deleted file mode 100644 index 88458b4..0000000 --- a/example/res/string/xxxxx_zh_CN.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "genderMessageFemale":"Hi ${name}, She is girl.", - "genderMessageGOther":"Hi ${name}, he/she is boy/girl.", - "genderMessageMale":"Hi ${name}, He is boy.", - "locale":"English", - "messageWithParams":"Hi ${yourName}, Welcome you!", - "pluralMessageOne":"Hi ${interviewerName}, I have one year working experience.", - "pluralMessagePOther":"Hi ${interviewerName}, I have ${howMany} years of working experience.", - "simpleMessage":"This is a simple Message", - "specialCharactersMessage":"Special Characters Nice Developer's \"Message\"\n Next Line" -} \ No newline at end of file diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart index 6ced774..3dd7f14 100644 --- a/example/test/widget_test.dart +++ b/example/test/widget_test.dart @@ -19,7 +19,7 @@ void main() { expect( find.byWidgetPredicate( (Widget widget) => widget is Text && - widget.data.startsWith('Running on:'), + widget.data!.startsWith('Running on:'), ), findsOneWidget, ); diff --git a/lib/core_18n.dart b/lib/core_18n.dart index 5065113..3c1a055 100644 --- a/lib/core_18n.dart +++ b/lib/core_18n.dart @@ -1,18 +1,18 @@ library core_18n; import 'dart:io'; + +import 'package:gen_lang/extra_json_file_tool.dart'; import 'package:gen_lang/extra_json_message_tool.dart'; import 'package:gen_lang/generate_i18n_dart.dart'; import 'package:gen_lang/generate_message_all.dart'; import 'package:gen_lang/print_tool.dart'; -import 'package:gen_lang/extra_json_file_tool.dart'; - import 'package:path/path.dart' as path; class I18nOption { - String sourceDir; - String templateLocale; - String outputDir; + String? sourceDir; + String? templateLocale; + String? outputDir; @override String toString() { @@ -32,7 +32,7 @@ void handleGenerateI18nFiles(I18nOption option) async { List files = await dirContents(Directory(path.join(current.path, option.sourceDir))); Map validFilesMap = getValidStringFileMap(files); - FileSystemEntity defaultTemplateLang = + FileSystemEntity? defaultTemplateLang = getDefaultTemplateLang(validFilesMap, option.templateLocale); if (null != defaultTemplateLang) { Map defaultJsonKeyMessageMap = @@ -99,11 +99,13 @@ void _handleGenerateMessageAllDart( switch (message.messageKey.type) { case MessageType.message: { - if (hasArgsInMessage(message.message)) { + if (hasArgsInMessage(message.message!)) { messageBuilder.writeln(generateKeyWithValue( jsonKey, generateMessageFunction( - extraArgsFromMessage(message.message), message.message))); + extraArgsFromMessage(message.message!), + message.message, + ))); } else { messageBuilder.writeln(generateKeyWithValue( jsonKey, generateSimpleMessage(message.message))); @@ -175,9 +177,9 @@ void _handleGenerateI18nDart( switch (message.messageKey.type) { case MessageType.message: { - if (hasArgsInMessage(message.message)) { + if (hasArgsInMessage(message.message!)) { getterBuilder.writeln(generateGetterMessageWithArgsFunction(jsonKey, - message.message, extraArgsFromMessage(message.message))); + message.message, extraArgsFromMessage(message.message!))); } else { getterBuilder.writeln( generateGetterSimpleMessageFunction(jsonKey, message.message)); diff --git a/lib/extra_json_file_tool.dart b/lib/extra_json_file_tool.dart index 24e6ad4..e756149 100644 --- a/lib/extra_json_file_tool.dart +++ b/lib/extra_json_file_tool.dart @@ -6,23 +6,23 @@ import 'package:gen_lang/print_tool.dart'; import 'package:path/path.dart' as path; class Message { - MessageKey messageKey; + late MessageKey messageKey; // Simple Message - String message; + String? message; // Plural - String zero; - String one; - String two; - String few; - String many; - String other; + String? zero; + String? one; + String? two; + String? few; + String? many; + String? other; // Gender - String male; - String female; - String genderOther; + String? male; + String? female; + String? genderOther; @override String toString() { @@ -33,7 +33,7 @@ class Message { class MessageKey { String key; MessageType type; - SubType subType; + SubType? subType; MessageKey(this.key, this.type, this.subType); @@ -91,9 +91,9 @@ Future> dirContents(Directory dir) { return completer.future; } -FileSystemEntity getDefaultTemplateLang( - Map validFilesMap, String lang) { - FileSystemEntity defaultFile = validFilesMap[lang]; +FileSystemEntity? getDefaultTemplateLang( + Map validFilesMap, String? lang) { + FileSystemEntity? defaultFile = validFilesMap[lang!]; if (defaultFile != null) { return defaultFile; } @@ -107,7 +107,7 @@ FileSystemEntity getDefaultTemplateLang( Future> generateJsonKeyMessageMap(File jsonFile) async { String json = await jsonFile.readAsString(); - String normalizedJson = normalizedSpecialCharacters(json); + String normalizedJson = normalizedSpecialCharacters(json)!; Map jsonMap = jsonDecode(normalizedJson); @@ -118,7 +118,7 @@ Future> generateJsonKeyMessageMap(File jsonFile) async { String v = jsonEntry.value; MessageKey _messageKey = getMessageKey(k); - Message _message; + Message? _message; if (keyMap.containsKey(_messageKey.key)) { _message = keyMap[_messageKey.key]; } else { @@ -133,32 +133,32 @@ Future> generateJsonKeyMessageMap(File jsonFile) async { switch (_messageKey.subType) { case SubType.pluralOne: { - _message.one = v; + _message!.one = v; break; } case SubType.pluralFew: { - _message.few = v; + _message!.few = v; break; } case SubType.pluralMany: { - _message.many = v; + _message!.many = v; break; } case SubType.pluralOther: { - _message.other = v; + _message!.other = v; break; } case SubType.pluralZero: { - _message.zero = v; + _message!.zero = v; break; } case SubType.pluralTwo: { - _message.two = v; + _message!.two = v; break; } default: @@ -173,17 +173,17 @@ Future> generateJsonKeyMessageMap(File jsonFile) async { switch (_messageKey.subType) { case SubType.genderMale: { - _message.male = v; + _message!.male = v; break; } case SubType.genderFemale: { - _message.female = v; + _message!.female = v; break; } case SubType.genderOther: { - _message.genderOther = v; + _message!.genderOther = v; break; } default: @@ -195,7 +195,7 @@ Future> generateJsonKeyMessageMap(File jsonFile) async { } default: { - _message.message = v; + _message!.message = v; break; } } @@ -207,7 +207,7 @@ Future> generateJsonKeyMessageMap(File jsonFile) async { MessageKey getMessageKey(String jsonKey) { String key; MessageType type; - SubType subType; + SubType? subType; if (jsonKey.endsWith('One')) { key = jsonKey.substring(0, jsonKey.lastIndexOf('One')); diff --git a/lib/extra_json_message_tool.dart b/lib/extra_json_message_tool.dart index 5984523..92ba194 100644 --- a/lib/extra_json_message_tool.dart +++ b/lib/extra_json_message_tool.dart @@ -2,7 +2,7 @@ RegExp ARG_REG_EXP = RegExp(r'\${\w+}'); const String DEFAULT_PLURAL_ARGS = 'howMany'; const String DEFAULT_GENDER_ARG = 'targetGender'; -List getArgs(Iterable allMatch, String defaultArg) { +List getArgs(Iterable allMatch, String? defaultArg) { List args = []; if (null != defaultArg) { args.add(defaultArg); @@ -18,7 +18,7 @@ List getArgs(Iterable allMatch, String defaultArg) { return args; } -String normalizedSpecialCharacters(String message) { +String? normalizedSpecialCharacters(String message) { if (null != message) { String normalizedJson = message.replaceAll(r"\", r"\\"); return normalizedJson.replaceAll(r'\\"', r'\\\"'); @@ -26,7 +26,7 @@ String normalizedSpecialCharacters(String message) { return null; } -String normalizedJsonMessage(String message) { +String? normalizedJsonMessage(String? message) { if (null != message) { return message; } @@ -37,11 +37,11 @@ String generateArg(arg) { return null != arg ? '"$arg"' : 'null'; } -String extraArgsFromGender(String male, String female, String other) { - List plurals = [male, female, other]; +String extraArgsFromGender(String? male, String? female, String? other) { + List plurals = [male, female, other]; Iterable theMostMatch = []; - for (String plural in plurals) { + for (String? plural in plurals) { if (null != plural) { Iterable allMatch = ARG_REG_EXP.allMatches(plural); if (null == theMostMatch || @@ -63,12 +63,12 @@ String extraArgsFromGender(String male, String female, String other) { return builder.toString(); } -String extraArgsFromPlural(String zero, String one, String two, String few, - String many, String other) { - List plurals = [zero, one, two, few, many, other]; +String extraArgsFromPlural(String? zero, String? one, String? two, String? few, + String? many, String? other) { + List plurals = [zero, one, two, few, many, other]; Iterable theMostMatch = []; - for (String plural in plurals) { + for (String? plural in plurals) { if (null != plural) { Iterable allMatch = ARG_REG_EXP.allMatches(plural); if (null == theMostMatch || diff --git a/lib/generate_i18n_dart.dart b/lib/generate_i18n_dart.dart index 82faeee..cf0db9a 100644 --- a/lib/generate_i18n_dart.dart +++ b/lib/generate_i18n_dart.dart @@ -15,7 +15,7 @@ class S { static const GeneratedLocalizationsDelegate delegate = GeneratedLocalizationsDelegate(); - static S of(BuildContext context) { + static S? of(BuildContext context) { return Localizations.of(context, S); } @@ -42,8 +42,8 @@ $supportedLocale ]; } - LocaleListResolutionCallback listResolution({Locale fallback}) { - return (List locales, Iterable supported) { + LocaleListResolutionCallback listResolution({Locale? fallback}) { + return (List? locales, Iterable supported) { if (locales == null || locales.isEmpty) { return fallback ?? supported.first; } else { @@ -52,13 +52,13 @@ $supportedLocale }; } - LocaleResolutionCallback resolution({Locale fallback}) { - return (Locale locale, Iterable supported) { + LocaleResolutionCallback resolution({Locale? fallback}) { + return (Locale? locale, Iterable supported) { return _resolve(locale, fallback, supported); }; } - Locale _resolve(Locale locale, Locale fallback, Iterable supported) { + Locale _resolve(Locale? locale, Locale? fallback, Iterable supported) { if (locale == null || !isSupported(locale)) { return fallback ?? supported.first; } @@ -80,7 +80,7 @@ $supportedLocale } @override - bool isSupported(Locale locale) => + bool isSupported(Locale? locale) => locale != null && supportedLocales.contains(locale); @override @@ -91,7 +91,7 @@ $supportedLocale '''; } -String generateGetterSimpleMessageFunction(String jsonKey, String message) { +String generateGetterSimpleMessageFunction(String jsonKey, String? message) { return ''' String get $jsonKey { return Intl.message("${normalizedJsonMessage(message)}", name: '$jsonKey'); @@ -100,7 +100,7 @@ String generateGetterSimpleMessageFunction(String jsonKey, String message) { } String generateGetterMessageWithArgsFunction( - String jsonKey, String message, String args) { + String jsonKey, String? message, String args) { return ''' String $jsonKey($args) { return Intl.message("${normalizedJsonMessage(message)}", name: '$jsonKey', args: [$args]); @@ -108,8 +108,8 @@ String generateGetterMessageWithArgsFunction( '''; } -String generateGetterPluralFunction(String jsonKey, String args, String zero, - String one, String two, String few, String many, String other) { +String generateGetterPluralFunction(String jsonKey, String args, String? zero, + String? one, String? two, String? few, String? many, String? other) { var zeroArg = generateArg(normalizedJsonMessage(zero)); var oneArg = generateArg(normalizedJsonMessage(one)); var twoArg = generateArg(normalizedJsonMessage(two)); @@ -133,7 +133,7 @@ String generateGetterPluralFunction(String jsonKey, String args, String zero, } String generateGetterGenderFunction( - String jsonKey, String args, String male, String female, String other) { + String jsonKey, String args, String? male, String? female, String? other) { var maleArg = generateArg(normalizedJsonMessage(male)); var femaleArg = generateArg(normalizedJsonMessage(female)); var otherArg = generateArg(normalizedJsonMessage(other)); diff --git a/lib/generate_message_all.dart b/lib/generate_message_all.dart index d9c20c9..f516810 100644 --- a/lib/generate_message_all.dart +++ b/lib/generate_message_all.dart @@ -19,7 +19,7 @@ Map _deferredLibraries = { $deferredLibraries }; -MessageLookupByLibrary _findExact(localeName) { +MessageLookupByLibrary? _findExact(localeName) { switch (localeName) { $findExacts default: @@ -53,7 +53,7 @@ bool _messagesExistFor(String locale) { } } -MessageLookupByLibrary _findGeneratedMessagesFor(locale) { +MessageLookupByLibrary? _findGeneratedMessagesFor(locale) { var actualLocale = Intl.verifiedLocale(locale, _messagesExistFor, onFailure: (_) => null); if (actualLocale == null) return null; @@ -82,16 +82,16 @@ String generateKeyWithValue(String key, String value) { return '''\t\t"$key" : $value,'''; } -String generateSimpleMessage(String message) { +String generateSimpleMessage(String? message) { return '''MessageLookupByLibrary.simpleMessage("${normalizedJsonMessage(message)}")'''; } -String generateMessageFunction(String args, String message) { +String generateMessageFunction(String args, String? message) { return '''($args) => "${normalizedJsonMessage(message)}"'''; } -String generatePluralFunction(String args, String zero, String one, String two, - String few, String many, String other) { +String generatePluralFunction(String args, String? zero, String? one, String? two, + String? few, String? many, String? other) { var zeroArg = generateArg(normalizedJsonMessage(zero)); var oneArg = generateArg(normalizedJsonMessage(one)); var twoArg = generateArg(normalizedJsonMessage(two)); @@ -103,7 +103,7 @@ String generatePluralFunction(String args, String zero, String one, String two, } String generateGenderFunction( - String args, String male, String female, String other) { + String args, String? male, String? female, String? other) { var maleArg = generateArg(normalizedJsonMessage(male)); var femaleArg = generateArg(normalizedJsonMessage(female)); var otherArg = generateArg(normalizedJsonMessage(other)); diff --git a/pubspec.yaml b/pubspec.yaml index f01ea2f..adcffaa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,9 +6,9 @@ version: 0.1.3 homepage: https://github.com/KingWu/gen_lang environment: - sdk: ">=2.0.0 <3.0.0" + sdk: '>=2.12.0 <3.0.0' dependencies: - args: '>=0.12.1 <2.0.0' - path: '>=0.9.0 <2.0.0' - ansicolor: ^1.0.2 \ No newline at end of file + args: ^2.0.0 + path: ^1.8.0 + ansicolor: ^2.0.1 \ No newline at end of file From 547c0793242fbf577a1bd863bdc5f8998a1f09a7 Mon Sep 17 00:00:00 2001 From: "Daniel E. Pupo Ricardo" Date: Thu, 18 Mar 2021 15:32:50 -0400 Subject: [PATCH 2/3] Updated version --- pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index adcffaa..8d4d3bb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: gen_lang description: >- gen_lang is a dart library for internationalization. Extracts messages to generate dart files required by Intl -version: 0.1.3 +version: 0.1.4-nullsafety.0 homepage: https://github.com/KingWu/gen_lang environment: @@ -11,4 +11,4 @@ environment: dependencies: args: ^2.0.0 path: ^1.8.0 - ansicolor: ^2.0.1 \ No newline at end of file + ansicolor: ^2.0.1 From 7ba75482dc641361839e5c40f194014dcf676e86 Mon Sep 17 00:00:00 2001 From: "Daniel E. Pupo Ricardo" Date: Mon, 5 Apr 2021 15:16:54 -0400 Subject: [PATCH 3/3] changed generated i18n S class to non null - updated example - updated version according null safety migration guide --- example/lib/generated/i18n.dart | 14 ++++++++++++-- example/lib/main.dart | 20 ++++++++++---------- lib/generate_i18n_dart.dart | 14 ++++++++++++-- pubspec.yaml | 2 +- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/example/lib/generated/i18n.dart b/example/lib/generated/i18n.dart index f7cc88d..c23e15a 100644 --- a/example/lib/generated/i18n.dart +++ b/example/lib/generated/i18n.dart @@ -11,8 +11,18 @@ class S { static const GeneratedLocalizationsDelegate delegate = GeneratedLocalizationsDelegate(); - static S? of(BuildContext context) { - return Localizations.of(context, S); + static S of(BuildContext context) { + final localization = Localizations.of(context, S); + + assert(() { + if (localization == null) { + throw FlutterError( + 'S requested with a context that does not include S.'); + } + return true; + }()); + + return localization!; } static Future load(Locale locale) { diff --git a/example/lib/main.dart b/example/lib/main.dart index 2c1a6b8..78eca53 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -33,20 +33,20 @@ class _MyAppState extends State { builder: (BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(S.of(context)!.locale), + title: Text(S.of(context).locale), ), body: Center( child: Column( children: [ - Text(S.of(context)!.locale), - Text(S.of(context)!.simpleMessage), - Text(S.of(context)!.messageWithParams('developer')), - Text(S.of(context)!.pluralMessage(1, 'KingWu')), - Text(S.of(context)!.pluralMessage(10, 'KingWu')), - Text(S.of(context)!.genderMessage('male', 'KingWu')), - Text(S.of(context)!.genderMessage('female', 'KingWu')), - Text(S.of(context)!.genderMessage('other', 'KingWu')), - Text(S.of(context)!.specialCharactersMessage) + Text(S.of(context).locale), + Text(S.of(context).simpleMessage), + Text(S.of(context).messageWithParams('developer')), + Text(S.of(context).pluralMessage(1, 'KingWu')), + Text(S.of(context).pluralMessage(10, 'KingWu')), + Text(S.of(context).genderMessage('male', 'KingWu')), + Text(S.of(context).genderMessage('female', 'KingWu')), + Text(S.of(context).genderMessage('other', 'KingWu')), + Text(S.of(context).specialCharactersMessage) ], ) ), diff --git a/lib/generate_i18n_dart.dart b/lib/generate_i18n_dart.dart index cf0db9a..5d9e874 100644 --- a/lib/generate_i18n_dart.dart +++ b/lib/generate_i18n_dart.dart @@ -15,8 +15,18 @@ class S { static const GeneratedLocalizationsDelegate delegate = GeneratedLocalizationsDelegate(); - static S? of(BuildContext context) { - return Localizations.of(context, S); + static S of(BuildContext context) { + final localization = Localizations.of(context, S); + + assert(() { + if (localization == null) { + throw FlutterError( + 'S requested with a context that does not include S.'); + } + return true; + }()); + + return localization!; } static Future load(Locale locale) { diff --git a/pubspec.yaml b/pubspec.yaml index 8d4d3bb..83fede5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: gen_lang description: >- gen_lang is a dart library for internationalization. Extracts messages to generate dart files required by Intl -version: 0.1.4-nullsafety.0 +version: 0.2.0-nullsafety.0 homepage: https://github.com/KingWu/gen_lang environment: