75 lines
2.7 KiB
TypeScript
75 lines
2.7 KiB
TypeScript
|
/**
|
||
|
* @license
|
||
|
* Copyright Google Inc. All Rights Reserved.
|
||
|
*
|
||
|
* Use of this source code is governed by an MIT-style license that can be
|
||
|
* found in the LICENSE file at https://angular.io/license
|
||
|
*/
|
||
|
import * as i18n from '../../../i18n/i18n_ast';
|
||
|
import {mapLiteral} from '../../../output/map_util';
|
||
|
import * as o from '../../../output/output_ast';
|
||
|
|
||
|
import {serializeIcuNode} from './icu_serializer';
|
||
|
import {i18nMetaToDocStmt, metaFromI18nMessage} from './meta';
|
||
|
import {formatI18nPlaceholderName} from './util';
|
||
|
|
||
|
/** Closure uses `goog.getMsg(message)` to lookup translations */
|
||
|
const GOOG_GET_MSG = 'goog.getMsg';
|
||
|
|
||
|
export function createGoogleGetMsgStatements(
|
||
|
variable: o.ReadVarExpr, message: i18n.Message, closureVar: o.ReadVarExpr,
|
||
|
params: {[name: string]: o.Expression}): o.Statement[] {
|
||
|
const messageString = serializeI18nMessageForGetMsg(message);
|
||
|
const args = [o.literal(messageString) as o.Expression];
|
||
|
if (Object.keys(params).length) {
|
||
|
args.push(mapLiteral(params, true));
|
||
|
}
|
||
|
|
||
|
// /** Description and meaning of message */
|
||
|
// const MSG_... = goog.getMsg(..);
|
||
|
// I18N_X = MSG_...;
|
||
|
const statements = [];
|
||
|
const jsdocComment = i18nMetaToDocStmt(metaFromI18nMessage(message));
|
||
|
if (jsdocComment !== null) {
|
||
|
statements.push(jsdocComment);
|
||
|
}
|
||
|
statements.push(closureVar.set(o.variable(GOOG_GET_MSG).callFn(args)).toConstDecl());
|
||
|
statements.push(new o.ExpressionStatement(variable.set(closureVar)));
|
||
|
|
||
|
return statements;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This visitor walks over i18n tree and generates its string representation, including ICUs and
|
||
|
* placeholders in `{$placeholder}` (for plain messages) or `{PLACEHOLDER}` (inside ICUs) format.
|
||
|
*/
|
||
|
class GetMsgSerializerVisitor implements i18n.Visitor {
|
||
|
private formatPh(value: string): string { return `{$${formatI18nPlaceholderName(value)}}`; }
|
||
|
|
||
|
visitText(text: i18n.Text): any { return text.value; }
|
||
|
|
||
|
visitContainer(container: i18n.Container): any {
|
||
|
return container.children.map(child => child.visit(this)).join('');
|
||
|
}
|
||
|
|
||
|
visitIcu(icu: i18n.Icu): any { return serializeIcuNode(icu); }
|
||
|
|
||
|
visitTagPlaceholder(ph: i18n.TagPlaceholder): any {
|
||
|
return ph.isVoid ?
|
||
|
this.formatPh(ph.startName) :
|
||
|
`${this.formatPh(ph.startName)}${ph.children.map(child => child.visit(this)).join('')}${this.formatPh(ph.closeName)}`;
|
||
|
}
|
||
|
|
||
|
visitPlaceholder(ph: i18n.Placeholder): any { return this.formatPh(ph.name); }
|
||
|
|
||
|
visitIcuPlaceholder(ph: i18n.IcuPlaceholder, context?: any): any {
|
||
|
return this.formatPh(ph.name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const serializerVisitor = new GetMsgSerializerVisitor();
|
||
|
|
||
|
export function serializeI18nMessageForGetMsg(message: i18n.Message): string {
|
||
|
return message.nodes.map(node => node.visit(serializerVisitor, null)).join('');
|
||
|
}
|