Skip to content

Commit aa63876

Browse files
sampottscursoragent
andcommitted
fix(html): refresh tooltip text when i18n locale changes
Subscribe tooltips to the i18n context and re-sync trigger labels on update so open tooltips track locale switches on media-i18n-provider. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 9f3ef62 commit aa63876

2 files changed

Lines changed: 42 additions & 0 deletions

File tree

packages/html/src/ui/tooltip/tests/tooltip-element.test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,40 @@ describe('TooltipElement', () => {
8383

8484
expect(tooltip.textContent).toBe('Reproducir');
8585
});
86+
87+
it('updates tooltip text when provider locale changes', async () => {
88+
registerI18n('es', { play: 'Reproducir' });
89+
registerI18n('fr', { play: 'Lire' });
90+
91+
ensureDefined(TestPlayerProviderElement);
92+
ensureDefined(PlayButtonElement);
93+
ensureDefined(TooltipElement);
94+
ensureDefined(MediaI18nProviderElement);
95+
96+
const player = document.createElement(TestPlayerProviderElement.tagName) as TestPlayerProviderElement;
97+
const provider = new MediaI18nProviderElement();
98+
provider.setAttribute('lang', 'es');
99+
100+
const button = document.createElement(PlayButtonElement.tagName) as PlayButtonElement;
101+
button.setAttribute('commandfor', 'tip');
102+
103+
const tooltip = document.createElement(TooltipElement.tagName) as TooltipElement;
104+
tooltip.id = 'tip';
105+
tooltip.setAttribute('open', '');
106+
107+
document.body.append(player);
108+
player.append(provider);
109+
provider.append(button, tooltip);
110+
111+
await button.updateComplete;
112+
await tooltip.updateComplete;
113+
expect(tooltip.textContent).toBe('Reproducir');
114+
115+
provider.setAttribute('lang', 'fr');
116+
await provider.updateComplete;
117+
await button.updateComplete;
118+
await tooltip.updateComplete;
119+
120+
expect(tooltip.textContent).toBe('Lire');
121+
});
86122
});

packages/html/src/ui/tooltip/tooltip-element.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { SnapshotController } from '@videojs/store/html';
3030
import { applyStyles, supportsAnchorPositioning, tryHidePopover, tryShowPopover } from '@videojs/utils/dom';
3131
import { isFunction } from '@videojs/utils/predicate';
3232

33+
import { I18nController } from '../../i18n/instance';
3334
import { containerContext } from '../../player/context';
3435
import { MediaElement } from '../media-element';
3536
import { PositionController } from '../position-controller';
@@ -71,6 +72,7 @@ export class TooltipElement extends MediaElement {
7172
boundary: PositioningBoundary = 'container';
7273

7374
readonly #core = new TooltipCore();
75+
readonly #i18n = new I18nController(this);
7476
readonly #groupConsumer = new ContextConsumer(this, { context: tooltipGroupContext });
7577
readonly #containerCtx = new ContextConsumer(this, { context: containerContext, subscribe: true });
7678
readonly #position = new PositionController(this);
@@ -166,6 +168,10 @@ export class TooltipElement extends MediaElement {
166168
const triggerEl = this.#position.findTrigger();
167169
this.#syncTrigger(triggerEl);
168170

171+
if (this.#currentTrigger && isLabelTrigger(this.#currentTrigger)) {
172+
this.#syncContent(this.#currentTrigger);
173+
}
174+
169175
// Derive state from core + input.
170176
const input = this.#tooltip.input.current;
171177
this.#core.setInput(input);

0 commit comments

Comments
 (0)