Integrate handling of translation tag into static html building, add default description to translate tags

This commit is contained in:
Frank Li 2017-07-10 14:08:00 -07:00
parent ed648074f2
commit 30a8ff329a
4 changed files with 61 additions and 14 deletions

View file

@ -22,6 +22,7 @@
const glob = require('glob');
const Site = require('../core/Site.js');
const siteConfig = require(CWD + '/siteConfig.js');
const translate = require('./translate.js');
let languages;
if (fs.existsSync(CWD + '/languages.js')) {
languages = require(CWD + '/languages.js');
@ -224,26 +225,47 @@
files = glob.sync(CWD + '/pages/**');
files.forEach(file => {
if (file.match(/\.js$/)) {
let parts = file.split('pages');
let tempFile = __dirname +'/../pages' + parts[1];
/* make temp file for sake of require paths */
const parts = file.split('pages');
let tempFile = __dirname + '/../pages' + parts[1];
tempFile = tempFile.replace(path.basename(file), 'temp' + path.basename(file));
mkdirp.sync(tempFile.replace(new RegExp('/[^/]*$'), ''));
fs.copySync(file, tempFile);
let language = 'en';
const ReactComp = require(tempFile);
let targetFile = __dirname + '/../../build/' + siteConfig.projectName + '/' + parts[1];
targetFile = targetFile.replace(/\.js$/, '.html');
const regexLang = /\/pages\/(.*)\//;
const match = regexLang.exec(file);
let langParts = match[1].split('/');
for (let i = 0; i < langParts.length; i++) {
if (enabledLanguages.indexOf(langParts[i]) !== -1) {
language = langParts[i];
const langParts = match[1].split('/');
if (langParts.indexOf('en') !== -1) {
/* copy and compile a page for each enabled language from the English file */
for (let i = 0; i < enabledLanguages.length; i++) {
let language = enabledLanguages[i];
/* skip conversion from english file if a file exists for this language */
if (language !== 'en' && fs.existsSync(file.replace('/en/', '/' + language + '/'))) {
continue;
}
translate.setLanguage(language);
const str = renderToStaticMarkup(<Site language={language} config={siteConfig}><ReactComp language={language}/></Site>);
writeFileAndCreateFolder(targetFile.replace('/en/', '/' + language + '/'), str);
}
}
/* allow for rendering of other files not in pages/en folder */
else {
let language = 'en';
for (let i = 0; i < langParts.length; i++) {
if (enabledLanguages.indexOf(langParts[i]) !== -1) {
language = langParts[i];
}
}
translate.setLanguage(language);
const str = renderToStaticMarkup(<Site language={language} config={siteConfig}><ReactComp language={language}/></Site>);
writeFileAndCreateFolder(targetFile, str);
}
let targetFile = __dirname + '/../../build' + '/' + siteConfig.projectName + '/' + parts[1];
targetFile = targetFile.replace(/\.js$/, '.html');
const ReactComp = require(tempFile);
const str = renderToStaticMarkup(<Site language={language} config={siteConfig}><ReactComp language={language}/></Site>);
writeFileAndCreateFolder(targetFile, str);
fs.removeSync(tempFile);
}

View file

@ -20,7 +20,7 @@ module.exports = function translatePlugin(babel) {
}
/* assume translate element only has one child which is the text */
const text = path.node.children[0].value.trim();
let description;
let description = "no description given";
const attributes = path.node.openingElement.attributes;
for (let i = 0; i < attributes.length; i++) {
if (attributes[i].name.name === "desc") {

25
lib/server/translate.js Normal file
View file

@ -0,0 +1,25 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
const siteConfig = require(CWD + "/siteConfig.js");
let language = "en";
function setLanguage(lang) {
language = lang;
}
function translate(str) {
return siteConfig[language]["pages-strings"][str];
}
module.exports = {
setLanguage: setLanguage,
translate: translate
};

View file

@ -74,7 +74,7 @@ function execute() {
path.node.openingElement.name.name === "translate"
) {
const text = path.node.children[0].value.trim();
let description;
let description = "no description given";
const attributes = path.node.openingElement.attributes;
for (let i = 0; i < attributes.length; i++) {
if (attributes[i].name.name === "desc") {