Skip to content

Commit

Permalink
Merge 20bc8d8 into 53251f2
Browse files Browse the repository at this point in the history
  • Loading branch information
NicolaVerbeeck committed Mar 30, 2021
2 parents 53251f2 + 20bc8d8 commit eb5c7eb
Show file tree
Hide file tree
Showing 11 changed files with 209 additions and 23 deletions.
4 changes: 3 additions & 1 deletion .fvm/fvm_config.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"flutterSdkVersion":"stable"}
{
"flutterSdkVersion": "stable"
}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ locale_gen:
languages: ['en', 'nl']
locale_assets_path: 'assets/locale/' #This is the location where your json files should be saved.
assets_path: 'assets/locale/' #This is the location where your json files are located in your flutter app.
nullsafety: true #Generate nullsafety compatible code. Defaults to false
doc_languages: ['en'] #Only generate docs for the given languages. Defaults to all languages. An empty list will skip doc generation
```

### Run package with Flutter
Expand Down
4 changes: 3 additions & 1 deletion example/.fvm/fvm_config.json
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
{"flutterSdkVersion":"stable"}
{
"flutterSdkVersion": "stable"
}
1 change: 0 additions & 1 deletion example/analysis_options.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ analyzer:
sdk_version_async_exported_from_core: ignore
exclude:
- '**.g.dart'
- 'lib/util/locale/**'

linter:
rules:
Expand Down
3 changes: 2 additions & 1 deletion example/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,5 @@ flutter:
locale_gen:
languages: ['en','nl']
# locale_assets_path: 'assets/localization'
# assets_path: 'assets/localization'
# assets_path: 'assets/localization'
# doc_languages: ['en']
21 changes: 20 additions & 1 deletion lib/src/locale_gen_params.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,20 @@ class LocaleGenParams {
late String projectName;
late String defaultLanguage;
late List<String> languages;
late List<String> docLanguages;

LocaleGenParams(this.programName) {
factory LocaleGenParams(String programName) {
final pubspecYaml = File(join(Directory.current.path, 'pubspec.yaml'));
if (!pubspecYaml.existsSync()) {
throw Exception(
'This program should be run from the root of a flutter/dart project');
}

final pubspecContent = pubspecYaml.readAsStringSync();
return LocaleGenParams.fromYamlString(programName, pubspecContent);
}

LocaleGenParams.fromYamlString(this.programName, String pubspecContent) {
final doc = loadYaml(pubspecContent);
final projectName = doc['name'];

Expand All @@ -40,6 +44,7 @@ class LocaleGenParams {
if (config == null) {
languages = ['en'];
defaultLanguage = 'en';
docLanguages = languages;
return;
}
configure(config);
Expand All @@ -63,6 +68,12 @@ class LocaleGenParams {
" languages: ['en']");
}

final YamlList? docLanguageList = config['doc_languages'];
List<String>? docLanguages;
if (docLanguageList != null) {
docLanguages = docLanguageList.map((item) => item.toString()).toList();
}

var defaultLanguage = config['default_language'];
if (defaultLanguage == null) {
if (languages.contains('en')) {
Expand Down Expand Up @@ -93,5 +104,13 @@ class LocaleGenParams {
this.assetsDir = assetsDir;
this.languages = languages;
this.defaultLanguage = defaultLanguage;
this.docLanguages = docLanguages ?? languages;

final different =
this.docLanguages.where((language) => !languages.contains(language));
if (different.isNotEmpty) {
throw Exception(
'$different is defined in doc_languages but they are not found in the supported languages');
}
}
}
6 changes: 4 additions & 2 deletions lib/src/locale_gen_writer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ class LocaleGenWriter {
..writeln('class LocalizationKeys {')
..writeln();
defaultTranslations.forEach((key, value) {
TranslationWriter.buildDocumentation(sb, key, allTranslations);
TranslationWriter.buildDocumentation(
sb, key, allTranslations, params.docLanguages);
final correctKey = CaseUtil.getCamelcase(key);
sb..writeln(' static const $correctKey = \'$key\';')..writeln();
});
Expand Down Expand Up @@ -138,7 +139,8 @@ class LocaleGenWriter {
..writeln(' }')
..writeln();
defaultTranslations.forEach((key, value) {
TranslationWriter.buildDocumentation(sb, key, allTranslations);
TranslationWriter.buildDocumentation(
sb, key, allTranslations, params.docLanguages);
TranslationWriter.buildTranslationFunction(sb, key, value);
});
sb
Expand Down
28 changes: 18 additions & 10 deletions lib/src/translation_writer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -80,17 +80,25 @@ class TranslationWriter {
..writeln();
}

static void buildDocumentation(StringBuffer sb, String key,
Map<String, Map<String, dynamic>> translations) {
static void buildDocumentation(
StringBuffer sb,
String key,
Map<String, Map<String, dynamic>> translations,
List<String> includedLanguages) {
if (includedLanguages.isEmpty) return;

sb.writeln(' /// Translations:');
translations.forEach((language, values) {
final langugeFormatted = '$language:'.padRight(4, ' ');
final value = values[key];
sb.writeln(' ///');
if (value == null) {
sb.writeln(" /// $langugeFormatted **''**");
} else {
sb.writeln(" /// $langugeFormatted **'$value'**");
includedLanguages.forEach((language) {
final values = translations[language];
if (values != null) {
final languageFormatted = '$language:'.padRight(4, ' ');
final value = values[key];
sb.writeln(' ///');
if (value == null) {
sb.writeln(" /// $languageFormatted **''**");
} else {
sb.writeln(" /// $languageFormatted **'$value'**");
}
}
});
}
Expand Down
3 changes: 1 addition & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,4 @@ dependencies:
yaml: ^3.1.0

dev_dependencies:
flutter_test:
sdk: flutter
test: ^1.16.8
110 changes: 110 additions & 0 deletions test/locale_gen_params_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import 'package:locale_gen/locale_gen.dart';
import 'package:test/test.dart';

void main() {
group('Parse parameters', () {
group('Test invalid spec', () {
test('Test invalid project name', () {
expect(() => LocaleGenParams.fromYamlString('locale_gen', 'abc: 123'),
throwsException);
});
test('Test missing languages', () {
expect(
() => LocaleGenParams.fromYamlString(
'locale_gen', 'name: test\n\nlocale_gen:\n abc: 123'),
throwsException);
});
test('Test empty languages', () {
expect(
() => LocaleGenParams.fromYamlString(
'locale_gen', 'name: test\n\nlocale_gen:\n languages: []'),
throwsException);
});
test('Test default language not found', () {
expect(
() => LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'de\']\n default_language: \'fr\''),
throwsException);
});
test('Test doc language not found', () {
expect(
() => LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'de\']\n doc_languages: [\'fr\']'),
throwsException);
});
});

group('Test valid spec', () {
test('Test project name', () {
expect(
LocaleGenParams.fromYamlString('locale_gen', 'name: test')
.projectName,
'test');
});
test('Test languages', () {
expect(
LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'en\',\'fr\']')
.languages,
['en', 'fr']);
});
test('Test default language en', () {
expect(
LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'en\',\'fr\']')
.defaultLanguage,
'en');
});
test('Test default language set', () {
expect(
LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'en\',\'fr\']\n default_language: \'fr\'')
.defaultLanguage,
'fr');
});
test('Test default asset path', () {
expect(
LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'en\',\'fr\']\n default_language: \'fr\'')
.assetsDir,
'assets/locale/');
expect(
LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'en\',\'fr\']\n default_language: \'fr\'')
.localeAssetsDir,
'assets/locale/');
});
test('Test set asset path', () {
expect(
LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'en\',\'fr\']\n assets_path: \'assets/mylocale\'')
.assetsDir,
'assets/mylocale/');
expect(
LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'en\',\'fr\']\n locale_assets_path: \'assets/mylocale\'')
.localeAssetsDir,
'assets/mylocale/');
});
test('Test default doc languages', () {
expect(
LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'en\',\'fr\']')
.docLanguages,
['en', 'fr']);
});
test('Test set doc languages', () {
expect(
LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'en\',\'fr\']\n doc_languages: [\'en\']')
.docLanguages,
['en']);
expect(
LocaleGenParams.fromYamlString('locale_gen',
'name: test\n\nlocale_gen:\n languages: [\'en\',\'fr\']\n doc_languages: []')
.docLanguages,
[]);
});
});
});
}
50 changes: 47 additions & 3 deletions test/translation_writer_test.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:locale_gen/src/translation_writer.dart';
import 'package:test/test.dart';

void main() {
group('buildTranslationFunction', () {
Expand Down Expand Up @@ -181,24 +181,68 @@ void main() {
group('Tests without languages', () {
test('Test null translations', () {
final sb = StringBuffer();
TranslationWriter.buildDocumentation(sb, 'app_title', {});
TranslationWriter.buildDocumentation(sb, 'app_title', {}, ['en']);
expect(sb.toString(), equals(''' /// Translations:
'''));
});
test('Test without doc languages', () {
final sb = StringBuffer();
TranslationWriter.buildDocumentation(sb, 'app_title', {}, []);
expect(sb.toString().length, 0);
});
test('Test with translations', () {
final sb = StringBuffer();
TranslationWriter.buildDocumentation(sb, 'app_title', {
'nl': {'app_title': 'Hallo'},
'en': {'app_title': 'Hello'},
'fr': {'app_title': 'Bonjour'},
});
}, [
'nl',
'en',
'fr'
]);
expect(sb.toString(), equals(''' /// Translations:
///
/// nl: **'Hallo'**
///
/// en: **'Hello'**
///
/// fr: **'Bonjour'**
'''));
});
test('Test with translations sub-set', () {
final sb = StringBuffer();
TranslationWriter.buildDocumentation(sb, 'app_title', {
'nl': {'app_title': 'Hallo'},
'en': {'app_title': 'Hello'},
'fr': {'app_title': 'Bonjour'},
}, [
'en',
'fr'
]);
expect(sb.toString(), equals(''' /// Translations:
///
/// en: **'Hello'**
///
/// fr: **'Bonjour'**
'''));
});
test('Test with translations sub-set unknown', () {
final sb = StringBuffer();
TranslationWriter.buildDocumentation(sb, 'app_title', {
'nl': {'app_title': 'Hallo'},
'en': {'app_title': 'Hello'},
'fr': {'app_title': 'Bonjour'},
}, [
'en',
'fr',
'de'
]);
expect(sb.toString(), equals(''' /// Translations:
///
/// en: **'Hello'**
///
/// fr: **'Bonjour'**
'''));
});
});
Expand Down

0 comments on commit eb5c7eb

Please sign in to comment.