diff --git a/crowdin.yaml b/crowdin.yaml index 299c305ead43..1ebe5fbde688 100644 --- a/crowdin.yaml +++ b/crowdin.yaml @@ -43,6 +43,10 @@ files: 'vi': 'vi' 'zh-CN': 'zh-CN' 'zh-TW': 'zh-TW' + - + source: '/website/versioned_docs/**/*.md' + translation: '/website/translated_docs/%locale%/**/%original_file_name%' + languages_mapping: *anchor - source: '/website/i18n/en.json' translation: '/website/i18n/%locale%.json' diff --git a/docs/api-site-config.md b/docs/api-site-config.md index 8f36a49377b1..95fbe89495f6 100644 --- a/docs/api-site-config.md +++ b/docs/api-site-config.md @@ -74,6 +74,8 @@ headerLinks: [ `blogSidebarCount` - Control the number of blog posts that show up in the sidebar. See the [adding a blog docs](guides-blog.md#changing-how-many-blog-posts-show-on-sidebar) for more information. +`cleanUrl` - If `true`, allow URLs with no `html` extension. Example: request to URL https://docusaurus.io/docs/installation will returns the same result as https://docusaurus.io/docs/installation.html. + `cname` - The CNAME for your website. It will go into a `CNAME` file when your site it built. `customDocsPath` - By default, Docusaurus expects your documentation to be in a directory called `docs`. This directory is at the same level as the `website` directory (i.e., not inside the `website` directory). You can specify a custom path to your documentation with this field. **Note that all of your documentation `*.md` files must still reside in a flat hierarchy. You cannot have your documents in nested directories**. @@ -153,6 +155,10 @@ h1 { `separateCss` - Folders inside which any `css` files will not be processed and concatenated to Docusaurus' styles. This is to support static `html` pages that may be separate from Docusaurus with completely separate styles. +`scrollToTop` - Set this to `true` if you want to enable the scroll to top button at the bottom of your site. + +`scrollToTopOptions` - Optional options configuration for the scroll to top button. You do not need to use this, even if you set `scrollToTop` to `true`; it just provides you more configuration control of the button. You can find more options [here](https://github.com/vfeskov/vanilla-back-to-top/blob/v7.1.14/OPTIONS.md). By default, we set the zIndex option to 100. + `stylesheets` - Array of CSS sources to load. The link tag will be inserted in the HTML head. `translationRecruitingLink` - URL for the `Help Translate` tab of language selection when languages besides English are enabled. This can be included you are using translations but does not have to be. @@ -246,6 +252,11 @@ const siteConfig = { twitterUsername: 'docusaurus', twitterImage: 'img/docusaurus.png', ogImage: 'img/docusaurus.png', + cleanUrl: true, + scrollToTop: true, + scrollToTopOptions: { + zIndex: 100 + } }; module.exports = siteConfig; diff --git a/examples/basics/gitignore b/examples/basics/gitignore index 0a65d6d4da57..5395ea795d62 100644 --- a/examples/basics/gitignore +++ b/examples/basics/gitignore @@ -10,4 +10,3 @@ website/build/ website/yarn.lock website/node_modules website/i18n/* -!website/i18n/en.json diff --git a/lib/core/BlogPageLayout.js b/lib/core/BlogPageLayout.js index 77cf2116de26..e3a815f4e713 100644 --- a/lib/core/BlogPageLayout.js +++ b/lib/core/BlogPageLayout.js @@ -11,6 +11,7 @@ const Container = require('./Container.js'); const MetadataBlog = require('./MetadataBlog.js'); const React = require('react'); const Site = require('./Site.js'); +const utils = require('./utils.js'); // used to generate entire blog pages, i.e. collection of truncated blog posts class BlogPageLayout extends React.Component { @@ -45,7 +46,10 @@ class BlogPageLayout extends React.Component { post={post} content={post.content} truncate={true} - key={post.path + post.title} + key={ + utils.getPath(post.path, this.props.config.cleanUrl) + + post.title + } config={this.props.config} /> ); diff --git a/lib/core/BlogPost.js b/lib/core/BlogPost.js index 09c051b4f769..19126dcb94b0 100644 --- a/lib/core/BlogPost.js +++ b/lib/core/BlogPost.js @@ -8,7 +8,7 @@ const MarkdownBlock = require('./MarkdownBlock.js'); const React = require('react'); -const utils = require('./utils'); +const utils = require('./utils.js'); // inner blog component for the article itself, without sidebar/header/footer class BlogPost extends React.Component { @@ -24,7 +24,12 @@ class BlogPost extends React.Component { Read More @@ -73,7 +78,12 @@ class BlogPost extends React.Component { const post = this.props.post; return (

- + {post.title}

diff --git a/lib/core/BlogPostLayout.js b/lib/core/BlogPostLayout.js index 9b1e0c6f983f..e4327a6efaa8 100644 --- a/lib/core/BlogPostLayout.js +++ b/lib/core/BlogPostLayout.js @@ -10,11 +10,14 @@ const BlogPost = require('./BlogPost.js'); const BlogSidebar = require('./BlogSidebar.js'); const Container = require('./Container.js'); const Site = require('./Site.js'); +const OnPageNav = require('./nav/OnPageNav.js'); +const utils = require('./utils.js'); // used for entire blog posts, i.e., each written blog article with sidebar with site header/footer class BlogPostLayout extends React.Component { renderSocialButtons() { - const post = this.props.metadata; + let post = this.props.metadata; + post.path = utils.getPath(post.path, this.props.config.cleanUrl); const fbComment = this.props.config.facebookAppId && this.props.config.facebookComments && ( @@ -92,10 +95,12 @@ class BlogPostLayout extends React.Component { } render() { + let post = this.props.metadata; + post.path = utils.getPath(post.path, this.props.config.cleanUrl); return (
+ {this.props.config.onPageNav == 'separate' && ( + + )}
); diff --git a/lib/core/DocsLayout.js b/lib/core/DocsLayout.js index 06503c76c018..6314d3ba4426 100644 --- a/lib/core/DocsLayout.js +++ b/lib/core/DocsLayout.js @@ -17,11 +17,12 @@ const path = require('path'); // component used to generate whole webpage for docs, including sidebar/header/footer class DocsLayout extends React.Component { getRelativeURL = (from, to) => { + const extension = this.props.config.cleanUrl ? '' : '.html'; return ( path .relative(from, to) .replace('\\', '/') - .replace(/^\.\.\//, '') + '.html' + .replace(/^\.\.\//, '') + extension ); }; diff --git a/lib/core/Head.js b/lib/core/Head.js index 04d68e080bd6..1334796bef7d 100644 --- a/lib/core/Head.js +++ b/lib/core/Head.js @@ -149,6 +149,33 @@ class Head extends React.Component { ); })} + {this.props.config.scrollToTop && ( +