Skip to content

Commit 6a94ad9

Browse files
authored
feat(v2): Add i18n default code translation bundles (#4215)
* Add default code translation bundles * fix tests
1 parent 1b3c9be commit 6a94ad9

File tree

12 files changed

+430
-5
lines changed

12 files changed

+430
-5
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"theme.NotFound.title": "Page introuvable",
3+
"theme.NotFound.p1": "Nous n'avons pas trouvé ce que vous recherchez.",
4+
"theme.NotFound.p2": "Veuillez contacter le propriétaire du site qui vous a lié à l'URL d'origine et leur faire savoir que leur lien est cassé.",
5+
"theme.BlogListPaginator.newerEntries": "Nouvelles entrées",
6+
"theme.BlogListPaginator.olderEntries": "Anciennes entrées",
7+
"theme.BlogPostItem.readMore": "Lire plus",
8+
"theme.BlogPostPaginator.newerPost": "Article plus récent",
9+
"theme.BlogPostPaginator.olderPost": "Article plus ancien",
10+
"theme.CodeBlock.copied": "Copié",
11+
"theme.CodeBlock.copy": "Copier",
12+
"theme.DocPaginator.previous": "Précédent",
13+
"theme.DocPaginator.next": "Suivant",
14+
"theme.EditThisPage.editThisPage": "Éditer cette page",
15+
"theme.SkipToContent.skipToMainContent": "Aller au contenu principal",
16+
"theme.Playground.liveEditor": "Éditeur en direct",
17+
"theme.Playground.result": "Résultat"
18+
}

packages/docusaurus-theme-classic/src/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import path from 'path';
1111
import Module from 'module';
1212
import postcss from 'postcss';
1313
import rtlcss from 'rtlcss';
14+
import {readDefaultCodeTranslationMessages} from '@docusaurus/utils';
1415

1516
const createRequire = Module.createRequire || Module.createRequireFromPath;
1617
const requireFromDocusaurusCore = createRequire(
@@ -103,6 +104,13 @@ export default function docusaurusThemeClassic(
103104
getTranslationFiles: async () => getTranslationFiles({themeConfig}),
104105
translateThemeConfig,
105106

107+
getDefaultCodeTranslationMessages: () => {
108+
return readDefaultCodeTranslationMessages({
109+
dirPath: path.resolve(__dirname, '..', 'codeTranslations'),
110+
locale: currentLocale,
111+
});
112+
},
113+
106114
getClientModules() {
107115
const modules = [
108116
require.resolve(getInfimaCSSFile(direction)),

packages/docusaurus-types/src/index.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,12 @@ export interface Plugin<T, U = unknown> {
240240

241241
// translations
242242
getTranslationFiles?(): Promise<TranslationFiles>;
243+
getDefaultCodeTranslationMessages?(): Promise<
244+
Record<
245+
string, // id
246+
string // message
247+
>
248+
>;
243249
translateContent?({
244250
content,
245251
translationFiles,
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"id1": "message 1 en",
3+
"id2": "message 2 en"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"id1": "message 1 fr",
3+
"id2": "message 2 fr"
4+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"id1": "message 1 fr_FR",
3+
"id2": "message 2 fr_FR",
4+
"id3": "message 3 fr_FR"
5+
}

packages/docusaurus-utils/src/__tests__/index.test.ts

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
import path from 'path';
9+
import fs from 'fs-extra';
910
import {
1011
fileToPath,
1112
simpleHash,
@@ -33,6 +34,7 @@ import {
3334
findFolderContainingFile,
3435
getFolderContainingFile,
3536
updateTranslationFileMessages,
37+
readDefaultCodeTranslationMessages,
3638
} from '../index';
3739
import {sum} from 'lodash';
3840

@@ -718,3 +720,89 @@ describe('updateTranslationFileMessages', () => {
718720
});
719721
});
720722
});
723+
724+
describe('readDefaultCodeTranslationMessages', () => {
725+
const dirPath = path.resolve(
726+
__dirname,
727+
'__fixtures__',
728+
'defaultCodeTranslations',
729+
);
730+
731+
async function readAsJSON(filename: string) {
732+
return JSON.parse(
733+
await fs.readFile(path.resolve(dirPath, filename), 'utf8'),
734+
);
735+
}
736+
737+
test('for empty locale', async () => {
738+
await expect(
739+
readDefaultCodeTranslationMessages({
740+
locale: '',
741+
dirPath,
742+
}),
743+
).resolves.toEqual({});
744+
});
745+
746+
test('for unexisting locale', async () => {
747+
await expect(
748+
readDefaultCodeTranslationMessages({
749+
locale: 'es',
750+
dirPath,
751+
}),
752+
).resolves.toEqual({});
753+
});
754+
755+
test('for fr but bad folder', async () => {
756+
await expect(
757+
readDefaultCodeTranslationMessages({
758+
locale: '',
759+
dirPath: __dirname,
760+
}),
761+
).resolves.toEqual({});
762+
});
763+
764+
test('for fr', async () => {
765+
await expect(
766+
readDefaultCodeTranslationMessages({
767+
locale: 'fr',
768+
dirPath,
769+
}),
770+
).resolves.toEqual(await readAsJSON('fr.json'));
771+
});
772+
773+
test('for fr_FR', async () => {
774+
await expect(
775+
readDefaultCodeTranslationMessages({
776+
locale: 'fr_FR',
777+
dirPath,
778+
}),
779+
).resolves.toEqual(await readAsJSON('fr_FR.json'));
780+
});
781+
782+
test('for en', async () => {
783+
await expect(
784+
readDefaultCodeTranslationMessages({
785+
locale: 'en',
786+
dirPath,
787+
}),
788+
).resolves.toEqual(await readAsJSON('en.json'));
789+
});
790+
791+
test('for en_US', async () => {
792+
await expect(
793+
readDefaultCodeTranslationMessages({
794+
locale: 'en_US',
795+
dirPath,
796+
}),
797+
).resolves.toEqual(await readAsJSON('en.json'));
798+
});
799+
800+
test('for en_WHATEVER', async () => {
801+
await expect(
802+
readDefaultCodeTranslationMessages({
803+
locale: 'en_WHATEVER',
804+
dirPath,
805+
}),
806+
).resolves.toEqual(await readAsJSON('en.json'));
807+
});
808+
});

packages/docusaurus-utils/src/index.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,3 +602,35 @@ export function updateTranslationFileMessages(
602602
})),
603603
};
604604
}
605+
606+
export async function readDefaultCodeTranslationMessages({
607+
dirPath,
608+
locale,
609+
}: {
610+
dirPath: string;
611+
locale: string;
612+
}): Promise<Record<string, string>> {
613+
const fileNamesToTry = [locale];
614+
615+
if (locale.includes('_')) {
616+
const language = locale.split('_')[0];
617+
if (language) {
618+
fileNamesToTry.push(language);
619+
}
620+
}
621+
622+
// Return the content of the first file that match
623+
// fr_FR.json => fr.json => nothing
624+
for (const fileName of fileNamesToTry) {
625+
const filePath = path.resolve(dirPath, `${fileName}.json`);
626+
627+
// eslint-disable-next-line no-await-in-loop
628+
if (await fs.pathExists(filePath)) {
629+
// eslint-disable-next-line no-await-in-loop
630+
const fileContent = await fs.readFile(filePath, 'utf8');
631+
return JSON.parse(fileContent);
632+
}
633+
}
634+
635+
return {};
636+
}

