Refactor language utility

Move the language helper out of RootProvider and into a utilities
module so that it can be more easiliy reused where needed. In some
cases we want the full language code so that logic has been moved
into a separate function.
This commit is contained in:
Jake McDermott 2019-10-03 18:26:38 -04:00
parent d2214acd6d
commit 275765b8fc
No known key found for this signature in database
GPG Key ID: 0E56ED990CDFCB4F
4 changed files with 56 additions and 27 deletions

View File

@ -3,23 +3,16 @@ import { I18nProvider } from '@lingui/react';
import { HashRouter } from 'react-router-dom';
import { getLanguageWithoutRegionCode } from '@util/language';
import ja from '../build/locales/ja/messages';
import en from '../build/locales/en/messages';
export function getLanguage(nav) {
const language =
(nav.languages && nav.languages[0]) || nav.language || nav.userLanguage;
const languageWithoutRegionCode = language.toLowerCase().split(/[_-]+/)[0];
return languageWithoutRegionCode;
}
class RootProvider extends Component {
render() {
const { children } = this.props;
const catalogs = { en, ja };
const language = getLanguage(navigator);
const language = getLanguageWithoutRegionCode(navigator);
return (
<HashRouter>

View File

@ -1,18 +0,0 @@
import { getLanguage } from './RootProvider';
describe('RootProvider.jsx', () => {
test('getLanguage returns the expected language code', () => {
expect(getLanguage({ languages: ['es-US'] })).toEqual('es');
expect(
getLanguage({
languages: ['es-US'],
language: 'fr-FR',
userLanguage: 'en-US',
})
).toEqual('es');
expect(getLanguage({ language: 'fr-FR', userLanguage: 'en-US' })).toEqual(
'fr'
);
expect(getLanguage({ userLanguage: 'en-US' })).toEqual('en');
});
});

View File

@ -0,0 +1,15 @@
export function getLanguage(nav) {
if (nav.languages && nav.languages[0]) {
return nav.languages[0];
}
if (nav.language) {
return nav.language;
}
return nav.userLanguage;
}
export function getLanguageWithoutRegionCode(nav) {
return getLanguage(nav)
.toLowerCase()
.split(/[_-]+/)[0];
}

View File

@ -0,0 +1,39 @@
import { getLanguage, getLanguageWithoutRegionCode } from './language';
describe('getLanguage', () => {
test('it returns the expected language code', () => {
expect(getLanguage({ languages: ['es-US'] })).toEqual('es-US');
expect(
getLanguage({
languages: ['es-US'],
language: 'fr-FR',
userLanguage: 'en-US',
})
).toEqual('es-US');
expect(getLanguage({ language: 'fr-FR', userLanguage: 'en-US' })).toEqual(
'fr-FR'
);
expect(getLanguage({ userLanguage: 'en-US' })).toEqual('en-US');
});
});
describe('getLanguageWithoutRegionCode', () => {
test('it returns the expected (truncated) language code', () => {
expect(getLanguageWithoutRegionCode({ languages: ['es-US'] })).toEqual(
'es'
);
expect(
getLanguageWithoutRegionCode({
languages: ['es-US'],
language: 'fr-FR',
userLanguage: 'en-US',
})
).toEqual('es');
expect(
getLanguageWithoutRegionCode({ language: 'fr-FR', userLanguage: 'en-US' })
).toEqual('fr');
expect(getLanguageWithoutRegionCode({ userLanguage: 'en-US' })).toEqual(
'en'
);
});
});