diff --git a/aio/deploy-cn.sh b/aio/deploy-cn.sh
index 5402d189da..c8ed69ea8b 100755
--- a/aio/deploy-cn.sh
+++ b/aio/deploy-cn.sh
@@ -9,6 +9,7 @@ set -x
cd `dirname $0`
yarn build
+ts-node ./tools/translator/bin/ssr.ts
cp -r dist/* ../../ng-docs.github.io/
cd ../../ng-docs.github.io
diff --git a/aio/package.json b/aio/package.json
index eac0d405fe..7ff69839ff 100644
--- a/aio/package.json
+++ b/aio/package.json
@@ -88,6 +88,7 @@
"classlist.js": "^1.1.20150312",
"core-js": "^2.4.1",
"jasmine": "^2.6.0",
+ "mkdirp": "^0.5.1",
"ng-pwa-tools": "^0.0.10",
"rxjs": "6.0.0-uncanny-rc.7",
"rxjs-compat": "6.0.0-uncanny-rc.7",
diff --git a/aio/tools/translator/assets/aio-shell-template.html b/aio/tools/translator/assets/aio-shell-template.html
new file mode 100644
index 0000000000..d901a5a467
--- /dev/null
+++ b/aio/tools/translator/assets/aio-shell-template.html
@@ -0,0 +1,765 @@
+
+
+
+
+
+
+
+
+ Version 6 of Angular Now Available! Learn More
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/aio/tools/translator/bin/ssr.ts b/aio/tools/translator/bin/ssr.ts
new file mode 100644
index 0000000000..49f13ae2f8
--- /dev/null
+++ b/aio/tools/translator/bin/ssr.ts
@@ -0,0 +1,23 @@
+import * as fs from 'fs';
+import * as mkdirp from 'mkdirp';
+import * as path from 'path';
+
+function buildSsrPages(): void {
+ const navigation = fs.readFileSync('./content/navigation.json', 'utf-8');
+ const indexTemplate = fs.readFileSync('./dist/index.html', 'utf-8');
+ const aioShellTemplate = fs.readFileSync(__dirname + '/../assets/aio-shell-template.html');
+ const pageTemplate = indexTemplate.replace('', `${aioShellTemplate}`);
+ const urls = navigation.match(/"url": "(.*?)"/g)
+ .map((entry) => entry.replace(/^"url": "(.*?)".*$/, '$1'))
+ .filter(url => url.slice(0, 4) !== 'http')
+ .forEach(url => {
+ const generated: { title: string, content: string } = JSON.parse(fs.readFileSync(`./dist/generated/docs/${url}.json`, 'utf-8'));
+ const pageContent = pageTemplate
+ .replace('
Angular Docs', `${generated.title} - Angular 官方文档`)
+ .replace('', generated.content);
+ mkdirp.sync(path.dirname(`./dist/${url}`));
+ fs.writeFileSync(`./dist/${url}.html`, pageContent, 'utf-8');
+ });
+}
+
+buildSsrPages();
diff --git a/aio/yarn.lock b/aio/yarn.lock
index 79ce7ab267..dc6ca0a7c4 100644
--- a/aio/yarn.lock
+++ b/aio/yarn.lock
@@ -6974,12 +6974,18 @@ mkdirp-promise@^5.0.0:
dependencies:
mkdirp "*"
-mkdirp@*, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+mkdirp@*, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@~0.5.0:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
dependencies:
minimist "0.0.8"
+mkdirp@^0.5.1:
+ version "0.5.1"
+ resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
modelo@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/modelo/-/modelo-4.2.0.tgz#3b4b420023a66ca7e32bdba16e710937e14d1b0b"