Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue 305 broken link because of language fixes #322

Merged
merged 15 commits into from
Dec 20, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 14 additions & 25 deletions examples/basics/core/Footer.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@
const React = require('react');

class Footer extends React.Component {
docUrl(doc, language) {
const baseUrl = this.props.config.baseUrl;
return baseUrl + 'docs/' + (language ? language + '/' : '') + doc;
}

pageUrl(doc, language) {
const baseUrl = this.props.config.baseUrl;
return baseUrl + (language ? language + '/' : '') + doc;
}

render() {
const currentYear = new Date().getFullYear();
return (
Expand All @@ -25,40 +35,19 @@ class Footer extends React.Component {
</a>
<div>
<h5>Docs</h5>
<a
href={
this.props.config.baseUrl +
'docs/' +
this.props.language +
'/doc1.html'
}>
<a href={this.docUrl('doc1.html', this.props.language)}>
Getting Started (or other categories)
</a>
<a
href={
this.props.config.baseUrl +
'docs/' +
this.props.language +
'/doc2.html'
}>
<a href={this.docUrl('doc2.html', this.props.language)}>
Guides (or other categories)
</a>
<a
href={
this.props.config.baseUrl +
'docs/' +
this.props.language +
'/doc3.html'
}>
<a href={this.docUrl('doc3.html', this.props.language)}>
API Reference (or other categories)
</a>
</div>
<div>
<h5>Community</h5>
<a
href={
this.props.config.baseUrl + this.props.language + '/users.html'
}>
<a href={this.pageUrl('users.html', this.props.language)}>
User Showcase
</a>
<a
Expand Down
8 changes: 4 additions & 4 deletions examples/basics/pages/en/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ function imgUrl(img) {
}

function docUrl(doc, language) {
return siteConfig.baseUrl + 'docs/' + language + '/' + doc;
return siteConfig.baseUrl + 'docs/' + (language ? language + '/' : '') + doc;
}

function pageUrl(page, language) {
return siteConfig.baseUrl + language + '/' + page;
return siteConfig.baseUrl + (language ? language + '/' : '') + page;
}

class Button extends React.Component {
Expand Down Expand Up @@ -73,7 +73,7 @@ const PromoSection = props => (

class HomeSplash extends React.Component {
render() {
let language = this.props.language || 'en';
let language = this.props.language || '';
return (
<SplashContainer>
<Logo img_src={imgUrl('docusaurus.svg')} />
Expand Down Expand Up @@ -198,7 +198,7 @@ const Showcase = props => {

class Index extends React.Component {
render() {
let language = this.props.language || 'en';
let language = this.props.language || '';

return (
<div>
Expand Down
1 change: 1 addition & 0 deletions lib/core/Doc.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class Doc extends React.Component {

// If internationalization is enabled, show Recruiting link instead of Edit Link.
if (
this.props.language &&
this.props.language != 'en' &&
this.props.config.translationRecruitingLink
) {
Expand Down
80 changes: 39 additions & 41 deletions lib/core/nav/HeaderNav.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,43 +11,32 @@ const React = require('react');
const fs = require('fs');
const siteConfig = require(CWD + '/siteConfig.js');
const translation = require('../../server/translation.js');
const env = require('../../server/env.js');

const translate = require('../../server/translate.js').translate;
const setLanguage = require('../../server/translate.js').setLanguage;

const ENABLE_TRANSLATION = fs.existsSync(CWD + '/languages.js');
const ENABLE_VERSIONING = fs.existsSync(CWD + '/versions.json');
let versions;
if (ENABLE_VERSIONING) {
versions = require(CWD + '/versions.json');
}
const readMetadata = require('../../server/readMetadata.js');
readMetadata.generateMetadataDocs();
const Metadata = require('../metadata.js');

// language dropdown nav item for when translations are enabled
class LanguageDropDown extends React.Component {
render() {
const enabledLanguages = [];
let currentLanguage = 'English';
setLanguage(this.props.language);
setLanguage(this.props.language || 'en');
let helpTranslateString = translate(
'Help Translate|recruit community translators for your project'
);
// add all enabled languages to dropdown
translation['languages'].map(lang => {
if (lang.tag == this.props.language) {
currentLanguage = lang.name;
}
if (lang.tag == this.props.language) {
return;
}
enabledLanguages.push(
const enabledLanguages = env.translation
.enabledLanguages()
.filter(lang => lang !== this.props.language)
.map(lang => (
<li key={lang.tag}>
<a href={siteConfig.baseUrl + lang.tag}>{lang.name}</a>
</li>
);
});
));
// if no languages are enabled besides English, return null
if (enabledLanguages.length < 1) {
return null;
Expand Down Expand Up @@ -116,27 +105,32 @@ class HeaderNav extends React.Component {
</li>
);
} else if (link.languages) {
return (
// return language dropdown
<LanguageDropDown
baseUrl={this.props.baseUrl}
language={this.props.language}
key="languagedropdown"
/>
);
} else if (link.doc) {
// set link to document with current page's language/version
let id;
if (!ENABLE_VERSIONING || this.props.version === 'next') {
id = this.props.language + '-' + link.doc;
if (
env.translation.enabled &&
env.translation.enabledLanguages().length > 1
) {
return (
<LanguageDropDown
baseUrl={this.props.baseUrl}
language={this.props.language}
key="languagedropdown"
/>
);
} else {
id =
this.props.language +
'-version-' +
(this.props.version || versions[0]) +
'-' +
link.doc;
return null;
}
} else if (link.doc) {
// set link to document with current page's language/version
const langPart = env.translation.enabled
? (this.props.language || 'en') + '-'
: '';
const versionPart =
env.versioning.enabled && this.props.version !== 'next'
? '-version-' +
(this.props.version || env.versioning.latestVersion) +
'-'
: '';
const id = langPart + versionPart + link.doc;
if (!Metadata[id]) {
if (id != link.doc) {
throw new Error(
Expand All @@ -153,9 +147,13 @@ class HeaderNav extends React.Component {
href = this.props.config.baseUrl + Metadata[id].permalink;
} else if (link.page) {
// set link to page with current page's language if appropriate
const language = this.props.language || '';
if (fs.existsSync(CWD + '/pages/en/' + link.page + '.js')) {
href =
siteConfig.baseUrl + this.props.language + '/' + link.page + '.html';
siteConfig.baseUrl +
(language ? language + '/' : '') +
link.page +
'.html';
} else {
href = siteConfig.baseUrl + link.page + '.html';
}
Expand All @@ -180,7 +178,7 @@ class HeaderNav extends React.Component {
render() {
const versionsLink =
this.props.baseUrl +
(ENABLE_TRANSLATION
(env.translation.enabled
? this.props.language + '/versions.html'
: 'versions.html');
return (
Expand All @@ -198,9 +196,9 @@ class HeaderNav extends React.Component {
<h2 className="headerTitle">{this.props.title}</h2>
)}
</a>
{ENABLE_VERSIONING && (
{env.versioning.enabled && (
<a href={versionsLink}>
<h3>{this.props.version || versions[0]}</h3>
<h3>{this.props.version || env.versioning.latestVersion}</h3>
</a>
)}
{this.renderResponsiveNav()}
Expand Down
66 changes: 66 additions & 0 deletions lib/server/env.js
Original file line number Diff line number Diff line change
@@ -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;
Loading