diff --git a/docs/configuration.md b/docs/configuration.md index 828ea61ae..532eccd8d 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -413,3 +413,25 @@ window.$docsify = { ext: '.md' }; ``` + +## fallbackLanguages + +* type: `Array` + +List of languages that will fallback to the default language when a page is request and didn't exists for the given local. + +Example: + + - try to fetch the page of `/de/overview`. If this page exists, it'll be displayed + - then try to fetch the default page `/overview` (depending on the default language). If this page exists, it'll be displayed + - then display 404 page. + + +```js +window.$docsify = { + fallbackLanguages: [ + "fr", + "de" + ] +}; +``` diff --git a/src/core/fetch/index.js b/src/core/fetch/index.js index 3361581fc..035f2ef3f 100644 --- a/src/core/fetch/index.js +++ b/src/core/fetch/index.js @@ -22,18 +22,40 @@ export function fetchMixin (proto) { proto._fetch = function (cb = noop) { const { path, query } = this.route const qs = stringifyQuery(query, ['id']) - const { loadNavbar, loadSidebar, requestHeaders } = this.config - + const { loadNavbar, loadSidebar, requestHeaders, fallbackLanguages } = this.config // Abort last request last && last.abort && last.abort() const file = this.router.getFile(path) - last = get(file + qs, true, requestHeaders) // Current page is html this.isHTML = /\.html$/g.test(file) + const getFallBackPage = (file) => { + if (!fallbackLanguages) { + return false + } + + const local = file.split('/')[1] + + if (fallbackLanguages.indexOf(local) === -1) { + return false + } + + file = file.replace(new RegExp(`^/${local}`), '') + + return get(file + qs, true, requestHeaders) + .then( + (text, opt) => { + this._renderMain(text, opt, loadSideAndNav) + }, + _ => { + return this._renderMain(null, {}, loadSideAndNav) + } + ) + } + const loadSideAndNav = () => { if (!loadSidebar) return cb() @@ -47,14 +69,15 @@ export function fetchMixin (proto) { } // Load main content - last.then( - (text, opt) => { - this._renderMain(text, opt, loadSideAndNav) - }, - _ => { - this._renderMain(null, {}, loadSideAndNav) - } - ) + last + .then( + (text, opt) => { + this._renderMain(text, opt, loadSideAndNav) + }, + _ => { + return getFallBackPage(file) || this._renderMain(null, {}, loadSideAndNav) + } + ) // Load nav loadNavbar &&