Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Europe local language Epic, header local language translation #944

Open
wants to merge 16 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 15 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 20 additions & 5 deletions packages/server/src/api/epicRouter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,18 @@ import {
TestTracking,
WeeklyArticleLog,
} from '@sdc/shared/dist/types';
import {
buildCampaignCode,
getReminderFields,
countryCodeToCountryGroupId,
countryCodeToVerfiedLocalLanguage,
} from '@sdc/shared/dist/lib';
import { getQueryParams, Params } from '../lib/params';
import { baseUrl } from '../lib/env';
import { ChannelSwitches } from '../channelSwitches';
import { Debug, findForcedTestAndVariant, findTestAndVariant } from '../tests/epics/epicSelection';
import { selectAmountsTestVariant } from '../lib/ab';
import { TickerDataProvider } from '../lib/fetchTickerData';
import {
buildCampaignCode,
getReminderFields,
countryCodeToCountryGroupId,
} from '@sdc/shared/dist/lib';
import { getArticleViewCounts } from '../lib/history';
import {
epic as epicModule,
Expand Down Expand Up @@ -119,6 +120,17 @@ export const buildEpicRouter = (
variant.tickerSettings && tickerData.addTickerDataToSettings(variant.tickerSettings);
const showReminderFields = variant.showReminderFields ?? getReminderFields();

const localLanguage = countryCodeToVerfiedLocalLanguage(
test.name,
variant.name,
targeting.countryCode,
{
epicHeader: variant.heading,
epicParagraphs: variant.paragraphs,
epicHighlightedText: variant.highlightedText,
},
);

const contributionAmounts = choiceCardAmounts.get();
const requiredCountry = targeting.countryCode ?? 'GB';
const requiredRegion = countryCodeToCountryGroupId(requiredCountry);
Expand All @@ -131,6 +143,9 @@ export const buildEpicRouter = (

const propsVariant = {
...variant,
heading: localLanguage?.epicHeader ?? variant.heading,
paragraphs: localLanguage?.epicParagraphs ?? variant.paragraphs,
highlightedText: localLanguage?.epicHighlightedText ?? variant.highlightedText,
tickerSettings,
showReminderFields,
choiceCardAmounts: variantAmounts,
Expand Down
1 change: 1 addition & 0 deletions packages/shared/src/lib/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './localLanguage';
export * from './geolocation';
export * from './placeholders';
export * from './reminderFields';
Expand Down
172 changes: 172 additions & 0 deletions packages/shared/src/lib/localLanguage.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
import { countryCodeToVerfiedLocalLanguage } from './localLanguage';

describe('getCountryCodeToLocalLanguage', () => {
const countries = [
{
inputCountryCode: 'FR',
inputTestName: 'LOCAL-LANGUAGE',
inputVariant: 'CONTROL',
output: {
bannerHeader: 'Soutenez un journalisme européen et indépendant ',
epicHeader: '… il existe une bonne raison de ne pas soutenir le Guardian.',
epicParagraphs: [
`Actuellement, beaucoup de lecteurs ne sont pas ou plus en mesure de payer pour accéder aux informations. C’est pour cela que nos contenus sont et resteront gratuits et ouverts à tous. Si tel est votre cas, vous pouvez continuer à lire nos articles librement, comme vous le faites à présent, depuis la France.`,
`Si au contraire, vous avez les moyens de contribuer financièrement, voici trois bonnes raisons de soutenir le Guardian dès aujourd’hui.`,
`1. Nous sommes une rédaction indépendante. Personne ne contrôle notre ligne éditoriale ; fait rare en Europe où la liberté des médias est souvent compromise par le poids des actionnaires et la corruption. `,
`2. Notre journalisme d'investigation met en lumière les dessous du pouvoir et dénonce l’injustice en Europe et dans le monde entier.`,
`3. Même sous l'ère du Brexit, nous restons plus européens que jamais. Nous venons de lancer notre nouvelle édition en ligne en anglais, dédiée à nos lecteurs en Europe, et donc à vous, en France. Cette année, nous avons investi dans notre journalisme européen, recruté de nouveaux correspondants sur le continent et publié plus de 10 000 articles sur les affaires européennes. Nous comptons désormais environ 180 000 de nos contributeurs en Europe.`,
`Afin que ce travail essentiel perdure dans les années à venir, nous avons besoin du soutien des lecteurs. Si vous le pouvez, `,
],
epicHighlightedText: `une contribution de seulement 2 euros par mois peut dès aujourd’hui faire toute la différence. Merci.`,
},
},
{
inputCountryCode: 'DE',
inputTestName: 'LOCAL-LANGUAGE',
inputVariant: 'CONTROL',
output: {
bannerHeader: 'Unterstützen Sie unabhängigen europäischen Journalismus',
epicHeader: 'Header (German)',
epicParagraphs: [
'Para1 (German)',
'Para2 (German)',
'Para3 (German)',
'Para4 (German), ',
],
epicHighlightedText: `Highlight (German)`,
},
},
{
inputCountryCode: 'IT',
inputTestName: 'LOCAL-LANGUAGE',
inputVariant: 'CONTROL',
output: {
bannerHeader: 'Sostieni un giornalismo europeo indipendente',
},
},
{
inputCountryCode: 'NL',
inputTestName: 'LOCAL-LANGUAGE',
inputVariant: 'CONTROL',
output: {
bannerHeader: 'Steun de onafhankelijke journalistiek',
epicHeader: 'Header (Dutch)',
epicParagraphs: ['Para1 (Dutch)', 'Para2 (Dutch)', 'Para3 (Dutch), '],
epicHighlightedText: `Highlight (Dutch)`,
},
},
{
inputCountryCode: 'NL',
inputTestName: 'LOCAL-LANGUAGE1',
inputVariant: 'CONTROL',
output: undefined,
},
{
inputCountryCode: 'NL',
inputTestName: 'LOCAL-LANGUAGE',
inputVariant: 'CONTROL1',
output: undefined,
},
{
inputCountryCode: 'NL',
inputTestName: '',
inputVariant: '',
output: undefined,
},
{
inputCountryCode: 'SE',
inputTestName: 'LOCAL-LANGUAGE',
inputVariant: 'CONTROL',
output: {
bannerHeader: 'Var med och stöd oberoende journalistik i Europa',
},
},
{
inputCountryCode: 'SP',
inputTestName: 'LOCAL-LANGUAGE',
inputVariant: 'CONTROL',
output: {
bannerHeader: 'Fomentar el periodismo europeo independiente',
},
},
{
inputCountryCode: 'GB',
inputTestName: 'LOCAL-LANGUAGE',
inputVariant: 'CONTROL',
output: undefined,
},
{
inputCountryCode: 'GB',
inputTestName: '',
inputVariant: '',
output: undefined,
},
{
inputCountryCode: 'US',
inputTestName: 'LOCAL-LANGUAGE',
inputVariant: 'CONTROL',
inputDefaultLocalLanguage: {
bannerHeader: 'BannerHeaderTest',
epicHeader: 'EpicHeaderTest',
epicParagraphs: ['1', '2', '3', '4', '5'],
epicHighlightedText: `Highlight (US)`,
},
output: {
bannerHeader: 'BannerHeaderTest',
epicHeader: 'EpicHeaderTest',
epicParagraphs: ['1', '2', '3', '4', '5'],
epicHighlightedText: `Highlight (US)`,
},
},
{
inputCountryCode: '',
inputTestName: 'LOCAL-LANGUAGE',
inputVariant: 'CONTROL',
inputDefaultLocalLanguage: {
bannerHeader: 'BannerHeaderTest',
epicHeader: 'EpicHeaderTest',
epicParagraphs: ['1', '2', '3', '4', '5'],
epicHighlightedText: `Highlight`,
},
output: {
bannerHeader: 'BannerHeaderTest',
epicHeader: 'EpicHeaderTest',
epicParagraphs: ['1', '2', '3', '4', '5'],
epicHighlightedText: `Highlight`,
},
},
{
inputCountryCode: '',
inputTestName: '',
inputVariant: '',
output: undefined,
},
{
inputCountryCode: '',
inputTestName: '',
inputVariant: '',
inputDefaultLocalLanguage: {
bannerHeader: 'BannerHeaderTest',
epicHeader: 'EpicHeaderTest',
epicParagraphs: ['1', '2', '3', '4', '5'],
epicHighlightedText: `Highlight`,
},
output: undefined,
},
];

countries.forEach(
({ inputTestName, inputVariant, inputCountryCode, inputDefaultLocalLanguage, output }) => {
it(`returns ${output}, given ${inputCountryCode}`, () => {
expect(
countryCodeToVerfiedLocalLanguage(
inputTestName,
inputVariant,
inputCountryCode,
inputDefaultLocalLanguage,
),
).toEqual(output);
});
},
);
});
73 changes: 73 additions & 0 deletions packages/shared/src/lib/localLanguage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
export const LocalLanguageBannerTemplateName = 'LocalLanguageMomentBanner';
const LocalLanguageBannerTestName = 'LOCAL-LANGUAGE';
const LocalLanguageBannerVariant = 'CONTROL';
const LocalLanguageEpicTestName = 'LOCAL-LANGUAGE';
const LocalLanguageEpicVariant = 'CONTROL';

export type LocalLanguage = {
bannerHeader?: string;
epicHeader?: string;
epicParagraphs?: string[];
epicHighlightedText?: string;
};
type LocalLanguages = Record<string, LocalLanguage>;

const localLanguages: LocalLanguages = {
FR: {
bannerHeader: 'Soutenez un journalisme européen et indépendant ',
epicHeader: '… il existe une bonne raison de ne pas soutenir le Guardian.',
epicParagraphs: [
`Actuellement, beaucoup de lecteurs ne sont pas ou plus en mesure de payer pour accéder aux informations. C’est pour cela que nos contenus sont et resteront gratuits et ouverts à tous. Si tel est votre cas, vous pouvez continuer à lire nos articles librement, comme vous le faites à présent, depuis la France.`,
`Si au contraire, vous avez les moyens de contribuer financièrement, voici trois bonnes raisons de soutenir le Guardian dès aujourd’hui.`,
`1. Nous sommes une rédaction indépendante. Personne ne contrôle notre ligne éditoriale ; fait rare en Europe où la liberté des médias est souvent compromise par le poids des actionnaires et la corruption. `,
`2. Notre journalisme d'investigation met en lumière les dessous du pouvoir et dénonce l’injustice en Europe et dans le monde entier.`,
`3. Même sous l'ère du Brexit, nous restons plus européens que jamais. Nous venons de lancer notre nouvelle édition en ligne en anglais, dédiée à nos lecteurs en Europe, et donc à vous, en France. Cette année, nous avons investi dans notre journalisme européen, recruté de nouveaux correspondants sur le continent et publié plus de 10 000 articles sur les affaires européennes. Nous comptons désormais environ 180 000 de nos contributeurs en Europe.`,
`Afin que ce travail essentiel perdure dans les années à venir, nous avons besoin du soutien des lecteurs. Si vous le pouvez, `,
],
epicHighlightedText: `une contribution de seulement 2 euros par mois peut dès aujourd’hui faire toute la différence. Merci.`,
},
DE: {
bannerHeader: 'Unterstützen Sie unabhängigen europäischen Journalismus',
epicHeader: 'Header (German)',
epicParagraphs: ['Para1 (German)', 'Para2 (German)', 'Para3 (German)', 'Para4 (German), '],
epicHighlightedText: `Highlight (German)`,
},
IT: {
bannerHeader: 'Sostieni un giornalismo europeo indipendente',
},
NL: {
bannerHeader: 'Steun de onafhankelijke journalistiek',
epicHeader: 'Header (Dutch)',
epicParagraphs: ['Para1 (Dutch)', 'Para2 (Dutch)', 'Para3 (Dutch), '],
epicHighlightedText: `Highlight (Dutch)`,
},
SE: {
bannerHeader: 'Var med och stöd oberoende journalistik i Europa',
},
SP: {
bannerHeader: 'Fomentar el periodismo europeo independiente',
},
};

export const countryCodeToVerfiedLocalLanguage = (
testName: string,
variantName: string,
countryCode?: string,
dfltLocalLanguage?: LocalLanguage,
): LocalLanguage | undefined => {
const hasCountryLanguageOrDefault = localLanguages[countryCode] || dfltLocalLanguage;
if (
testName === (LocalLanguageEpicTestName || LocalLanguageBannerTestName) &&
variantName === (LocalLanguageEpicVariant || LocalLanguageBannerVariant) &&
hasCountryLanguageOrDefault
) {
return (
localLanguages[countryCode] ?? {
bannerHeader: dfltLocalLanguage?.bannerHeader,
epicHeader: dfltLocalLanguage?.epicHeader,
epicParagraphs: dfltLocalLanguage?.epicParagraphs,
epicHighlightedText: dfltLocalLanguage?.epicHighlightedText,
}
);
}
};