Skip to content

Commit c28be03

Browse files
committed
feat(dom): Add DOMLocalization.p.setArgs() (#615)
1 parent a5fedcf commit c28be03

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

fluent-dom/src/dom_localization.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,16 @@ export class DOMLocalization extends Localization {
9090
setAttributes(
9191
element: Element,
9292
id: string,
93-
args: Record<string, string>
93+
args?: Record<string, string>
9494
): Element {
9595
element.setAttribute(L10NID_ATTR_NAME, id);
96+
return this.setArgs(element, args);
97+
}
98+
99+
/**
100+
* Set only the `data-l10n-args` attribute on a DOM element.
101+
*/
102+
setArgs(element: Element, args?: Record<string, string>): Element {
96103
if (args) {
97104
element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args));
98105
} else {

fluent-dom/test/dom_localization_test.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { vi } from "vitest";
55

66
async function* mockGenerateMessages() {
77
const bundle = new FluentBundle(["en-US"]);
8-
const resource = new FluentResource("key1 = Key 1");
8+
const resource = new FluentResource("key1 = Key 1\nkey2 = Key {$arg}\n");
99
bundle.addResource(resource);
1010
yield bundle;
1111
}
@@ -24,6 +24,24 @@ suite("translateFragment", function () {
2424
assert.strictEqual(elem.textContent, "Key 1");
2525
});
2626

27+
test("translates a node with arguments", async function () {
28+
const FSI = "\u2068";
29+
const PDI = "\u2069";
30+
const domLoc = new DOMLocalization(["test.ftl"], mockGenerateMessages);
31+
32+
const frag = document.createDocumentFragment();
33+
const elem = document.createElement("p");
34+
domLoc.setAttributes(elem, "key2", { arg: 42 });
35+
frag.appendChild(elem);
36+
37+
await domLoc.translateFragment(frag);
38+
assert.strictEqual(elem.textContent, `Key ${FSI}42${PDI}`);
39+
40+
domLoc.setArgs(elem, { arg: 99 });
41+
await domLoc.translateFragment(frag);
42+
assert.strictEqual(elem.textContent, `Key ${FSI}99${PDI}`);
43+
});
44+
2745
test("does not inject content into a node with missing translation", async function () {
2846
const domLoc = new DOMLocalization(["test.ftl"], mockGenerateMessages);
2947

0 commit comments

Comments
 (0)