X Tutup
Skip to content

Commit 8430927

Browse files
committed
feat(i18n): update transformers to read a xmb file when provided and use I18nHtmlParser in this case
Closes #7790
1 parent d2ca7d8 commit 8430927

File tree

6 files changed

+77
-6
lines changed

6 files changed

+77
-6
lines changed

modules_dart/transform/lib/src/transform/common/ng_compiler.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,20 @@ import 'package:angular2/src/core/change_detection/interfaces.dart';
1414
import 'package:angular2/src/compiler/change_detector_compiler.dart';
1515
import 'package:angular2/router/router_link_dsl.dart';
1616
import 'package:angular2/src/compiler/proto_view_compiler.dart';
17+
import 'package:angular2/i18n.dart';
1718

1819
import 'xhr_impl.dart';
1920
import 'url_resolver.dart';
2021

2122
TemplateCompiler createTemplateCompiler(AssetReader reader,
22-
{ChangeDetectorGenConfig changeDetectionConfig}) {
23+
{ChangeDetectorGenConfig changeDetectionConfig, XmbDeserializationResult translations}) {
2324
var _xhr = new XhrImpl(reader);
24-
var _htmlParser = new HtmlParser();
2525
var _urlResolver = const TransformerUrlResolver();
2626

2727
// TODO(yjbanov): add router AST transformer when ready
2828
var parser = new ng.Parser(new ng.Lexer());
29+
var _htmlParser = _createHtmlParser(translations, parser);
30+
2931
var templateParser = new TemplateParser(
3032
parser,
3133
new DomElementSchemaRegistry(),
@@ -47,3 +49,11 @@ TemplateCompiler createTemplateCompiler(AssetReader reader,
4749
null /* ResolvedMetadataCache */,
4850
changeDetectionConfig);
4951
}
52+
53+
HtmlParser _createHtmlParser(XmbDeserializationResult translations, ng.Parser parser) {
54+
if (translations != null) {
55+
return new I18nHtmlParser(new HtmlParser(), parser, translations.content, translations.messages);
56+
} else {
57+
return new HtmlParser();
58+
}
59+
}

modules_dart/transform/lib/src/transform/common/options.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:glob/glob.dart';
44

55
import 'annotation_matcher.dart';
66
import 'mirror_mode.dart';
7+
import 'package:barback/src/asset/asset_id.dart';
78

89
const CUSTOM_ANNOTATIONS_PARAM = 'custom_annotations';
910
const ENTRY_POINT_PARAM = 'entry_points';
@@ -16,6 +17,7 @@ const INIT_REFLECTOR_PARAM = 'init_reflector';
1617
const INLINE_VIEWS_PARAM = 'inline_views';
1718
const MIRROR_MODE_PARAM = 'mirror_mode';
1819
const LAZY_TRANSFORMERS = 'lazy_transformers';
20+
const TRANSLATIONS = 'translations';
1921

2022
/// Provides information necessary to transform an Angular2 app.
2123
class TransformerOptions {
@@ -88,6 +90,9 @@ class TransformerOptions {
8890
/// change.
8991
final bool genCompiledTemplates;
9092

93+
/// The path to the file with translations.
94+
final AssetId translations;
95+
9196
TransformerOptions._internal(
9297
this.entryPoints,
9398
this.entryPointGlobs,
@@ -103,6 +108,7 @@ class TransformerOptions {
103108
this.platformDirectives,
104109
this.platformPipes,
105110
this.resolvedIdentifiers,
111+
this.translations,
106112
this.reflectPropertiesAsAttributes});
107113

108114
factory TransformerOptions(List<String> entryPoints,
@@ -118,6 +124,7 @@ class TransformerOptions {
118124
List<String> platformPipes,
119125
Map<String, String> resolvedIdentifiers,
120126
bool lazyTransformers: false,
127+
AssetId translations: null,
121128
bool formatCode: false}) {
122129
var annotationMatcher = new AnnotationMatcher()
123130
..addAll(customAnnotationDescriptors);
@@ -134,6 +141,7 @@ class TransformerOptions {
134141
resolvedIdentifiers: resolvedIdentifiers,
135142
inlineViews: inlineViews,
136143
lazyTransformers: lazyTransformers,
144+
translations: translations,
137145
formatCode: formatCode);
138146
}
139147
}

modules_dart/transform/lib/src/transform/common/options_reader.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:barback/barback.dart';
44
import 'annotation_matcher.dart';
55
import 'mirror_mode.dart';
66
import 'options.dart';
7+
import './url_resolver.dart';
78

89
TransformerOptions parseBarbackSettings(BarbackSettings settings) {
910
var config = settings.configuration;
@@ -43,6 +44,7 @@ import 'options.dart';
4344
inlineViews: _readBool(config, INLINE_VIEWS_PARAM, defaultValue: false),
4445
lazyTransformers:
4546
_readBool(config, LAZY_TRANSFORMERS, defaultValue: false),
47+
translations: _readAssetId(config, TRANSLATIONS),
4648
formatCode: formatCode);
4749
}
4850

@@ -52,6 +54,14 @@ bool _readBool(Map config, String paramName, {bool defaultValue}) {
5254
: defaultValue;
5355
}
5456

57+
AssetId _readAssetId(Map config, String paramName) {
58+
if (config.containsKey(paramName)) {
59+
return fromUri(config[paramName]);
60+
} else {
61+
return null;
62+
}
63+
}
64+
5565
/// Cribbed from the polymer project.
5666
/// {@link https://github.com/dart-lang/polymer-dart}
5767
List<String> _readStringList(Map config, String paramName) {

modules_dart/transform/lib/src/transform/template_compiler/generator.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'package:angular2/src/transform/common/model/ng_deps_model.pb.dart';
1515
import 'package:angular2/src/transform/common/names.dart';
1616
import 'package:angular2/src/transform/common/ng_compiler.dart';
1717
import 'package:angular2/src/transform/common/zone.dart' as zone;
18+
import 'package:angular2/i18n.dart';
1819

1920
import 'reflection/processor.dart' as reg;
2021
import 'reflection/reflection_capabilities.dart';
@@ -39,6 +40,7 @@ Future<Outputs> processTemplates(AssetReader reader, AssetId assetId,
3940
bool reflectPropertiesAsAttributes: false,
4041
List<String> platformDirectives,
4142
List<String> platformPipes,
43+
XmbDeserializationResult translations,
4244
Map<String, String> resolvedIdentifiers
4345
}) async {
4446
var viewDefResults = await createCompileData(
@@ -61,7 +63,9 @@ Future<Outputs> processTemplates(AssetReader reader, AssetId assetId,
6163
if (templateCompiler == null) {
6264
templateCompiler = createTemplateCompiler(reader,
6365
changeDetectionConfig: new ChangeDetectorGenConfig(
64-
genChangeDetectionDebugInfo, reflectPropertiesAsAttributes, false));
66+
genChangeDetectionDebugInfo, reflectPropertiesAsAttributes, false),
67+
translations: translations
68+
);
6569
}
6670

6771
final compileData =

modules_dart/transform/lib/src/transform/template_compiler/transformer.dart

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import 'package:angular2/src/transform/common/code/source_module.dart';
1111
import 'package:angular2/src/transform/common/formatter.dart';
1212
import 'package:angular2/src/transform/common/names.dart';
1313
import 'package:angular2/src/transform/common/options.dart';
14+
import 'package:angular2/src/transform/common/logging.dart';
1415
import 'package:angular2/src/transform/common/zone.dart' as zone;
16+
import 'package:angular2/i18n.dart';
1517

1618
import 'generator.dart';
1719

@@ -26,6 +28,7 @@ import 'generator.dart';
2628
/// See `angular2/src/transform/transformer.dart` for transformer ordering.
2729
class TemplateCompiler extends Transformer implements LazyTransformer {
2830
final TransformerOptions options;
31+
XmbDeserializationResult translations;
2932

3033
TemplateCompiler(this.options);
3134

@@ -43,12 +46,17 @@ class TemplateCompiler extends Transformer implements LazyTransformer {
4346
Html5LibDomAdapter.makeCurrent();
4447
var primaryId = transform.primaryInput.id;
4548
var reader = new AssetReader.fromTransform(transform);
49+
if (translations == null && options.translations != null) {
50+
translations = await _deserializeXmb(reader, options.translations);
51+
}
52+
4653
var outputs = await processTemplates(reader, primaryId,
4754
genChangeDetectionDebugInfo: options.genChangeDetectionDebugInfo,
4855
reflectPropertiesAsAttributes: options.reflectPropertiesAsAttributes,
4956
platformDirectives: options.platformDirectives,
5057
platformPipes: options.platformPipes,
51-
resolvedIdentifiers: options.resolvedIdentifiers
58+
resolvedIdentifiers: options.resolvedIdentifiers,
59+
translations: translations
5260
);
5361
var ngDepsCode = _emptyNgDepsContents;
5462
if (outputs != null) {
@@ -65,6 +73,17 @@ class TemplateCompiler extends Transformer implements LazyTransformer {
6573
new Asset.fromString(templatesAssetId(primaryId), ngDepsCode));
6674
}, log: transform.logger);
6775
}
76+
77+
Future _deserializeXmb(AssetReader reader, AssetId translations) async {
78+
final content = await reader.readAsString(translations);
79+
final res = deserializeXmb(content, translations.toString());
80+
if (res.errors.length > 0) {
81+
res.errors.forEach((e) => log.error(e.msg));
82+
throw "Cannot parse xmb file";
83+
} else {
84+
return res;
85+
}
86+
}
6887
}
6988

7089
const _emptyNgDepsContents = 'initReflector() {}\n';

modules_dart/transform/test/transform/template_compiler/all_tests.dart

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'package:angular2/src/transform/common/code/source_module.dart';
1616
import 'package:angular2/src/transform/common/zone.dart' as zone;
1717
import 'package:angular2/src/transform/template_compiler/generator.dart';
1818
import 'package:angular2/src/transform/template_compiler/compile_data_creator.dart';
19+
import 'package:angular2/i18n.dart';
1920

2021
import 'package:angular2/src/transform/common/model/parameter_model.pb.dart';
2122
import '../common/compile_directive_metadata/ng_for.ng_meta.dart' as ngMeta;
@@ -83,13 +84,15 @@ void allTests() {
8384
});
8485

