@@ -3,7 +3,8 @@ import {CreatePageArgs, Page} from 'gatsby';
33import BP from 'bluebird' ;
44import fs from 'fs' ;
55import util from 'util' ;
6- import { PageContext , PluginOptions , Resources } from '../types' ;
6+ import { match } from 'path-to-regexp' ;
7+ import { PageContext , PageOptions , PluginOptions , Resources } from '../types' ;
78
89const readFile = util . promisify ( fs . readFile ) ;
910const glob = util . promisify ( _glob ) ;
@@ -32,39 +33,82 @@ export const onCreatePage = async (
3233 }
3334
3435 const { createPage, deletePage} = actions ;
35- const { defaultLanguage = 'en' , languages = [ 'en' ] , path } = pluginOptions ;
36+ const { defaultLanguage = 'en' , languages = [ 'en' ] , pages = [ ] } = pluginOptions ;
3637
37- const generatePage = async ( language : string , routed = false ) : Promise < Page < PageContext > > => {
38- const resources = await getResources ( path , language ) ;
39- const newPath = routed ? `${ language } ${ page . path } ` : page . path ;
38+ type GeneratePageParams = {
39+ language : string ;
40+ path ?: string ;
41+ originalPath ?: string ;
42+ routed ?: boolean ;
43+ pageOptions ?: PageOptions ;
44+ } ;
45+ const generatePage = async ( {
46+ language,
47+ path = page . path ,
48+ originalPath = page . path ,
49+ routed = false ,
50+ pageOptions
51+ } : GeneratePageParams ) : Promise < Page < PageContext > > => {
52+ const resources = await getResources ( pluginOptions . path , language ) ;
4053 return {
4154 ...page ,
42- path : newPath ,
55+ path,
4356 context : {
4457 ...page . context ,
4558 language,
4659 i18n : {
4760 language,
48- languages,
61+ languages : pageOptions ?. languages || languages ,
4962 defaultLanguage,
5063 routed,
5164 resources,
52- originalPath : page . path ,
53- path : newPath
65+ originalPath,
66+ path
5467 }
5568 }
5669 } ;
5770 } ;
5871
59- const newPage = await generatePage ( defaultLanguage ) ;
72+ const pageOptions = pages . find ( ( opt ) => match ( opt . matchPath ) ( page . path ) ) ;
73+
74+ let newPage ;
75+ let alternativeLanguages = languages . filter ( ( lng ) => lng !== defaultLanguage ) ;
76+
77+ if ( pageOptions ?. excludeLanguages ) {
78+ alternativeLanguages = alternativeLanguages . filter (
79+ ( lng ) => ! pageOptions ?. excludeLanguages ?. includes ( lng )
80+ ) ;
81+ }
82+
83+ if ( pageOptions ?. languages ) {
84+ alternativeLanguages = pageOptions . languages . filter ( ( lng ) => lng !== defaultLanguage ) ;
85+ }
86+
87+ if ( pageOptions ?. getLanguageFromPath ) {
88+ const result = match < { lang : string } > ( pageOptions . matchPath ) ( page . path ) ;
89+ if ( ! result ) return ;
90+ const language = result . params . lang || defaultLanguage ;
91+ const originalPath = page . path . replace ( `/${ language } ` , '' ) ;
92+ const routed = Boolean ( result . params . lang ) ;
93+ newPage = await generatePage ( { language, originalPath, routed, pageOptions} ) ;
94+ if ( routed || ! pageOptions . excludeLanguages ) {
95+ alternativeLanguages = [ ] ;
96+ }
97+ } else {
98+ newPage = await generatePage ( { language : defaultLanguage , pageOptions} ) ;
99+ }
100+
60101 try {
61102 deletePage ( page ) ;
62103 } catch { }
63104 createPage ( newPage ) ;
64105
65- await BP . map ( languages , async ( lng ) => {
66- if ( lng === defaultLanguage ) return ;
67- const localePage = await generatePage ( lng , true ) ;
106+ await BP . map ( alternativeLanguages , async ( lng ) => {
107+ const localePage = await generatePage ( {
108+ language : lng ,
109+ path : `${ lng } ${ page . path } ` ,
110+ routed : true
111+ } ) ;
68112 const regexp = new RegExp ( '/404/?$' ) ;
69113 if ( regexp . test ( localePage . path ) ) {
70114 localePage . matchPath = `/${ lng } /*` ;
0 commit comments