packages/docusaurus/src/commands/writeTranslations.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import {
1111
writePluginTranslations,
1212
writeCodeTranslations,
1313
WriteTranslationsOptions,
14+
getPluginsDefaultCodeTranslationMessages,
15+
applyDefaultCodeTranslations,
1416
} from '../server/translations/translations';
1517
import {extractPluginsSourceCodeTranslations} from '../server/translations/translationsExtractor';
1618
import {getCustomBabelConfigFilePath, getBabelOptions} from '../webpack/utils';
@@ -47,7 +49,7 @@ export default async function writeTranslations(
4749
siteDir: string,
4850
options: WriteTranslationsOptions & {locale?: string},
4951
): Promise<void> {
50-
const context = await loadContext(siteDir);
52+
const context = await loadContext(siteDir, {locale: options.locale});
5153
const pluginConfigs = loadPluginConfigs(context);
5254
const plugins = initPlugins({
5355
pluginConfigs,
@@ -68,10 +70,19 @@ Available locales=[${context.i18n.locales.join(',')}]`,
6870
isServer: true,
6971
babelOptions: getCustomBabelConfigFilePath(siteDir),
7072
});
71-
const codeTranslations = await extractPluginsSourceCodeTranslations(
73+
const extractedCodeTranslations = await extractPluginsSourceCodeTranslations(
7274
plugins,
7375
babelOptions,
7476
);
77+
const defaultCodeMessages = await getPluginsDefaultCodeTranslationMessages(
78+
plugins,
79+
);
80+
81+
const codeTranslations = applyDefaultCodeTranslations({
82+
extractedCodeTranslations,
83+
defaultCodeMessages,
84+
});
85+
7586
await writeCodeTranslations({siteDir, locale}, codeTranslations, options);
7687

7788
await Promise.all(

packages/docusaurus/src/server/index.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ import {loadHtmlTags} from './html-tags';
3232
import {getPackageJsonVersion} from './versions';
3333
import {handleDuplicateRoutes} from './duplicateRoutes';
3434
import {loadI18n, localizePath} from './i18n';
35-
import {readCodeTranslationFileContent} from './translations/translations';
35+
import {
36+
readCodeTranslationFileContent,
37+
getPluginsDefaultCodeTranslationMessages,
38+
} from './translations/translations';
3639
import {mapValues} from 'lodash';
3740

3841
type LoadContextOptions = {
@@ -267,10 +270,15 @@ ${Object.keys(registry)
267270
JSON.stringify(i18n, null, 2),
268271
);
269272

273+
const codeTranslationsWithFallbacks: Record<string, string> = {
274+
...(await getPluginsDefaultCodeTranslationMessages(plugins)),
275+
...codeTranslations,
276+
};
277+
270278
const genCodeTranslations = generate(
271279
generatedFilesDir,
272280
'codeTranslations.json',
273-
JSON.stringify(codeTranslations, null, 2),
281+
JSON.stringify(codeTranslationsWithFallbacks, null, 2),
274282
);
275283

276284
// Version metadata.

0 commit comments

Comments
 (0)