mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-16 18:46:57 +02:00
Issue 305 broken link because of language fixes (#322)
* without having having to worry about site design. Let me know if double having is intentional * distinguish case of no translation and en lang * prettier recommends * distinguish case of no translation and en lang * prettier recommends * merge with latest origin/master changes * typo * link with language fixes * do not show language dropdown if only one enabled * check translation outside of LanguageDropDown.render
This commit is contained in:
parent
4a3da1f30a
commit
a5e963dba1
8 changed files with 177 additions and 175 deletions
66
lib/server/env.js
Normal file
66
lib/server/env.js
Normal file
|
@ -0,0 +1,66 @@
|
|||
/**
|
||||
* Copyright (c) 2017-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
const CWD = process.cwd();
|
||||
const fs = require('fs-extra');
|
||||
const path = require('path');
|
||||
|
||||
const join = path.join;
|
||||
|
||||
const languages_js = join(CWD, 'languages.js');
|
||||
const versions_json = join(CWD, 'versions.json');
|
||||
|
||||
class Translation {
|
||||
constructor() {
|
||||
this.enabled = false;
|
||||
this.languages = [
|
||||
{
|
||||
enabled: true,
|
||||
name: 'English',
|
||||
tag: 'en',
|
||||
},
|
||||
];
|
||||
|
||||
this._load();
|
||||
}
|
||||
|
||||
enabledLanguages() {
|
||||
return this.languages.filter(lang => lang.enabled);
|
||||
}
|
||||
|
||||
_load() {
|
||||
if (fs.existsSync(languages_js)) {
|
||||
this.enabled = true;
|
||||
this.languages = require(languages_js);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Versioning {
|
||||
constructor() {
|
||||
this.enabled = false;
|
||||
this.latestVersion = null;
|
||||
this.versions = [];
|
||||
|
||||
this._load();
|
||||
}
|
||||
|
||||
_load() {
|
||||
if (fs.existsSync(versions_json)) {
|
||||
this.enabled = true;
|
||||
this.versions = JSON.parse(fs.readFileSync(versions_json, 'utf8'));
|
||||
this.latestVersion = this.versions[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const env = {
|
||||
translation: new Translation(),
|
||||
versioning: new Versioning(),
|
||||
};
|
||||
|
||||
module.exports = env;
|
|
@ -20,30 +20,15 @@ function execute() {
|
|||
const glob = require('glob');
|
||||
const chalk = require('chalk');
|
||||
const Site = require('../core/Site.js');
|
||||
const env = require('./env.js');
|
||||
const siteConfig = require(CWD + '/siteConfig.js');
|
||||
const translate = require('./translate.js');
|
||||
const versionFallback = require('./versionFallback.js');
|
||||
|
||||
const feed = require('./feed.js');
|
||||
const sitemap = require('./sitemap.js');
|
||||
|
||||
const join = path.join;
|
||||
|
||||
const ENABLE_TRANSLATION = fs.existsSync(join(CWD, 'languages.js'));
|
||||
const ENABLE_VERSIONING = fs.existsSync(join(CWD, 'versions.json'));
|
||||
|
||||
let languages;
|
||||
if (ENABLE_TRANSLATION) {
|
||||
languages = require(CWD + '/languages.js');
|
||||
} else {
|
||||
languages = [
|
||||
{
|
||||
enabled: true,
|
||||
name: 'English',
|
||||
tag: 'en',
|
||||
},
|
||||
];
|
||||
}
|
||||
// create the folder path for a file if it does not exist, then write the file
|
||||
function writeFileAndCreateFolder(file, content) {
|
||||
mkdirp.sync(file.replace(new RegExp('/[^/]*$'), ''));
|
||||
|
@ -87,10 +72,9 @@ function execute() {
|
|||
console.log('generate.js triggered...');
|
||||
|
||||
// array of tags of enabled languages
|
||||
const enabledLanguages = [];
|
||||
languages.filter(lang => lang.enabled).map(lang => {
|
||||
enabledLanguages.push(lang.tag);
|
||||
});
|
||||
const enabledLanguages = env.translation
|
||||
.enabledLanguages()
|
||||
.map(lang => lang.tag);
|
||||
|
||||
readMetadata.generateMetadataDocs();
|
||||
const Metadata = require('../core/metadata.js');
|
||||
|
@ -134,7 +118,7 @@ function execute() {
|
|||
// determine what file to use according to its id
|
||||
let file;
|
||||
if (metadata.original_id) {
|
||||
if (ENABLE_TRANSLATION && metadata.language !== 'en') {
|
||||
if (env.translation.enabled && metadata.language !== 'en') {
|
||||
file = join(CWD, 'translated_docs', metadata.language, metadata.source);
|
||||
} else {
|
||||
file = join(CWD, 'versioned_docs', metadata.source);
|
||||
|
@ -161,12 +145,7 @@ function execute() {
|
|||
rawContent = insertTableOfContents(rawContent);
|
||||
}
|
||||
|
||||
let latestVersion;
|
||||
if (ENABLE_VERSIONING) {
|
||||
latestVersion = JSON.parse(
|
||||
fs.readFileSync(join(CWD, 'versions.json'), 'utf8')
|
||||
)[0];
|
||||
}
|
||||
let latestVersion = env.versioning.latestVersion;
|
||||
|
||||
// replace any links to markdown files to their website html links
|
||||
Object.keys(mdToHtml).forEach(function(key, index) {
|
||||
|
@ -207,7 +186,10 @@ function execute() {
|
|||
writeFileAndCreateFolder(targetFile, str);
|
||||
|
||||
// generate english page redirects when languages are enabled
|
||||
if (ENABLE_TRANSLATION && metadata.permalink.indexOf('docs/en') !== -1) {
|
||||
if (
|
||||
env.translation.enabled &&
|
||||
metadata.permalink.indexOf('docs/en') !== -1
|
||||
) {
|
||||
const redirectComp = (
|
||||
<Redirect
|
||||
metadata={metadata}
|
||||
|
@ -443,21 +425,26 @@ function execute() {
|
|||
str
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// allow for rendering of other files not in pages/en folder
|
||||
let language = 'en';
|
||||
for (let i = 0; i < langParts.length; i++) {
|
||||
if (enabledLanguages.indexOf(langParts[i]) !== -1) {
|
||||
language = langParts[i];
|
||||
}
|
||||
}
|
||||
|
||||
// write to base level
|
||||
let language = env.translation.enabled ? 'en' : '';
|
||||
translate.setLanguage(language);
|
||||
const str = renderToStaticMarkup(
|
||||
<Site language={language} config={siteConfig}>
|
||||
<ReactComp language={language} />
|
||||
</Site>
|
||||
);
|
||||
writeFileAndCreateFolder(targetFile, str);
|
||||
writeFileAndCreateFolder(targetFile.replace('/en/', '/'), str);
|
||||
} else {
|
||||
// allow for rendering of other files not in pages/en folder
|
||||
let language = env.translation.enabled ? 'en' : '';
|
||||
translate.setLanguage(language);
|
||||
const str = renderToStaticMarkup(
|
||||
<Site language={language} config={siteConfig}>
|
||||
<ReactComp language={language} />
|
||||
</Site>
|
||||
);
|
||||
writeFileAndCreateFolder(targetFile.replace('/en/', '/'), str);
|
||||
}
|
||||
fs.removeSync(tempFile);
|
||||
} else if (!fs.lstatSync(file).isDirectory()) {
|
||||
|
@ -469,15 +456,6 @@ function execute() {
|
|||
}
|
||||
});
|
||||
|
||||
// copy html files in 'en' to base level as well
|
||||
files = glob.sync(join(buildDir, 'en', '**'));
|
||||
files.forEach(file => {
|
||||
let targetFile = file.replace(join(buildDir, 'en'), join(buildDir));
|
||||
if (file.match(/\.html$/)) {
|
||||
fs.copySync(file, targetFile);
|
||||
}
|
||||
});
|
||||
|
||||
// Generate CNAME file if a custom domain is specified in siteConfig
|
||||
if (siteConfig.cname) {
|
||||
let targetFile = join(buildDir, 'CNAME');
|
||||
|
|
|
@ -11,25 +11,12 @@ const path = require('path');
|
|||
const fs = require('fs');
|
||||
const glob = require('glob');
|
||||
const chalk = require('chalk');
|
||||
|
||||
const env = require('./env');
|
||||
const siteConfig = require(CWD + '/siteConfig.js');
|
||||
const versionFallback = require('./versionFallback.js');
|
||||
const escapeStringRegexp = require('escape-string-regexp');
|
||||
|
||||
const ENABLE_VERSIONING = fs.existsSync(CWD + '/versions.json');
|
||||
|
||||
let languages;
|
||||
if (fs.existsSync(CWD + '/languages.js')) {
|
||||
languages = require(CWD + '/languages.js');
|
||||
} else {
|
||||
languages = [
|
||||
{
|
||||
enabled: true,
|
||||
name: 'English',
|
||||
tag: 'en',
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
// Can have a custom docs path. Top level folder still needs to be in directory
|
||||
// at the same level as `website`, not inside `website`.
|
||||
// e.g., docs/whereDocsReallyExist
|
||||
|
@ -129,11 +116,8 @@ function processMetadata(file) {
|
|||
'/' + escapeStringRegexp(getDocsPath()) + '/(.*)/.*/'
|
||||
);
|
||||
|
||||
let language = 'en';
|
||||
const match = regexSubFolder.exec(file);
|
||||
if (match) {
|
||||
language = match[1];
|
||||
}
|
||||
let language = match ? match[1] : 'en';
|
||||
|
||||
const metadata = result.metadata;
|
||||
const rawContent = result.rawContent;
|
||||
|
@ -149,28 +133,20 @@ function processMetadata(file) {
|
|||
metadata.title = metadata.id;
|
||||
}
|
||||
|
||||
if (languages.length === 1 && !siteConfig.useEnglishUrl) {
|
||||
metadata.permalink = 'docs/' + metadata.id + '.html';
|
||||
} else {
|
||||
metadata.permalink = 'docs/' + language + '/' + metadata.id + '.html';
|
||||
const langPart =
|
||||
env.translation.enabled || siteConfig.useEnglishUrl ? language + '/' : '';
|
||||
let versionPart = '';
|
||||
if (env.versioning.enabled) {
|
||||
metadata.version = 'next';
|
||||
versionPart = 'next/';
|
||||
}
|
||||
|
||||
if (ENABLE_VERSIONING) {
|
||||
metadata.version = 'next';
|
||||
if (languages.length === 1 && !siteConfig.useEnglishUrl) {
|
||||
metadata.permalink = metadata.permalink.replace('docs/', 'docs/next/');
|
||||
} else {
|
||||
metadata.permalink = metadata.permalink.replace(
|
||||
'docs/' + language + '/',
|
||||
'docs/' + language + '/next/'
|
||||
);
|
||||
}
|
||||
}
|
||||
metadata.permalink = 'docs/' + langPart + versionPart + metadata.id + '.html';
|
||||
|
||||
// change ids previous, next
|
||||
metadata.localized_id = metadata.id;
|
||||
metadata.id = language + '-' + metadata.id;
|
||||
metadata.language = language;
|
||||
metadata.id = (env.translation.enabled ? language + '-' : '') + metadata.id;
|
||||
metadata.language = env.translation.enabled ? language : 'en';
|
||||
|
||||
const order = readSidebar();
|
||||
const id = metadata.localized_id;
|
||||
|
@ -181,11 +157,13 @@ function processMetadata(file) {
|
|||
|
||||
if (order[id].next) {
|
||||
metadata.next_id = order[id].next;
|
||||
metadata.next = language + '-' + order[id].next;
|
||||
metadata.next =
|
||||
(env.translation.enabled ? language + '-' : '') + order[id].next;
|
||||
}
|
||||
if (order[id].previous) {
|
||||
metadata.previous_id = order[id].previous;
|
||||
metadata.previous = language + '-' + order[id].previous;
|
||||
metadata.previous =
|
||||
(env.translation.enabled ? language + '-' : '') + order[id].previous;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -204,10 +182,9 @@ function generateMetadataDocs() {
|
|||
|
||||
const regexSubFolder = /translated_docs\/(.*)\/.*/;
|
||||
|
||||
const enabledLanguages = [];
|
||||
languages.filter(lang => lang.enabled).map(lang => {
|
||||
enabledLanguages.push(lang.tag);
|
||||
});
|
||||
const enabledLanguages = env.translation
|
||||
.enabledLanguages()
|
||||
.map(language => language.tag);
|
||||
|
||||
const metadatas = {};
|
||||
const defaultMetadatas = {};
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
function execute(port) {
|
||||
const extractTranslations = require('../write-translations.js');
|
||||
|
||||
const env = require('./env.js');
|
||||
const translation = require('./translation.js');
|
||||
const express = require('express');
|
||||
const React = require('react');
|
||||
|
@ -23,15 +24,12 @@ function execute(port) {
|
|||
const glob = require('glob');
|
||||
const chalk = require('chalk');
|
||||
const translate = require('./translate.js');
|
||||
const versionFallback = require('./versionFallback');
|
||||
|
||||
const feed = require('./feed.js');
|
||||
const sitemap = require('./sitemap.js');
|
||||
// const sitemap = require("sitemap");
|
||||
|
||||
const CWD = process.cwd();
|
||||
const ENABLE_TRANSLATION = fs.existsSync(CWD + '/languages.js');
|
||||
const ENABLE_VERSIONING = fs.existsSync(CWD + '/versions.json');
|
||||
|
||||
// remove a module and child modules from require cache, so server does not have
|
||||
// to be restarted
|
||||
|
@ -168,14 +166,14 @@ function execute(port) {
|
|||
// determine what file to use according to its id
|
||||
let file;
|
||||
if (metadata.original_id) {
|
||||
if (ENABLE_TRANSLATION && metadata.language !== 'en') {
|
||||
if (env.translation.enabled && metadata.language !== 'en') {
|
||||
file =
|
||||
CWD + '/translated_docs/' + metadata.language + '/' + metadata.source;
|
||||
} else {
|
||||
file = CWD + '/versioned_docs/' + metadata.source;
|
||||
}
|
||||
} else {
|
||||
if (metadata.language === 'en') {
|
||||
if (!env.translation.enabled || metadata.language === 'en') {
|
||||
file =
|
||||
CWD + '/../' + readMetadata.getDocsPath() + '/' + metadata.source;
|
||||
} else {
|
||||
|
@ -197,12 +195,7 @@ function execute(port) {
|
|||
rawContent = insertTableOfContents(rawContent);
|
||||
}
|
||||
|
||||
let latestVersion;
|
||||
if (ENABLE_VERSIONING) {
|
||||
latestVersion = JSON.parse(
|
||||
fs.readFileSync(CWD + '/versions.json', 'utf8')
|
||||
)[0];
|
||||
}
|
||||
let latestVersion = env.latestVersion;
|
||||
|
||||
// replace any links to markdown files to their website html links
|
||||
Object.keys(mdToHtml).forEach(function(key, index) {
|
||||
|
@ -383,21 +376,21 @@ function execute(port) {
|
|||
file = file.replace(siteConfig.baseUrl, '');
|
||||
let userFile = CWD + '/pages/' + file;
|
||||
|
||||
let language = 'en';
|
||||
let language = env.translation.enabled ? 'en' : '';
|
||||
const regexLang = /(.*)\/.*\.html$/;
|
||||
const match = regexLang.exec(req.path);
|
||||
const parts = match[1].split('/');
|
||||
const enabledLangTags = [];
|
||||
for (let i = 0; i < translation['languages'].length; i++) {
|
||||
enabledLangTags.push(translation['languages'][i].tag);
|
||||
}
|
||||
const enabledLangTags = env.translation
|
||||
.enabledLanguages()
|
||||
.map(lang => lang.tag);
|
||||
|
||||
for (let i = 0; i < parts.length; i++) {
|
||||
if (enabledLangTags.indexOf(parts[i]) !== -1) {
|
||||
language = parts[i];
|
||||
}
|
||||
}
|
||||
let englishFile = CWD + '/pages/' + file;
|
||||
if (language !== 'en') {
|
||||
if (language && language !== 'en') {
|
||||
englishFile = englishFile.replace('/' + language + '/', '/en/');
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue