templates: Support context variables in Handlebars {{t}} helper.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg
2023-03-15 16:47:01 -07:00
committed by Tim Abbott
parent 042bbf2936
commit ba5a2c8866
2 changed files with 15 additions and 7 deletions

View File

@@ -258,6 +258,8 @@ Handlebars [helpers][] that Zulip registers. The syntax for simple strings is:
```html+handlebars
{{t 'English text' }}
{{t 'Block of English text with a {variable}.' }}
```
If you are passing a translated string to a Handlebars partial, you can use:
@@ -268,17 +270,17 @@ If you are passing a translated string to a Handlebars partial, you can use:
}}
```
The syntax for block strings or strings containing variables is:
The syntax for HTML strings is:
<!-- The html+handlebars lexer fails to lex the single braces. -->
```text
{{#tr}}
Block of English text.
<p>Block of English text.</p>
{{/tr}}
{{#tr}}
Block of English text with a {variable}.
<p>Block of English text with a {variable}.</p>
{{/tr}}
```

View File

@@ -51,13 +51,19 @@ Handlebars.registerHelper({
},
});
Handlebars.registerHelper("t", (message) => {
Handlebars.registerHelper("t", function (message) {
// Marks a string for translation.
// Example usage:
// Example usage 1:
// {{t "some English text"}}
//
// Example usage 2:
// {{t "This {variable} will get value from the current context"}}
//
// Note: use `{` and `}` instead of `{{` and `}}` to declare
// variables.
const descriptor = {id: message, defaultMessage: message};
return intl.formatMessage(descriptor);
return intl.formatMessage(descriptor, this);
});
Handlebars.registerHelper("tr", function (options) {
@@ -90,7 +96,7 @@ Handlebars.registerHelper("tr", function (options) {
]),
),
...Object.fromEntries(
Object.entries(this ?? {}).map(([key, value]) => [
Object.entries(this).map(([key, value]) => [
key,
Handlebars.Utils.escapeExpression(value),
]),