diff --git a/public/docs/ts/latest/guide/dependency-injection.jade b/public/docs/ts/latest/guide/dependency-injection.jade index 8f7e40d2d0..651ba8e406 100644 --- a/public/docs/ts/latest/guide/dependency-injection.jade +++ b/public/docs/ts/latest/guide/dependency-injection.jade @@ -1357,6 +1357,8 @@ block dart-map-alternative Framework developers may take this approach when they must acquire services generically and dynamically. + 在框架程序员必须采用泛型或者动态方式获取服务时,他们可能采用这个方法。 + +ifDocsFor('ts') .l-main-section#one-class-per-file :marked diff --git a/public/translate/cn/translate.js b/public/translate/cn/translate.js index c14015ad2c..fe1c473e0d 100644 --- a/public/translate/cn/translate.js +++ b/public/translate/cn/translate.js @@ -1,135 +1,153 @@ // TODO: refactor me! var sourceVisible = localStorage.getItem('source-visible') === 'true'; (function ($) { - var content = document.querySelector('article'); - var footer = document.querySelector('.main-footer'); - processContainer(content); - processContainer(footer); + var content = document.querySelector('article'); + var footer = document.querySelector('.main-footer'); + processContainer(content); + processContainer(footer); - if (!sourceVisible) { - var nodes = document.querySelectorAll('.original-english'); - _.each(nodes, function (node) { - $(node).addClass('hidden'); - }); - } + if (!sourceVisible) { + var nodes = document.querySelectorAll('.original-english'); + _.each(nodes, function (node) { + $(node).addClass('hidden'); + }); + } - // restore - content.style.display = 'block'; - footer.style.display = 'block'; + // restore + content.style.display = 'block'; + footer.style.display = 'block'; - /** - * Process container recursively. - * @param container - */ - function processContainer(container) { - var count = 0; - for (var i = 0; i < container.children.length; i++) { - var node = container.children[i]; - - // ignore example code. - if (node.classList.contains('code-example') || - node.tagName === 'CODE-EXAMPLE' || - node.tagName === 'SCRIPT' || node.tagName === 'CODE') { - continue; - } - - switch (node.tagName) { - case 'P': - case 'H1': - case 'H2': - case 'H3': - case 'H4': - case 'H5': - case 'H6': - case 'HEADER': - count++; - if (processBlock(node)) { - i++; - count++; - } - break; - case 'TD': - case 'TH': - case 'UL': - case 'OL': - case 'DIV': - processContainer(node); - break; - default: - if (processContainer(node) <= 1) { - if (processBlock(node)) { - i++; - count++; + /** + * Process container recursively. + * @param container + */ + function processContainer(container) { + var count = 0; + for (var i = 0; i < container.children.length; i++) { + var node = container.children[i]; + var ignoredTagNames = ['CODE-EXAMPLE', 'SCRIPT', 'CODE', 'EM']; + // ignore example code. + if (node.classList.contains('code-example') || + ignoredTagNames.indexOf(node.tagName) >= 0) { + continue; } - } - break; - } - } - return count; - } - - /** - * Process block elements. The first element is original english, the - * second element is translated one. - * @param current the first element. - * @returns {boolean} Is success? - */ - function processBlock(current) { - var sibling = current.nextElementSibling; - var $current = $(current); - var $sibling = $(sibling); - - if (sibling) { - if (isClonedNode(current, sibling)) { - if (isPureEnglish(current.textContent)) { - if (sibling.children) { - processContainer(sibling); - } - $current.addClass('original-english'); - $sibling.addClass('translated'); - $sibling.addClass('translated-cn'); - $sibling.after($current); - $sibling.on('click', function (event) { - // for nested structure. - event.stopPropagation(); - $current.toggleClass('hidden'); - }); - return true; + switch (node.tagName) { + case 'P': + case 'H1': + case 'H2': + case 'H3': + case 'H4': + case 'H5': + case 'H6': + case 'HEADER': + count++; + if (processBlock(node)) { + i++; + count++; + } + break; + case 'TD': + case 'TH': + case 'UL': + case 'OL': + case 'DIV': + processContainer(node); + break; + default: + if (processContainer(node) <= 1) { + if (processBlock(node)) { + i++; + count++; + } + } + break; + } } - console.error('Error: ' + current.innerText); - } + return count; } - return false; - } + /** + * Process block elements. The first element is original english, the + * second element is translated one. + * @param current the first element. + * @returns {boolean} Is success? + */ + function processBlock(current) { + var sibling = current.nextElementSibling; + var $current = $(current); + var $sibling = $(sibling); - function isPureEnglish(text) { - if(text){ - text = text.replace('在线例子', ''); - return /^[\1-\255—’“”ç®…à\u200B]*$/.test(text); - } - return false; + if (sibling) { + if (isClonedNode(current, sibling)) { + if (isPureEnglish(current.textContent)) { + if (sibling.children) { + processContainer(sibling); + } + $current.addClass('original-english'); + $sibling.addClass('translated'); + $sibling.addClass('translated-cn'); + addSpacingBetweenCnAndEn(sibling); + $sibling.after($current); + $sibling.on('click', function (event) { + // for nested structure. + event.stopPropagation(); + $current.toggleClass('hidden'); + }); + return true; + } - } - - function attributesToString(node) { - return _.chain(node.attributes) - .map(function (value) { - if (value.name === 'id') { - return ''; - } else { - return value.name + '=' + value.value; + console.error('Error: ' + current.innerText); + } } - }) - .sortBy() - .value() - .join(';'); - } - function isClonedNode(node1, node2) { - return node1.tagName === node2.tagName && - attributesToString(node1) === attributesToString(node2); - } + return false; + } + + function isPureEnglish(text) { + if (text) { + text = text.replace('在线例子', ''); + return /^[\1-\255—’“”ç®…à\u200B]*$/.test(text); + } + return false; + + } + + function attributesToString(node) { + return _.chain(node.attributes) + .map(function (value) { + if (value.name === 'id') { + return ''; + } else { + return value.name + '=' + value.value; + } + }) + .sortBy() + .value() + .join(';'); + } + + function isClonedNode(node1, node2) { + return node1.tagName === node2.tagName && + attributesToString(node1) === attributesToString(node2); + } + + function addSpacingBetweenCnAndEn(nodeCn) { + if (nodeCn.children) { + return; + } + var text = nodeCn.textContent; + console.log(text); + text = text.replace(/([\x20-\xff]+)/g, function (word) { + if (!word.replace(/\s/, '')) { + return ''; + } else if (/<[^>]*>/.test(word)) { + return ' ' + word + ' '; + } else { + return ' ' + word + ' '; + } + }); + nodeCn.textContent = text; + } })(angular.element);