Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
vanlooverenkoen committed Jun 12, 2019
1 parent a2d251a commit 41d1097
Show file tree
Hide file tree
Showing 79 changed files with 2,324 additions and 0 deletions.
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.buildlog
.dart_tool/
.DS_Store
.idea
.pub/
.settings/
*.iml
**/build
**/packages
**/pubspec.lock
**/.packages
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Changelog

## [0.0.2] - 2019-02-12
### Added
-Updated README.md

## [0.0.1] - 2019-02-12
### Added
-Initial release
62 changes: 62 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# flutter locale gen

Dart tool that will convert your default locale json to dart code.

[![pub package](https://img.shields.io/pub/v/locale_gen.svg)](https://pub.dartlang.org/packages/locale_gen)

This repo contains an example how to use this package.

Packages used:
- flutter_localizations
- provider
- kiwi
- locale_gen

## Example

<img src="https://github.com/vanlooverenkoen/locale_gen/blob/master/assets/example.gif?raw=true" alt="Example" width="300"/>

## Setup

### Add dependency to pubspec

[![pub package](https://img.shields.io/pub/v/locale_gen.svg)](https://pub.dartlang.org/packages/locale_gen)
```
dev-dependencies:
locale_gen: <latest-version>
```

### Add config to pubspec

Add your locale folder to the assets to make use all your translations are loaded.
```
flutter:
assets:
- assets/locale/
```

Add the local_gen config to generate your dart code from json files
```
locale_gen:
default_language: 'nl'
languages: ['en', 'nl']
```

if nothing is configured the following config will be used:
```
locale_gen:
default_language: 'en'
languages: ['en']
```

### Run package with Flutter

```
flutter packages pub run locale_gen
```

### Run package with Dart

```
pub run locale_gen
```
129 changes: 129 additions & 0 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
analyzer:
errors:
missing_required_param: error
missing_return: error
todo: ignore
sdk_version_async_exported_from_core: ignore
exclude:
- '**.g.dart'

linter:
rules:
- always_put_required_named_parameters_first
- always_require_non_null_named_parameters
- annotate_overrides
- avoid_annotating_with_dynamic
- avoid_as
- avoid_bool_literals_in_conditional_expressions
- avoid_catching_errors
- avoid_double_and_int_checks
- avoid_empty_else
- avoid_field_initializers_in_const_classes
- avoid_implementing_value_types
- avoid_init_to_null
- avoid_js_rounded_ints
- avoid_null_checks_in_equality_operators
- avoid_positional_boolean_parameters
- avoid_private_typedef_functions
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
- avoid_returning_null
- avoid_returning_null_for_future
- avoid_returning_null_for_void
- avoid_returning_this
- avoid_setters_without_getters
- avoid_shadowing_type_parameters
- avoid_single_cascade_in_expression_statements
- avoid_slow_async_io
- avoid_types_as_parameter_names
- avoid_types_on_closure_parameters
- avoid_unused_constructor_parameters
- avoid_void_async
- await_only_futures
- camel_case_types
- cancel_subscriptions
- cascade_invocations
- close_sinks
- comment_references
- control_flow_in_finally
- curly_braces_in_flow_control_structures
- directives_ordering
- empty_catches
- empty_constructor_bodies
- empty_statements
- file_names
- hash_and_equals
- implementation_imports
- invariant_booleans
- iterable_contains_unrelated_type
- join_return_with_assignment
- library_names
- library_prefixes
- list_remove_unrelated_type
- literal_only_boolean_expressions
- no_adjacent_strings_in_list
- no_duplicate_case_values
- non_constant_identifier_names
- null_closures
- omit_local_variable_types
- one_member_abstracts
- only_throw_errors
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
- parameter_assignments
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
- prefer_conditional_assignment
- prefer_const_constructors
- prefer_const_constructors_in_immutables
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
- prefer_constructors_over_static_methods
- prefer_contains
- prefer_equal_for_default_values
- prefer_final_fields
- prefer_final_in_for_each
- prefer_final_locals
- prefer_foreach
- prefer_function_declarations_over_variables
- prefer_generic_function_type_aliases
- prefer_initializing_formals
- prefer_int_literals
- prefer_interpolation_to_compose_strings
- prefer_is_empty
- prefer_is_not_empty
- prefer_iterable_whereType
- prefer_null_aware_operators
- prefer_single_quotes
- prefer_typing_uninitialized_variables
- prefer_void_to_null
- recursive_getters
- slash_for_doc_comments
- sort_pub_dependencies
- test_types_in_equals
- throw_in_finally
- type_init_formals
- unawaited_futures
- unnecessary_await_in_return
- unnecessary_brace_in_string_interps
- unnecessary_const
- unnecessary_getters_setters
- unnecessary_lambdas
- unnecessary_new
- unnecessary_null_aware_assignments
- unnecessary_null_in_if_null_operators
- unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_statements
- unnecessary_this
- unrelated_type_equality_checks
- use_full_hex_values_for_flutter_colors
- use_rethrow_when_possible
- use_setters_to_change_properties
- use_string_buffers
- use_to_and_as_if_applicable
- valid_regexps
- void_checks
Binary file added assets/example.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
140 changes: 140 additions & 0 deletions bin/locale_gen.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:path/path.dart';

import 'src/case_util.dart';
import 'src/params.dart';

final outputDir = join('lib', 'util', 'locale');
final assetsDir = join('assets', 'locale');

Params params;

Future<void> main(List<String> args) async {
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');

await parsePubspec(pubspecYaml);

final defaultLocaleJson = File(join(Directory.current.path, assetsDir, '${params.defaultLanguage}.json'));
if (!defaultLocaleJson.existsSync()) {
throw Exception('${defaultLocaleJson.path} does not exists');
}

createLocalizationFile(defaultLocaleJson);
createLocalizationDelegateFile();
print('Done!!!');
}

Future<void> parsePubspec(File pubspecYaml) async {
final pubspecContent = pubspecYaml.readAsStringSync();
params = Params(pubspecContent);
print('Default language: ${params.defaultLanguage}');
print('Supported languages: ${params.languages}');
}

void createLocalizationFile(File defaultLocaleJson) {
print('Creating localization.dart ...');
final sb = StringBuffer()
..writeln("import 'dart:convert';")
..writeln()
..writeln("import 'package:flutter/services.dart';")
..writeln("import 'package:flutter/widgets.dart';")
..writeln()
..writeln('//============================================================//')
..writeln('//THIS FILE IS AUTO GENERATED. DO NOT EDIT//')
..writeln('//============================================================//')
..writeln('class Localization {')
..writeln(' Map<dynamic, dynamic> _localisedValues;')
..writeln()
..writeln(' static Localization of(BuildContext context) => Localizations.of<Localization>(context, Localization);')
..writeln(' ')
..writeln(' static Future<Localization> load(Locale locale) async {')
..writeln(' final localizations = Localization();')
..writeln(" print('Switching to \${locale.languageCode}');")
..writeln(" final jsonContent = await rootBundle.loadString('assets/locale/\${locale.languageCode}.json');")
..writeln(' final Map<String, dynamic> values = json.decode(jsonContent);')
..writeln(' localizations._localisedValues = values;')
..writeln(' return localizations;')
..writeln(' }')
..writeln()
..writeln(' String _t(String key) {')
..writeln(' try {')
..writeln(' final value = _localisedValues[key];')
..writeln(" if (value == null) return '⚠\$key⚠';")
..writeln(' return value;')
..writeln(' } catch (e) {')
..writeln(" return '⚠\$key⚠';")
..writeln(' }')
..writeln(' }')
..writeln();
final content = defaultLocaleJson.readAsStringSync();
final translations = json.decode(content);
translations.forEach((key, value) => sb..writeln(" String get ${CaseUtil.getCamelcase(key)} => _t('$key');")..writeln());
sb.writeln('}');

// Write to file
final localizationFile = File(join(Directory.current.path, outputDir, 'localization.dart'));
if (!localizationFile.existsSync()) {
print('localization.dart does not exists');
print('Creating localization.dart ...');
localizationFile.createSync(recursive: true);
}
localizationFile.writeAsStringSync(sb.toString());
}

void createLocalizationDelegateFile() {
print('Creating localization_delegate.dart ...');

final sb = StringBuffer()
..writeln("import 'dart:async';")
..writeln()
..writeln("import 'package:${params.projectName}/util/locale/localization.dart';")
..writeln("import 'package:flutter/material.dart';")
..writeln()
..writeln('//============================================================//')
..writeln('//THIS FILE IS AUTO GENERATED. DO NOT EDIT//')
..writeln('//============================================================//')
..writeln('class LocalizationDelegate extends LocalizationsDelegate<Localization> {')
..writeln(" static const defaultLocale = Locale('${params.defaultLanguage}');")
..writeln(' static const supportedLanguages = [');
params.languages.forEach((language) => sb.writeln(" '$language',"));
sb..writeln(' ];')..writeln()..writeln(' static const supportedLocales = [');
params.languages.forEach((language) => sb.writeln(" Locale('$language'),"));
sb
..writeln(' ];')
..writeln()
..writeln(' Locale newLocale;')
..writeln(' Locale activeLocale;')
..writeln()
..writeln(' LocalizationDelegate({this.newLocale}) {')
..writeln(' if (newLocale != null) {')
..writeln(' activeLocale = newLocale;')
..writeln(' }')
..writeln(' }')
..writeln()
..writeln(' @override')
..writeln(' bool isSupported(Locale locale) => supportedLanguages.contains(locale.languageCode);')
..writeln()
..writeln(' @override')
..writeln(' Future<Localization> load(Locale locale) async {')
..writeln(' activeLocale = newLocale ?? locale;')
..writeln(' return Localization.load(activeLocale);')
..writeln(' }')
..writeln()
..writeln(' @override')
..writeln(' bool shouldReload(LocalizationsDelegate<Localization> old) => true;')
..writeln()
..writeln('}');

// Write to file
final localizationDelegateFile = File(join(Directory.current.path, outputDir, 'localization_delegate.dart'));
if (!localizationDelegateFile.existsSync()) {
print('localization_delegate.dart does not exists');
print('Creating localization_delegate.dart ...');
localizationDelegateFile.createSync(recursive: true);
}
localizationDelegateFile.writeAsStringSync(sb.toString());
}
Loading

0 comments on commit 41d1097

Please sign in to comment.