feat(fetch): Add fallback languages configuration. (#402)

fallbackLanguages give the possibility to configure a list of languages which must used the default language when a page is missing in the requested language.
This commit is contained in:
Romain Lenzotti 2018-03-01 15:37:30 +01:00 committed by cinwell.li
parent 278a75ebd5
commit ecc0e04c70
2 changed files with 56 additions and 11 deletions

View File

@ -413,3 +413,25 @@ window.$docsify = {
ext: '.md'
};
```
## fallbackLanguages
* type: `Array<string>`
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"
]
};
```

View File

@ -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 &&