diff --git a/aio/tools/translator/translate.spec.ts b/aio/tools/translator/translate.spec.ts index c6fcb0d5de..261eaf934e 100644 --- a/aio/tools/translator/translate.spec.ts +++ b/aio/tools/translator/translate.spec.ts @@ -1,21 +1,30 @@ import { expect } from 'chai'; import { dirs } from './dirs'; -import { dict, lookup, translate } from './translate'; +import { dict, kernelText, lookup, normalizeLines, translate } from './translate'; describe('根据字典进行翻译', () => { it('忽略明显错误的条目', function () { expect(dict.filter(entry => /^
{ expect(lookup('# Forms')[0].translation).eql('# 表单'); }); + it('把“- * 1. #”等处理成空行分隔的格式,以便处理', function () { + const lines = normalizeLines('1. abc\n11. def\n'); + expect(lines).eql('1. abc\n\n11. def\n'); + }); + it('自动根据字典翻译单个文件', function () { const fs = require('fs'); - const content = fs.readFileSync(dirs.content + 'guide/forms.md', 'utf-8'); + const content = fs.readFileSync(__dirname + '/../../../../content-en/' + 'guide/forms.md', 'utf-8'); const result = translate(content); fs.writeFileSync(dirs.content + 'guide/forms.md', result.join('\n\n'), 'utf-8'); }); - }); diff --git a/aio/tools/translator/translate.ts b/aio/tools/translator/translate.ts index b3056a4763..c2fc3df6e0 100644 --- a/aio/tools/translator/translate.ts +++ b/aio/tools/translator/translate.ts @@ -4,22 +4,29 @@ import { DictEntry } from './dict-entry'; const dict1 = require('./dict-1.json') as DictEntry[]; const dict2 = require('./dict-2.json') as DictEntry[]; const dict3 = require('./dict-3.json') as DictEntry[]; -export const dict = dict1.concat(dict2).concat(dict3).filter(entry => !/^\s*
!/^\s*
filename.test(entry.sourceFile)).filter(entry => entry.original === english), 'translation'); + let entries = dict3 + .filter(entry => filename.test(entry.sourceFile)) + .filter(entry => kernelText(entry.original) === kernelText(english)); + return _.uniqBy(entries, 'translation'); +} + +export function kernelText(text: string): string { + return text.replace(/[\s\n]+/g, ' ').trim(); } export function translate(content: string): string[] { - const lines = content.split(/\n+\s*\n+/); + const lines = normalizeLines(content) + .split(/\n+\s*\n+/); return lines - .map(splitList) - .map(flatten) .map(line => { if (!line.trim()) { return line; } - const translations = lookup(line.trim(), /forms.md$/); + const translations = lookup(line, /forms.md$/); const indent = indentOf(line); const padding = repeat(indent); if (translations.length === 0) { @@ -53,12 +60,6 @@ function repeat(indent: number): string { return result; } -function splitList(line: string): string[] { - const subLines = line.split(/\n/); - // 把 markdown 里面不必空行的元素都拆开 - return [line]; -} - -export function flatten(arr: T[]): T { - return Array.prototype.concat.apply([], arr); +export function normalizeLines(text: string): string { + return text.replace(/(?=\n *(\d+\.|-|\*|#|<) )\n/g, '\n\n'); }