fix(client): fix i18n external locations in nav (#42995)

This commit is contained in:
Shaun Hamilton
2021-07-28 01:31:07 +01:00
committed by GitHub
parent c56510a6b2
commit 9731ea31b8
10 changed files with 34 additions and 144 deletions

View File

@ -13,5 +13,9 @@
}, },
"donate": { "donate": {
"other-ways-url": "https://chinese.freecodecamp.org/news/how-to-donate-to-free-code-camp/" "other-ways-url": "https://chinese.freecodecamp.org/news/how-to-donate-to-free-code-camp/"
},
"nav": {
"forum": "https://chinese.freecodecamp.org/forum/",
"news": "https://chinese.freecodecamp.org/news/"
} }
} }

View File

@ -13,5 +13,9 @@
}, },
"donate": { "donate": {
"other-ways-url": "https://chinese.freecodecamp.org/news/how-to-donate-to-free-code-camp/" "other-ways-url": "https://chinese.freecodecamp.org/news/how-to-donate-to-free-code-camp/"
},
"nav": {
"forum": "https://chinese.freecodecamp.org/forum/",
"news": "https://chinese.freecodecamp.org/news/"
} }
} }

View File

@ -13,5 +13,9 @@
}, },
"donate": { "donate": {
"other-ways-url": "https://www.freecodecamp.org/news/how-to-donate-to-free-code-camp" "other-ways-url": "https://www.freecodecamp.org/news/how-to-donate-to-free-code-camp"
},
"nav": {
"forum": "https://forum.freecodecamp.org/",
"news": "https://freecodecamp.org/news/"
} }
} }

View File

@ -13,5 +13,9 @@
}, },
"donate": { "donate": {
"other-ways-url": "https://www.freecodecamp.org/news/how-to-donate-to-free-code-camp" "other-ways-url": "https://www.freecodecamp.org/news/how-to-donate-to-free-code-camp"
},
"nav": {
"forum": "https://forum.freecodecamp.org/c/espanol/",
"news": "https://freecodecamp.org/espanol/news/"
} }
} }

View File

@ -13,5 +13,9 @@
}, },
"donate": { "donate": {
"other-ways-url": "https://www.freecodecamp.org/news/how-to-donate-to-free-code-camp" "other-ways-url": "https://www.freecodecamp.org/news/how-to-donate-to-free-code-camp"
},
"nav": {
"forum": "https://forum.freecodecamp.org/c/italiano/",
"news": "https://freecodecamp.org/italian/news/"
} }
} }

View File

@ -13,5 +13,9 @@
}, },
"donate": { "donate": {
"other-ways-url": "https://www.freecodecamp.org/news/how-to-donate-to-free-code-camp" "other-ways-url": "https://www.freecodecamp.org/news/how-to-donate-to-free-code-camp"
},
"nav": {
"forum": "https://forum.freecodecamp.org/c/portugues/",
"news": "https://freecodecamp.org/portuguese/news/"
} }
} }

View File

