Skip to content

Commit eb15b50

Browse files
authored
Merge pull request #44 from jngbng/pr_gen_default_lang_page
option to generate default language page
2 parents b671bda + d1fddaa commit eb15b50

File tree

7 files changed

+42
-17
lines changed

7 files changed

+42
-17
lines changed

README.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -266,16 +266,17 @@ const Header = ({siteTitle}) => {
266266

267267
## Plugin Options
268268

269-
| Option | Type | Description |
270-
| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
271-
| localeJsonSourceName | string | name of JSON translation file nodes that are loaded by `gatsby-source-filesystem` (set by `option.name`). Default is `locale` |
272-
| localeJsonNodeName | string | name of GraphQL node that holds locale data. Default is `locales` |
273-
| languages | string[] | supported language keys |
274-
| defaultLanguage | string | default language when visiting `/page` instead of `/es/page` |
275-
| redirect | boolean | if the value is `true`, `/` or `/page-2` will be redirected to the user's preferred language router. e.g) `/es` or `/es/page-2`. Otherwise, the pages will render `defaultLangugage` language. Default is `true` |
276-
| siteUrl | string | public site url, is used to generate language specific meta tags |
277-
| pages | array | an array of [page options](#page-options) used to modify plugin behaviour for specific pages |
278-
| i18nextOptions | object | [i18next configuration options](https://www.i18next.com/overview/configuration-options) |
269+
| Option | Type | Description |
270+
| --------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
271+
| localeJsonSourceName | string | name of JSON translation file nodes that are loaded by `gatsby-source-filesystem` (set by `option.name`). Default is `locale` |
272+
| localeJsonNodeName | string | name of GraphQL node that holds locale data. Default is `locales` |
273+
| languages | string[] | supported language keys |
274+
| defaultLanguage | string | default language when visiting `/page` instead of `/es/page` |
275+
| generateDefaultLanguagePage | string | generate dedicated page for default language. e.g) `/en/page`. It is useful when you need page urls for all languages. For example, server-side [redirect](https://www.gatsbyjs.com/docs/reference/config-files/actions/#createRedirect) using `Accept-Language` header. Default is `false`. |
276+
| redirect | boolean | if the value is `true`, `/` or `/page-2` will be redirected to the user's preferred language router. e.g) `/es` or `/es/page-2`. Otherwise, the pages will render `defaultLangugage` language. Default is `true` |
277+
| siteUrl | string | public site url, is used to generate language specific meta tags |
278+
| pages | array | an array of [page options](#page-options) used to modify plugin behaviour for specific pages |
279+
| i18nextOptions | object | [i18next configuration options](https://www.i18next.com/overview/configuration-options) |
279280

280281
## Page options
281282

src/Link.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ type Props = GatsbyLinkProps<any> & {language?: string};
88
export const Link: React.FC<Props> = ({language, to, onClick, ...rest}) => {
99
const context = useContext(I18nextContext);
1010
const urlLanguage = language || context.language;
11-
const link = urlLanguage !== context.defaultLanguage ? `/${urlLanguage}${to}` : to;
11+
const link = context.routed
12+
? `/${urlLanguage}${to}`
13+
: urlLanguage !== context.defaultLanguage
14+
? `/${urlLanguage}${to}`
15+
: to;
1216

1317
return (
1418
// @ts-ignore

src/i18nextContext.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export const I18nextContext = React.createContext<I18NextContext>({
66
languages: ['en'],
77
routed: false,
88
defaultLanguage: 'en',
9+
generateDefaultLanguagePage: false,
910
originalPath: '/',
1011
path: '/'
1112
});

src/plugin/onCreatePage.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ export const onCreatePage = async (
1313
}
1414

1515
const {createPage, deletePage} = actions;
16-
const {defaultLanguage = 'en', languages = ['en'], pages = []} = pluginOptions;
16+
const {
17+
defaultLanguage = 'en',
18+
generateDefaultLanguagePage = false,
19+
languages = ['en'],
20+
pages = []
21+
} = pluginOptions;
1722

1823
type GeneratePageParams = {
1924
language: string;
@@ -39,6 +44,7 @@ export const onCreatePage = async (
3944
language,
4045
languages: pageOptions?.languages || languages,
4146
defaultLanguage,
47+
generateDefaultLanguagePage,
4248
routed,
4349
originalPath,
4450
path
@@ -50,7 +56,9 @@ export const onCreatePage = async (
5056
const pageOptions = pages.find((opt) => match(opt.matchPath)(page.path));
5157

5258
let newPage;
53-
let alternativeLanguages = languages.filter((lng) => lng !== defaultLanguage);
59+
let alternativeLanguages = generateDefaultLanguagePage
60+
? languages
61+
: languages.filter((lng) => lng !== defaultLanguage);
5462

5563
if (pageOptions?.excludeLanguages) {
5664
alternativeLanguages = alternativeLanguages.filter(
@@ -59,7 +67,9 @@ export const onCreatePage = async (
5967
}
6068

6169
if (pageOptions?.languages) {
62-
alternativeLanguages = pageOptions.languages.filter((lng) => lng !== defaultLanguage);
70+
alternativeLanguages = generateDefaultLanguagePage
71+
? pageOptions.languages
72+
: pageOptions.languages.filter((lng) => lng !== defaultLanguage);
6373
}
6474

6575
if (pageOptions?.getLanguageFromPath) {

src/plugin/wrapPageElement.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,13 @@ const withI18next = (i18n: I18n, context: I18NextContext) => (children: any) =>
1818

1919
export const wrapPageElement = (
2020
{element, props}: WrapPageElementBrowserArgs<any, PageContext>,
21-
{i18nextOptions = {}, redirect = true, siteUrl, localeJsonNodeName = 'locales'}: PluginOptions
21+
{
22+
i18nextOptions = {},
23+
redirect = true,
24+
generateDefaultLanguagePage = false,
25+
siteUrl,
26+
localeJsonNodeName = 'locales'
27+
}: PluginOptions
2228
) => {
2329
if (!props) return;
2430
const {data, pageContext, location} = props;
@@ -114,6 +120,7 @@ export const wrapPageElement = (
114120
languages,
115121
originalPath,
116122
defaultLanguage,
123+
generateDefaultLanguagePage,
117124
siteUrl,
118125
path
119126
};

src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export type PageOptions = {
1313
export type PluginOptions = {
1414
languages: string[];
1515
defaultLanguage: string;
16+
generateDefaultLanguagePage: boolean;
1617
redirect: boolean;
1718
siteUrl?: string;
1819
i18nextOptions: InitOptions;
@@ -26,6 +27,7 @@ export type I18NextContext = {
2627
routed: boolean;
2728
languages: string[];
2829
defaultLanguage: string;
30+
generateDefaultLanguagePage: boolean;
2931
originalPath: string;
3032
path: string;
3133
siteUrl?: string;

src/useI18next.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ export const useI18next = (ns?: Namespace, options?: UseTranslationOptions) => {
1212
const {i18n, t, ready} = useTranslation(ns, options);
1313
const context = useContext(I18nextContext);
1414

15-
const {routed, defaultLanguage} = context;
15+
const {routed, defaultLanguage, generateDefaultLanguagePage} = context;
1616

1717
const getLanguagePath = (language: string) => {
18-
return language !== defaultLanguage ? `/${language}` : '';
18+
return generateDefaultLanguagePage || language !== defaultLanguage ? `/${language}` : '';
1919
};
2020

2121
const removePrefix = (pathname: string) => {

0 commit comments

Comments
 (0)