-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
a2d251a
commit 41d1097
Showing
79 changed files
with
2,324 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | ||
} |
Oops, something went wrong.