@ -7,8 +7,9 @@ import { NavLinks } from './components/nav-links';
import AuthOrProfile from './components/auth-or-profile'; import AuthOrProfile from './components/auth-or-profile';
import envData from '../../../../config/env.json'; import envData from '../../../../config/env.json';
import { useTranslation } from 'react-i18next';
const { apiLocation, clientLocale } = envData; const { apiLocation } = envData;
jest.mock('../../analytics'); jest.mock('../../analytics');
@ -50,6 +51,7 @@ describe('<NavLinks />', () => {
const shallow = new ShallowRenderer(); const shallow = new ShallowRenderer();
shallow.render(<NavLinks {...landingPageProps} />); shallow.render(<NavLinks {...landingPageProps} />);
const view = shallow.getRenderOutput(); const view = shallow.getRenderOutput();
expect( expect(
hasDonateNavItem(view) && hasDonateNavItem(view) &&
hasSignInNavItem(view) && hasSignInNavItem(view) &&
@ -73,6 +75,7 @@ describe('<NavLinks />', () => {
i18n: { i18n: {
language: 'en' language: 'en'
}, },
t: useTranslation.t,
toggleNightMode: theme => theme toggleNightMode: theme => theme
}; };
const shallow = new ShallowRenderer(); const shallow = new ShallowRenderer();
@ -102,6 +105,7 @@ describe('<NavLinks />', () => {
i18n: { i18n: {
language: 'en' language: 'en'
}, },
t: useTranslation.t,
toggleNightMode: theme => theme toggleNightMode: theme => theme
}; };
const shallow = new ShallowRenderer(); const shallow = new ShallowRenderer();
@ -234,31 +238,16 @@ const hasProfileAndSettingsNavItems = (component, username) => {
const hasForumNavItem = component => { const hasForumNavItem = component => {
const { children, to } = navigationLinks(component, 'forum'); const { children, to } = navigationLinks(component, 'forum');
const localizedForums = { // TODO: test compiled TFunction value
chinese: 'https://chinese.freecodecamp.org/forum',
'chinese-traditional': 'https://chinese.freecodecamp.org/forum',
espanol: 'https://forum.freecodecamp.org/c/espanol/',
english: 'https://forum.freecodecamp.org/',
italian: 'https://forum.freecodecamp.org/c/italian/'
};
return ( return (
children[0].props.children === 'buttons.forum' && children[0].props.children === 'buttons.forum' && to === 'links:nav.forum'
to === localizedForums[clientLocale]
); );
}; };
const hasNewsNavItem = component => { const hasNewsNavItem = component => {
const { children, to } = navigationLinks(component, 'news'); const { children, to } = navigationLinks(component, 'news');
const localizedNews = {
chinese: 'https://chinese.freecodecamp.org/news',
'chinese-traditional': 'https://chinese.freecodecamp.org/news',
espanol: 'https://www.freecodecamp.org/espanol/news',
english: 'https://www.freecodecamp.org/news',
italian: 'https://www.freecodecamp.org/italian/news'
};
return ( return (
children[0].props.children === 'buttons.news' && children[0].props.children === 'buttons.news' && to === 'links:nav.news'
to === localizedNews[clientLocale]
); );
}; };

View File

@ -23,7 +23,6 @@ import { Link } from '../../helpers';
import { updateUserFlag } from '../../../redux/settings'; import { updateUserFlag } from '../../../redux/settings';
import envData from '../../../../../config/env.json'; import envData from '../../../../../config/env.json';
import createLanguageRedirect from '../../create-language-redirect'; import createLanguageRedirect from '../../create-language-redirect';
import createExternalRedirect from '../../create-external-redirects';
import { import {
availableLangs, availableLangs,
i18nextCodes, i18nextCodes,
@ -118,7 +117,7 @@ export class NavLinks extends Component<NavLinksProps, {}> {
external={true} external={true}
key='forum' key='forum'
sameTab={false} sameTab={false}
to={createExternalRedirect('forum', { clientLocale })} to={t('links:nav.forum')}
> >
<span>{t('buttons.forum')}</span> <span>{t('buttons.forum')}</span>
<FontAwesomeIcon icon={faExternalLinkAlt} /> <FontAwesomeIcon icon={faExternalLinkAlt} />
@ -128,7 +127,7 @@ export class NavLinks extends Component<NavLinksProps, {}> {
external={true} external={true}
key='news' key='news'
sameTab={false} sameTab={false}
to={createExternalRedirect('news', { clientLocale })} to={t('links:nav.news')}
> >
<span>{t('buttons.news')}</span> <span>{t('buttons.news')}</span>
<FontAwesomeIcon icon={faExternalLinkAlt} /> <FontAwesomeIcon icon={faExternalLinkAlt} />

View File

@ -1,98 +0,0 @@
import createExternalRedirect from './create-external-redirects';
describe('createExternalRedirects', () => {
describe('english redirects', () => {
const envVars = {
clientLocale: 'english'
};
const forumURL = 'https://forum.freecodecamp.org/';
const newsURL = 'https://www.freecodecamp.org/news';
it('should generate correct forum link', () => {
const receivedUrl = createExternalRedirect('forum', { ...envVars });
expect(receivedUrl).toBe(forumURL);
});
it('should generate correct news link', () => {
const receivedUrl = createExternalRedirect('news', { ...envVars });
expect(receivedUrl).toBe(newsURL);
});
});
describe('chinese redirects', () => {
const envVars = {
clientLocale: 'chinese'
};
const forumURL = 'https://chinese.freecodecamp.org/forum';
const newsURL = 'https://chinese.freecodecamp.org/news';
it('should generate correct forum link', () => {
const receivedUrl = createExternalRedirect('forum', { ...envVars });
expect(receivedUrl).toBe(forumURL);
});
it('should generate correct news link', () => {
const receivedUrl = createExternalRedirect('news', { ...envVars });
expect(receivedUrl).toBe(newsURL);
});
});
describe('spanish redirects', () => {
const envVars = {
clientLocale: 'espanol'
};
const forumURL = 'https://forum.freecodecamp.org/c/espanol/';
const newsURL = 'https://www.freecodecamp.org/espanol/news';
it('should generate correct forum link', () => {
const receivedUrl = createExternalRedirect('forum', { ...envVars });
expect(receivedUrl).toBe(forumURL);
});
it('should generate correct news link', () => {
const receivedUrl = createExternalRedirect('news', { ...envVars });
expect(receivedUrl).toBe(newsURL);
});
});
describe('french redirects', () => {
const envVars = {
clientLocale: 'francais'
};
const forumURL = 'https://forum.freecodecamp.org/c/francais/';
const newsURL = 'https://www.freecodecamp.org/francais/news';
it('should generate correct forum link', () => {
const receivedUrl = createExternalRedirect('forum', { ...envVars });
expect(receivedUrl).toBe(forumURL);
});
it('should generate correct news link', () => {
const receivedUrl = createExternalRedirect('news', { ...envVars });
expect(receivedUrl).toBe(newsURL);
});
});
describe('chinese-traditional redirects', () => {
const envVars = {
clientLocale: 'chinese-traditional'
};
const forumURL = 'https://chinese.freecodecamp.org/forum';
const newsURL = 'https://chinese.freecodecamp.org/news';
it('should generate correct forum link', () => {
const receivedUrl = createExternalRedirect('forum', { ...envVars });
expect(receivedUrl).toBe(forumURL);
});
it('should generate correct news link', () => {
const receivedUrl = createExternalRedirect('news', { ...envVars });
expect(receivedUrl).toBe(newsURL);
});
});
});

View File

@ -1,24 +0,0 @@
import envData from '../../../config/env.json';
const { forumLocation } = envData;
const createExternalRedirect = (
page: string,
{ clientLocale }: { clientLocale: string }
): string => {
// Handle Chinese
if (clientLocale === 'chinese' || clientLocale === 'chinese-traditional') {
return `https://chinese.freecodecamp.org/${page}`;
}
// Handle Others
const isNotEnglish = clientLocale !== 'english';
if (page === 'forum') {
return `${forumLocation}/${isNotEnglish ? 'c/' + clientLocale + '/' : ''}`;
}
return `https://www.freecodecamp.org/${
isNotEnglish ? clientLocale + '/news' : 'news'
}`;
};
export default createExternalRedirect;