Skip to content

Commit

Permalink
feat: add "base_locale_empty_string" config
Browse files Browse the repository at this point in the history
  • Loading branch information
Tienisto committed Dec 21, 2023
1 parent 20c738a commit db54b4b
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 12 deletions.
3 changes: 2 additions & 1 deletion slang/lib/builder/builder/generate_config_builder.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:slang/builder/builder/build_model_config_builder.dart';
import 'package:slang/builder/model/context_type.dart';
import 'package:slang/builder/model/enums.dart';
import 'package:slang/builder/model/raw_config.dart';
import 'package:slang/builder/model/generate_config.dart';
import 'package:slang/builder/model/interface.dart';
Expand All @@ -17,7 +18,7 @@ class GenerateConfigBuilder {
inputDirectoryHint: inputDirectoryHint,
baseName: baseName,
baseLocale: config.baseLocale,
fallbackStrategy: config.fallbackStrategy,
fallbackStrategy: config.fallbackStrategy.toGenerateFallbackStrategy(),
outputFormat: config.outputFormat,
localeHandling: config.localeHandling,
flutterIntegration: config.flutterIntegration,
Expand Down
8 changes: 8 additions & 0 deletions slang/lib/builder/builder/translation_model_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,13 @@ Map<String, Node> _parseMapNode({
if (value is String || value is num) {
// leaf
// key: 'value'

if (config.fallbackStrategy == FallbackStrategy.baseLocaleEmptyString &&
value is String &&
value.isEmpty) {
return;
}

final textNode = modifiers.containsKey(NodeModifiers.rich)
? RichTextNode(
path: currPath,
Expand Down Expand Up @@ -315,6 +322,7 @@ Map<String, Node> _parseMapNode({
case FallbackStrategy.none:
throw '"$currPath" in <$localeDebug> is empty but it is marked for pluralization / context. Define "fallback_strategy: base_locale" to ignore this node.';
case FallbackStrategy.baseLocale:
case FallbackStrategy.baseLocaleEmptyString:
return;
}
}
Expand Down
19 changes: 10 additions & 9 deletions slang/lib/builder/generator/generate_translations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ void _generateClass(
parentName: className,
locale: config.baseLocale,
);
if (config.fallbackStrategy == FallbackStrategy.none) {
if (config.fallbackStrategy == GenerateFallbackStrategy.none) {
buffer.writeln(
'class $finalClassName$mixinStr implements $baseClassName {');
} else {
Expand All @@ -129,7 +129,7 @@ void _generateClass(

// constructor and custom fields
final callSuperConstructor = !localeData.base &&
config.fallbackStrategy == FallbackStrategy.baseLocale;
config.fallbackStrategy == GenerateFallbackStrategy.baseLocale;
if (root) {
if (localeData.base && config.flutterIntegration && config.localeHandling) {
buffer.writeln(
Expand Down Expand Up @@ -218,7 +218,7 @@ void _generateClass(
buffer.write(
'dynamic operator[](String key) => \$meta.getTranslation(key)');

if (config.fallbackStrategy == FallbackStrategy.baseLocale &&
if (config.fallbackStrategy == GenerateFallbackStrategy.baseLocale &&
!localeData.base) {
buffer.writeln(' ?? super.\$meta.getTranslation(key);');
} else {
Expand Down Expand Up @@ -277,12 +277,13 @@ void _generateClass(
// even if this attribute exist, it has to satisfy the same signature as
// specified in the interface
// this error seems to occur when using in combination with "extends"
final optional = config.fallbackStrategy == FallbackStrategy.baseLocale &&
node.interface?.attributes.any((attribute) =>
attribute.optional && attribute.attributeName == key) ==
true
? '?'
: '';
final optional =
config.fallbackStrategy == GenerateFallbackStrategy.baseLocale &&
node.interface?.attributes.any((attribute) =>
attribute.optional && attribute.attributeName == key) ==
true
? '?'
: '';

if (value is StringTextNode) {
final translationOverrides = config.translationOverrides
Expand Down
21 changes: 20 additions & 1 deletion slang/lib/builder/model/enums.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
enum FileType { json, yaml, csv, arb }

enum FallbackStrategy { none, baseLocale }
enum FallbackStrategy { none, baseLocale, baseLocaleEmptyString }

/// Similar to [FallbackStrategy] but [FallbackStrategy.baseLocaleEmptyString]
/// has been already handled in the previous step.
enum GenerateFallbackStrategy { none, baseLocale }

enum OutputFormat { singleFile, multipleFiles }

Expand All @@ -19,6 +23,8 @@ extension Parser on String {
return FallbackStrategy.none;
case 'base_locale':
return FallbackStrategy.baseLocale;
case 'base_locale_empty_string':
return FallbackStrategy.baseLocaleEmptyString;
default:
return null;
}
Expand Down Expand Up @@ -85,3 +91,16 @@ extension Parser on String {
}
}
}

extension FallbackStrategyExt on FallbackStrategy {
GenerateFallbackStrategy toGenerateFallbackStrategy() {
switch (this) {
case FallbackStrategy.none:
return GenerateFallbackStrategy.none;
case FallbackStrategy.baseLocale:
return GenerateFallbackStrategy.baseLocale;
case FallbackStrategy.baseLocaleEmptyString:
return GenerateFallbackStrategy.baseLocale;
}
}
}
2 changes: 1 addition & 1 deletion slang/lib/builder/model/generate_config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class GenerateConfig {
final String inputDirectoryHint; // for comment
final String baseName; // name of all i18n files, like strings or messages
final I18nLocale baseLocale; // defaults to 'en'
final FallbackStrategy fallbackStrategy;
final GenerateFallbackStrategy fallbackStrategy;
final OutputFormat outputFormat;
final bool localeHandling;
final bool flutterIntegration;
Expand Down

0 comments on commit db54b4b

Please sign in to comment.