8586
Future<String> process(AssetId assetId,
86-
{List<String> platformDirectives, List<String> platformPipes, Map<String,String> resolvedIdentifiers}) {
87+
{List<String> platformDirectives, List<String> platformPipes, Map<String,String> resolvedIdentifiers,
88+
XmbDeserializationResult translations}) {
8789
logger = new RecordingLogger();
8890
return zone.exec(
8991
() => processTemplates(reader, assetId,
9092
platformDirectives: platformDirectives,
9193
platformPipes: platformPipes,
92-
resolvedIdentifiers: resolvedIdentifiers),
94+
resolvedIdentifiers: resolvedIdentifiers,
95+
translations: translations),
9396
log: logger);
9497
}
9598

@@ -646,6 +649,23 @@ void allTests() {
646649
expect(cmp.providers[0].useClass.name).toEqual("Service2");
647650
expect(cmp.providers[0].useClass.moduleUrl).toEqual("moduleUrl");
648651
});
652+
653+
it('should use i18n parser when translations are provided.', () async {
654+
fooComponentMeta.template = new CompileTemplateMetadata(
655+
template: '<div i18n>content</div>',
656+
templateUrl: 'template.html');
657+
updateReader();
658+
659+
final translations = deserializeXmb("""
660+
<message-bundle>
661+
<msg id="${id(new Message("content", null))}">another</msg>
662+
</message-bundle>
663+
""", "someUrl");
664+
665+
final outputs = await process(fooAssetId, translations: translations);
666+
expect(_generatedCode(outputs)).toContain('another');
667+
expect(_generatedCode(outputs)).not.toContain('content');
668+
});
649669
}
650670

651671
String _generatedCode(Outputs outputs) {

0 commit comments

Comments
 (0)
X Tutup