Skip to content

Commit 22cf785

Browse files
authored
feat(i18n): change language label from region to language (codecentric#1941)
closes codecentric#1875 (polished PR)
1 parent dfe2a4b commit 22cf785

File tree

2 files changed

+40
-9
lines changed

2 files changed

+40
-9
lines changed

spring-boot-admin-server-ui/src/main/frontend/shell/navbar-item-language-selector.spec.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {render} from '@/test-utils';
22
import NavbarItemLanguageSelector from './navbar-item-language-selector';
33
import {screen} from '@testing-library/vue';
44
import userEvent from '@testing-library/user-event';
5+
import {mount} from '@vue/test-utils';
56

67
describe('NavbarItemLanguageSelector', () => {
78
let wrapper;
@@ -18,15 +19,15 @@ describe('NavbarItemLanguageSelector', () => {
1819
});
1920

2021
it('should print the locale with the country for selected language/locale', async () => {
21-
const buttons = await screen.findAllByRole('button', {name: 'Deutschland (de)'});
22+
const buttons = await screen.findAllByRole('button', {name: 'Deutsch'});
2223
expect(buttons[0]).toBeDefined()
2324
});
2425

2526
it('should print locale with the country for available language in menu', async () => {
26-
const languageButton = await screen.findAllByRole('button', {name: 'Deutschland (de)'});
27+
const languageButton = await screen.findAllByRole('button', {name: 'Deutsch'});
2728
await userEvent.click(languageButton[0]);
2829

29-
expect(await screen.findByRole('button', {name: 'France (fr)'})).toBeDefined()
30+
expect(await screen.findByRole('button', {name: 'français'})).toBeDefined()
3031
});
3132

3233
it('should print the locale as label when it cannot be translated', async () => {
@@ -37,13 +38,31 @@ describe('NavbarItemLanguageSelector', () => {
3738
}
3839
})
3940

40-
const htmlElement = await screen.findAllByRole('button', {name: 'zz (zz)'});
41+
const htmlElement = await screen.findAllByRole('button', {name: 'zz'});
4142
expect(htmlElement[0]).toBeDefined()
4243
});
4344

4445
it('should emit the selected locale', async () => {
45-
await userEvent.click(await screen.findByRole('button', {name: 'France (fr)'}));
46+
await userEvent.click(await screen.findByRole('button', {name: 'français'}));
4647

4748
expect(wrapper.emitted().localeChanged[0]).toContain('fr')
4849
});
50+
51+
it.each`
52+
locale | expected
53+
${'de'} | ${'Deutsch'}
54+
${'is'} | ${'íslenska'}
55+
${'de-DE'} | ${'Deutsch (Deutschland)'}
56+
${'zh-CN'} | ${'简体中文'}
57+
${'zh-TW'} | ${'繁體中文'}
58+
`('should show \'$expected\' for given \'$locale\'', ({locale, expected}) => {
59+
let wrapper = mount(NavbarItemLanguageSelector, {
60+
propsData: {
61+
availableLocales: [],
62+
currentLocale: 'en'
63+
}
64+
});
65+
66+
expect(wrapper.vm.mapLocale(locale).label).toEqual(expected);
67+
});
4968
});

spring-boot-admin-server-ui/src/main/frontend/shell/navbar-item-language-selector.vue

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<template>
1818
<div class="navbar-item has-dropdown is-hoverable">
1919
<a class="navbar-link" role="button">
20-
{{ selectedLanguage.label }} ({{ selectedLanguage.locale }})
20+
{{ selectedLanguage.label }}
2121
</a>
2222
<div class="navbar-dropdown">
2323
<a class="navbar-item"
@@ -26,7 +26,7 @@
2626
:key="language.locale"
2727
@click="localeChanged(language.locale)"
2828
>
29-
{{ language.label }} ({{ language.locale }})
29+
{{ language.label }}
3030
</a>
3131
</div>
3232
</div>
@@ -55,8 +55,20 @@ export default {
5555
},
5656
mapLocale(locale) {
5757
try {
58-
const localeUppercase = locale.split('-').pop().toUpperCase();
59-
let label = new Intl.DisplayNames([localeUppercase, this.$i18n.locale], {type: 'region'}).of(localeUppercase);
58+
let languageTag = locale.split('-').reverse().pop();
59+
let regionTag = locale.split('-').length > 1 ? `-${locale.split('-').pop()}` : ''
60+
61+
if (locale.toLowerCase().startsWith('zh')) {
62+
if (locale.endsWith('CN')) {
63+
regionTag = '-Hans'
64+
}
65+
if (locale.endsWith('TW')) {
66+
regionTag = '-Hant'
67+
}
68+
}
69+
70+
let translatedLanguageNames = new Intl.DisplayNames([locale], {type: 'language'});
71+
let label = translatedLanguageNames.of(`${languageTag}${regionTag}`);
6072
6173
if (label?.toUpperCase() === 'UNKNOWN REGION') {
6274
label = locale;

0 commit comments

Comments
 (0)