Skip to content

Commit e4851e9

Browse files
committed
fix: corrected broken language dropdown for FAQ translation, closes #3550
1 parent 0c14eeb commit e4851e9

File tree

2 files changed

+28
-13
lines changed

2 files changed

+28
-13
lines changed

phpmyfaq/admin/assets/src/content/faqs.overview.js

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
*/
1515

1616
import { deleteFaq, fetchAllFaqsByCategory, fetchCategoryTranslations } from '../api';
17-
import { pushErrorNotification, pushNotification } from '../utils';
17+
import { normalizeLanguageCode, pushErrorNotification, pushNotification } from '../utils';
1818
import { addElement } from '../../../../assets/src/utils';
1919

2020
export const handleFaqOverview = async () => {
@@ -69,24 +69,32 @@ export const handleFaqOverview = async () => {
6969
event.preventDefault();
7070

7171
const translations = await fetchCategoryTranslations(categoryId);
72-
const existingLink = element.nextElementSibling.childNodes[0];
73-
const regionNames = new Intl.DisplayNames([language], { type: 'language' });
72+
const dropdownMenu = element.parentElement.querySelector('.dropdown-menu');
7473
const faqId = element.getAttribute('data-pmf-faq-id');
7574
let options = [];
7675

77-
for (const [languageCode, languageName] of Object.entries(translations)) {
76+
dropdownMenu.querySelectorAll('#dropdownTranslation').forEach((link) => {
77+
options.push(link.innerText);
78+
});
79+
80+
for (let [languageCode, categoryName] of Object.entries(translations)) {
7881
if (languageCode !== language) {
79-
document.querySelectorAll('#dropdownTranslation').forEach((link) => {
80-
options.push(link.innerText);
81-
});
82-
if (!options.includes(`→ ${regionNames.of(languageCode)}`)) {
82+
let displayName;
83+
try {
84+
const normalizedCode = normalizeLanguageCode(languageCode);
85+
displayName = new Intl.DisplayNames([language], { type: 'language' }).of(normalizedCode);
86+
} catch (e) {
87+
displayName = null;
88+
}
89+
90+
if (displayName && !options.includes(`→ ${displayName}`)) {
8391
const newTranslationLink = addElement('a', {
8492
classList: 'dropdown-item',
8593
id: 'dropdownTranslation',
8694
href: `?action=editentry&id=${faqId}&cat=${categoryId}&translateTo=${languageCode}`,
87-
innerText: `→ ${regionNames.of(languageCode)}`,
95+
innerText: `→ ${displayName}`,
8896
});
89-
existingLink.insertAdjacentElement('afterend', newTranslationLink);
97+
dropdownMenu.appendChild(newTranslationLink);
9098
}
9199
}
92100
}
@@ -260,7 +268,7 @@ const populateCategoryTable = async (catgoryId, faqs) => {
260268
[addElement('i', { classList: 'bi bi-globe', 'aria-hidden': 'true' })]
261269
),
262270
addElement('div', { classList: 'dropdown-menu', 'aria-labelledby': 'dropdownAddNewTranslation' }, [
263-
addElement('a', { classList: 'dropdown-item', id: 'dropdownTranslation', innerText: 'n/a' }),
271+
addElement('a', { classList: 'dropdown-item', id: 'dropdownTranslation', innerText: '' }),
264272
]),
265273
]),
266274
])

phpmyfaq/admin/assets/src/utils/utils.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,15 @@ export const formatBytes = (bytes, decimals = 2) => {
4242
};
4343

4444
export const initializeTooltips = () => {
45-
const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
45+
const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
4646
const tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
4747
return new Tooltip(tooltipTriggerEl);
4848
});
49-
}
49+
};
50+
51+
export const normalizeLanguageCode = (code) => {
52+
if (!code) {
53+
return code;
54+
}
55+
return code.replace(/_/g, '-').replace(/-([a-z]{2})$/i, (_, region) => '-' + region.toUpperCase());
56+
};

0 commit comments

Comments
 (0)