Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 35 additions & 32 deletions slang/bin/slang.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import 'package:slang/src/runner/migrate.dart';
import 'package:slang/src/runner/normalize.dart';
import 'package:slang/src/runner/stats.dart';
import 'package:slang/src/runner/utils/format.dart';
import 'package:slang/src/utils/log.dart' as log;
import 'package:watcher/watcher.dart';

/// Determines what the runner will do
Expand All @@ -42,7 +43,8 @@ enum RunnerMode {
/// This is usually faster than the build_runner implementation.
void main(List<String> arguments) async {
final RunnerMode mode;
final bool verbose;
log.Level logLevel = log.Level.normal;

if (arguments.isNotEmpty) {
if (const {'-h', '--help', 'help'}.contains(arguments[0])) {
printHelp();
Expand Down Expand Up @@ -87,29 +89,33 @@ void main(List<String> arguments) async {
mode = RunnerMode.generate;
}

verbose = mode == RunnerMode.generate ||
mode == RunnerMode.watch ||
(arguments.length == 2 &&
(arguments[1] == '-v' || arguments[1] == '--verbose'));
for (final arg in arguments) {
if (arg == '-v' || arg == '--verbose') {
logLevel = log.Level.verbose;
}
}
} else {
mode = RunnerMode.generate;
verbose = true;
}

log.setLevel(logLevel);

final verbose = logLevel == log.Level.verbose;

switch (mode) {
case RunnerMode.generate:
case RunnerMode.watch:
print('Generating translations...\n');
log.info('Generating translations...\n');
break;
case RunnerMode.configure:
print('Configuring...\n');
log.info('Configuring...\n');
break;
case RunnerMode.stats:
case RunnerMode.analyze:
print('Scanning translations...\n');
log.info('Scanning translations...\n');
break;
case RunnerMode.apply:
print('Applying translations...\n');
log.info('Applying translations...\n');
break;
case RunnerMode.migrate:
break;
Expand All @@ -118,13 +124,13 @@ void main(List<String> arguments) async {
case RunnerMode.outdated:
break;
case RunnerMode.add:
print('Adding translation...');
log.info('Adding translation...');
break;
case RunnerMode.clean:
print('Removing unused translations...\n');
log.info('Removing unused translations...\n');
break;
case RunnerMode.normalize:
print('Normalizing translations...\n');
log.info('Normalizing translations...\n');
break;
}

Expand Down Expand Up @@ -205,14 +211,14 @@ void main(List<String> arguments) async {
Future<void> watchTranslations(RawConfig config) async {
final inputDirectoryPath = config.inputDirectory;
if (inputDirectoryPath == null) {
print('Please set input_directory in build.yaml or slang.yaml.');
log.error('Please set input_directory in build.yaml or slang.yaml.');
return;
}

final inputDirectory = Directory(inputDirectoryPath);
final stream = Watcher(inputDirectoryPath).events;

print('Listening to changes in $inputDirectoryPath');
log.info('Listening to changes in $inputDirectoryPath');
_generateTranslationsFromWatch(
config: config,
inputDirectory: inputDirectory,
Expand Down Expand Up @@ -264,8 +270,7 @@ Future<void> _generateTranslationsFromWatch({
);
} catch (e) {
success = false;
print('');
print(e);
log.error('\n${e.toString()}');
_printDynamicLastLine(
'\r[$currentTime] $_RED#$counter Error ${stopwatch.elapsedSeconds}',
);
Expand Down Expand Up @@ -293,7 +298,7 @@ Future<void> generateTranslations({
List<String>? arguments,
}) async {
if (fileCollection.files.isEmpty) {
print('No translation file found.');
log.error('No translation file found.');
return;
}

Expand All @@ -302,8 +307,7 @@ Future<void> generateTranslations({

// STEP 2: scan translations
if (verbose) {
print('Scanning translations...');
print('');
log.verbose('Scanning translations...\n');
}

final translationMap = await TranslationMapBuilder.build(
Expand All @@ -317,8 +321,7 @@ Future<void> generateTranslations({
translationMap: translationMap,
).printResult();
if (stopwatch != null) {
print('');
print('Scan done. (${stopwatch.elapsed})');
log.info('\nScan done. (${stopwatch.elapsed})');
}
return; // skip generation
} else if (mode == RunnerMode.analyze) {
Expand All @@ -328,7 +331,7 @@ Future<void> generateTranslations({
arguments: arguments ?? [],
);
if (stopwatch != null) {
print('Analysis done. ${stopwatch.elapsedSeconds}');
log.info('Analysis done. ${stopwatch.elapsedSeconds}');
}
return; // skip generation
}
Expand Down Expand Up @@ -360,11 +363,10 @@ Future<void> generateTranslations({
}

if (verbose) {
print('');
print('Output:');
print(' -> $outputFilePath');
log.verbose('\nOutput:');
log.verbose(' -> $outputFilePath');
for (final locale in result.translations.keys) {
print(' -> ${BuildResultPaths.localePath(
log.verbose(' -> ${BuildResultPaths.localePath(
outputPath: outputFilePath,
locale: locale,
)}');
Expand All @@ -375,8 +377,7 @@ Future<void> generateTranslations({
final formatDir = PathUtils.getParentPath(outputFilePath)!;
Stopwatch? formatStopwatch;
if (verbose) {
print('');
print('Formatting "$formatDir" ...');
log.verbose('\nFormatting "$formatDir" ...');
if (stopwatch != null) {
formatStopwatch = Stopwatch()..start();
}
Expand All @@ -386,13 +387,15 @@ Future<void> generateTranslations({
width: fileCollection.config.format.width,
);
if (verbose && formatStopwatch != null) {
print('Format done. ${formatStopwatch.elapsedSeconds}');
log.verbose('Format done. ${formatStopwatch.elapsedSeconds}');
}
}

if (verbose && stopwatch != null) {
print('');
print(
log.verbose(
'\n${_GREEN}Translations generated successfully. ${stopwatch.elapsedSeconds}$_RESET');
} else if (stopwatch != null) {
log.info(
'${_GREEN}Translations generated successfully. ${stopwatch.elapsedSeconds}$_RESET');
}
}
Expand Down
4 changes: 3 additions & 1 deletion slang/lib/src/api/pluralization.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'package:slang/src/utils/log.dart' as log;

part 'plural_resolver_map.dart';

/// Selects the correct string depending on [n]
Expand Down Expand Up @@ -31,7 +33,7 @@ class PluralResolvers {
static _Resolvers _getResolvers(String language) {
final resolvers = _resolverMap[language];
if (resolvers == null) {
print(
log.error(
'Resolver for <lang = $language> not specified! Please configure it via LocaleSettings.setPluralResolver. A fallback is used now.');
return _defaultResolver;
}
Expand Down
15 changes: 8 additions & 7 deletions slang/lib/src/api/translation_overrides.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:slang/src/builder/model/pluralization.dart';
import 'package:slang/src/builder/utils/reflection_utils.dart';
import 'package:slang/src/builder/utils/regex_utils.dart';
import 'package:slang/src/builder/utils/string_interpolation_extensions.dart';
import 'package:slang/src/utils/log.dart' as log;

/// Utility class handling overridden translations
class TranslationOverrides {
Expand All @@ -18,7 +19,7 @@ class TranslationOverrides {
return null;
}
if (node is! StringTextNode) {
print(
log.error(
'Overridden $path is not a StringTextNode but a ${node.runtimeType}.');
return null;
}
Expand All @@ -32,7 +33,7 @@ class TranslationOverrides {
return null;
}
if (node is! PluralNode) {
print('Overridden $path is not a PluralNode but a ${node.runtimeType}.');
log.error('Overridden $path is not a PluralNode but a ${node.runtimeType}.');
return null;
}

Expand Down Expand Up @@ -66,7 +67,7 @@ class TranslationOverrides {
return null;
}
if (node is! ContextNode) {
print('Overridden $path is not a ContextNode but a ${node.runtimeType}.');
log.error('Overridden $path is not a ContextNode but a ${node.runtimeType}.');
return null;
}
final context = param[node.paramName];
Expand All @@ -85,11 +86,11 @@ class TranslationOverrides {
return null;
}
if (node is! ObjectNode) {
print('Overridden $path is not an ObjectNode but a ${node.runtimeType}.');
log.error('Overridden $path is not an ObjectNode but a ${node.runtimeType}.');
return null;
}
if (!node.isMap || node.genericType != 'String') {
print('Overridden $path can only be a map containing plain Strings.');
log.error('Overridden $path can only be a map containing plain Strings.');
return null;
}

Expand All @@ -105,11 +106,11 @@ class TranslationOverrides {
return null;
}
if (node is! ListNode) {
print('Overridden $path is not a ListNode but a ${node.runtimeType}.');
log.error('Overridden $path is not a ListNode but a ${node.runtimeType}.');
return null;
}
if (node.genericType != 'String') {
print('Overridden $path can only contain plain Strings.');
log.error('Overridden $path can only contain plain Strings.');
return null;
}

Expand Down
3 changes: 2 additions & 1 deletion slang/lib/src/builder/builder/raw_config_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:slang/src/builder/model/sanitization_config.dart';
import 'package:slang/src/builder/utils/map_utils.dart';
import 'package:slang/src/builder/utils/regex_utils.dart';
import 'package:slang/src/builder/utils/string_extensions.dart';
import 'package:slang/src/utils/log.dart' as log;
import 'package:yaml/yaml.dart';

class RawConfigBuilder {
Expand Down Expand Up @@ -51,7 +52,7 @@ class RawConfigBuilder {
/// Parses the config entry
static RawConfig fromMap(Map<String, dynamic> map) {
if (map['output_format'] != null) {
print(
log.error(
'The "output_format" key is no longer supported since slang v4. Always generates multiple files now.',
);
}
Expand Down
15 changes: 8 additions & 7 deletions slang/lib/src/builder/builder/slang_file_collection_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import 'package:slang/src/builder/model/raw_config.dart';
import 'package:slang/src/builder/model/slang_file_collection.dart';
import 'package:slang/src/builder/utils/path_utils.dart';
import 'package:slang/src/builder/utils/regex_utils.dart';
import 'package:slang/src/utils/log.dart' as log;

class SlangFileCollectionBuilder {
static SlangFileCollection readFromFileSystem({
Expand Down Expand Up @@ -212,7 +213,7 @@ RawConfig readConfigFromFileSystem({
config = RawConfigBuilder.fromYaml(content, true);
if (config != null) {
if (verbose) {
print('Found slang.yaml!');
log.verbose('Found slang.yaml!');
}
break;
}
Expand All @@ -223,7 +224,7 @@ RawConfig readConfigFromFileSystem({
config = RawConfigBuilder.fromYaml(content);
if (config != null) {
if (verbose) {
print('Found build.yaml!');
log.verbose('Found build.yaml!');
}
break;
}
Expand All @@ -234,15 +235,15 @@ RawConfig readConfigFromFileSystem({
if (config == null) {
config = RawConfigBuilder.fromMap({});
if (verbose) {
print('No build.yaml or slang.yaml, using default settings.');
log.verbose('No build.yaml or slang.yaml, using default settings.');
}
}

// show build config
if (verbose && !useDefaultConfig) {
print('');
log.verbose('');
config.printConfig();
print('');
log.verbose('');
}

config.validate();
Expand Down Expand Up @@ -300,7 +301,7 @@ void _namespaceDeprecationWarning({
required String fileName,
required String replacement,
}) {
print(
log.error(
'DEPRECATED(v4.3.0): Do not use namespaces in file names when namespaces are disabled: "$fileName" -> "$replacement"',
);
}
Expand All @@ -309,7 +310,7 @@ void _baseLocaleDeprecationWarning({
required String fileName,
required String replacement,
}) {
print(
log.error(
'DEPRECATED(v4.3.0): Always specify locale: "$fileName" -> "$replacement"',
);
}
9 changes: 5 additions & 4 deletions slang/lib/src/builder/builder/translation_map_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:slang/src/builder/model/enums.dart';
import 'package:slang/src/builder/model/i18n_locale.dart';
import 'package:slang/src/builder/model/slang_file_collection.dart';
import 'package:slang/src/builder/model/translation_map.dart';
import 'package:slang/src/utils/log.dart' as log;

class TranslationMapBuilder {
/// This method transforms files to an intermediate model [TranslationMap].
Expand Down Expand Up @@ -34,7 +35,7 @@ class TranslationMapBuilder {
BaseDecoder.decodeWithFileType(rawConfig.fileType, content);
} on FormatException catch (e) {
if (verbose) {
print('');
log.verbose('');
}
throw 'File: ${file.path}\n$e';
}
Expand All @@ -58,7 +59,7 @@ class TranslationMapBuilder {
final baseStr = locale == rawConfig.baseLocale ? '(base) ' : '';
final namespaceStr =
rawConfig.namespaces ? '(${file.namespace}) ' : '';
print(
log.verbose(
'${('$baseStr$namespaceStr${locale.languageTag}').padLeft(padLeft)} -> ${file.path}');
}
}
Expand All @@ -75,7 +76,7 @@ class TranslationMapBuilder {
final baseLog = file.locale == rawConfig.baseLocale ? '(base) ' : '';
final namespaceLog =
rawConfig.namespaces ? '(${file.namespace}) ' : '';
print(
log.verbose(
'${'$baseLog$namespaceLog${file.locale.languageTag}'.padLeft(padLeft)} -> ${file.path}');
}
}
Expand All @@ -85,7 +86,7 @@ class TranslationMapBuilder {
.getLocales()
.every((locale) => locale != rawConfig.baseLocale)) {
if (verbose) {
print('');
log.verbose('');
}
throw 'Translation file for base locale "${rawConfig.baseLocale.languageTag}" not found.';
}
Expand Down
Loading
Loading