From 5fafda1544332dee80c21af740041c2c74fd589c Mon Sep 17 00:00:00 2001 From: ranokay Date: Wed, 26 Aug 2026 12:04:02 +0300 Subject: [PATCH] fix(ui): match ISO 639 lyric languages --- ui/src/audioplayer/lyrics.js | 12 ++++++++++-- ui/src/audioplayer/lyrics.test.js | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/ui/src/audioplayer/lyrics.js b/ui/src/audioplayer/lyrics.js index ec93cc6f0..05193d271 100644 --- a/ui/src/audioplayer/lyrics.js +++ b/ui/src/audioplayer/lyrics.js @@ -1,5 +1,13 @@ -const normalizeLanguageTag = (language) => - (language || '').toLowerCase().replace(/_/g, '-') +const normalizeLanguageTag = (language) => { + const normalized = (language || '').trim().replace(/_/g, '-') + if (!normalized) return '' + + try { + return Intl.getCanonicalLocales(normalized)[0].toLowerCase() + } catch { + return normalized.toLowerCase() + } +} const LYRIC_KIND_MAIN = 'main' const LYRIC_KIND_TRANSLATION = 'translation' diff --git a/ui/src/audioplayer/lyrics.test.js b/ui/src/audioplayer/lyrics.test.js index c5ef6d736..208d82ac6 100644 --- a/ui/src/audioplayer/lyrics.test.js +++ b/ui/src/audioplayer/lyrics.test.js @@ -101,6 +101,21 @@ describe('lyrics helpers', () => { expect(layers.main.line[0].value).toBe('繁體') }) + it('matches ISO 639-2 lyric languages to regional browser locales', () => { + const lyrics = [ + structured('main', 'spa', 'Español'), + structured('main', 'eng', 'English'), + structured('main', 'por', 'Português'), + ] + + expect(selectLyricLayers(lyrics, 'en-US').main.line[0].value).toBe( + 'English', + ) + expect(selectLyricLayers(lyrics, 'pt-BR').main.line[0].value).toBe( + 'Português', + ) + }) + it('resolves UTF-8 byte ranges without confusing repeated words', () => { const text = 'caf\u00e9 caf\u00e9'