diff --git a/adev/BUILD.bazel b/adev/BUILD.bazel
index 863ae78e584f..8a4f593c8fae 100644
--- a/adev/BUILD.bazel
+++ b/adev/BUILD.bazel
@@ -34,6 +34,8 @@ TEST_FILES = APPLICATION_FILES + [
 )
 
 APPLICATION_ASSETS = [
+    "//adev/src/assets/css",
+    "//adev/src/assets/fonts",
     "//adev/src/assets/images",
     "//adev/src/assets/previews",
     "//adev/src/assets:tutorials",
diff --git a/adev/angular.json b/adev/angular.json
index b38f9f152f0d..7beaf44b560a 100644
--- a/adev/angular.json
+++ b/adev/angular.json
@@ -46,7 +46,8 @@
           },
           "configurations": {
             "production": {
-              "outputHashing": "all"
+              "outputHashing": "all",
+              "ssr": false
             },
             "development": {
               "optimization": false,
diff --git a/adev/shared-docs/components/cookie-popup/cookie-popup.component.html b/adev/shared-docs/components/cookie-popup/cookie-popup.component.html
index 808d146175ba..55eb79cf16dd 100644
--- a/adev/shared-docs/components/cookie-popup/cookie-popup.component.html
+++ b/adev/shared-docs/components/cookie-popup/cookie-popup.component.html
@@ -1,21 +1,21 @@
 @if (!hasAccepted()) {
 <div class="docs-cookies-popup docs-invert-mode">
-  <p>This site uses cookies from Google to deliver its services and to analyze traffic.</p>
+  <p>本网站使用 Google 的 Cookie 来提供服务并分析流量。</p>
 
   <div>
     <a href="https://policies.google.com/technologies/cookies" target="_blank" rel="noopener">
-      <button class="docs-primary-btn" [attr.text]="'Learn more'" aria-label="Learn More">
-        Learn more
+      <button class="docs-primary-btn" [attr.text]="'了解更多'" aria-label="了解更多">
+        了解更多
       </button>
     </a>
     <button
       type="button"
       (click)="accept()"
       class="docs-primary-btn"
-      [attr.text]="'Ok, Got it'"
-      aria-label="Ok, Got it"
+      [attr.text]="'好的，我知道了'"
+      aria-label="好的，我知道了"
     >
-      Ok, Got it
+      好的，我知道了
     </button>
   </div>
 </div>
diff --git a/adev/shared-docs/components/navigation-list/navigation-list.component.html b/adev/shared-docs/components/navigation-list/navigation-list.component.html
index fde9bdbb738e..b0de763f381d 100644
--- a/adev/shared-docs/components/navigation-list/navigation-list.component.html
+++ b/adev/shared-docs/components/navigation-list/navigation-list.component.html
@@ -65,7 +65,7 @@
             <button
               type="button"
               (click)="toggle(item)"
-              [attr.aria-label]="(item.isExpanded ? 'Collapse' : 'Expand') + ' ' + item.label"
+              [attr.aria-label]="(item.isExpanded ? '收起' : '展开') + ' ' + item.label"
               [attr.aria-expanded]="item.isExpanded"
               class="docs-secondary-nav-button"
               [class.docs-faceted-list-item-active]="item | isActiveNavigationItem: activeItem()"
diff --git a/adev/shared-docs/components/search-dialog/search-dialog.component.html b/adev/shared-docs/components/search-dialog/search-dialog.component.html
index 4ed336bf0376..3f4947be4110 100644
--- a/adev/shared-docs/components/search-dialog/search-dialog.component.html
+++ b/adev/shared-docs/components/search-dialog/search-dialog.component.html
@@ -6,7 +6,7 @@
       [ngModel]="searchQuery()"
       (ngModelChange)="updateSearchQuery($event)"
       class="docs-search-input"
-      placeholder="Search docs"
+      placeholder="搜索文档"
     />
 
     @if (searchResults() && searchResults()!.length > 0) {
@@ -49,7 +49,7 @@
               </div>
 
               <!-- Page title -->
-              <span class="docs-result-page-title">{{ result.hierarchy?.lvl0 }}</span>
+              <span class="docs-result-page-title">{{ result.hierarchy.lvl0 }}</span>
             </a>
           </li>
         }
@@ -58,22 +58,23 @@
       <div class="docs-search-results docs-mini-scroll-track">
         @if (searchResults() === undefined) {
           <div class="docs-search-results__start-typing">
-            <span>Start typing to see results</span>
+            <span>开始输入以查看结果</span>
           </div>
         } @else if (searchResults()?.length === 0) {
           <div class="docs-search-results__no-results">
-            <span>No results found</span>
+            <span>未找到结果</span>
           </div>
         }
       </div>
     }
 
     <div class="docs-algolia">
-      <span>Search by</span>
+      <span>由</span>
       <a target="_blank" rel="noopener"
          href="https://www.algolia.com/developers/?utm_source=angular.dev&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch">
         <docs-algolia-icon />
       </a>
+      <span>提供搜索支持</span>
     </div>
   </div>
 </dialog>
diff --git a/adev/shared-docs/components/table-of-contents/table-of-contents.component.html b/adev/shared-docs/components/table-of-contents/table-of-contents.component.html
index 08540b5e4a4e..7350c529db30 100644
--- a/adev/shared-docs/components/table-of-contents/table-of-contents.component.html
+++ b/adev/shared-docs/components/table-of-contents/table-of-contents.component.html
@@ -1,7 +1,7 @@
 <aside>
   <nav>
     <header>
-      <h2 class="docs-title">On this page</h2>
+      <h2 class="docs-title">在本页中</h2>
     </header>
     <ul class="docs-faceted-list">
       <!-- TODO: Hide li elements with class docs-toc-item-h3 for laptop, table and phone screen resolutions  -->
@@ -18,6 +18,6 @@ <h2 class="docs-title">On this page</h2>
   </nav>
   <button type="button" (click)="scrollToTop()">
     <docs-icon role="presentation">arrow_upward_alt</docs-icon>
-    Back to the top
+    返回顶部
   </button>
-</aside>
\ No newline at end of file
+</aside>
diff --git a/adev/shared-docs/components/top-level-banner/top-level-banner.component.html b/adev/shared-docs/components/top-level-banner/top-level-banner.component.html
index a3edc4a15a71..bb3984f0157e 100644
--- a/adev/shared-docs/components/top-level-banner/top-level-banner.component.html
+++ b/adev/shared-docs/components/top-level-banner/top-level-banner.component.html
@@ -13,7 +13,7 @@ <h1 tabindex="0" class="docs-top-level-banner-cta background"><span class="docs-
 </div>
 }
 
-<button class="docs-top-level-banner-close" type="button" (click)="close()">
+<button class="docs-top-level-banner-close" type="button" (click)="close()" aria-label="关闭">
   <docs-icon class="docs-icon_high-contrast">close</docs-icon>
 </button>
 }
\ No newline at end of file
diff --git a/adev/src/app/app.component.html b/adev/src/app/app.component.html
index e589f3591286..be4dcaaf8f87 100644
--- a/adev/src/app/app.component.html
+++ b/adev/src/app/app.component.html
@@ -1,8 +1,8 @@
-<button (click)="focusFirstHeading()" class="adev-skip">Skip to main content</button>
+<button (click)="focusFirstHeading()" class="adev-skip">跳转到主要内容</button>
 
 @defer (when isBrowser) {
   <adev-progress-bar />
-  <docs-top-level-banner expiry="2024-12-10" id="state-of-js-2024" link="https://survey.devographics.com/en-US/survey/state-of-js/2024?source=angular_homepage" text="Share your experience with Angular in The State of JavaScript 2024 survey"  />
+  <docs-top-level-banner expiry="2024-12-10" id="state-of-js-2024" link="https://survey.devographics.com/en-US/survey/state-of-js/2024?source=angular_homepage" text="在 The State of JavaScript 2024 survey 中分享您的 Angular 体验"  />
 }
 
 <div class="adev-nav"></div>
diff --git a/adev/src/app/core/constants/versions.ts b/adev/src/app/core/constants/versions.ts
index 1c62311727d2..7576f680029b 100644
--- a/adev/src/app/core/constants/versions.ts
+++ b/adev/src/app/core/constants/versions.ts
@@ -11,55 +11,55 @@ export const VERSIONS_CONFIG = {
   aioVersions: [
     {
       version: 'v18',
-      url: 'https://v18.angular.dev/overview',
+      url: 'https://v18.angular.cn/overview',
     },
     {
       version: 'v17',
-      url: 'https://v17.angular.io/docs',
+      url: 'https://v17.angular.cn/docs',
     },
     {
       version: 'v16',
-      url: 'https://v16.angular.io/docs',
+      url: 'https://v16.angular.cn/docs',
     },
     {
       version: 'v15',
-      url: 'https://v15.angular.io/docs',
+      url: 'https://v15.angular.cn/docs',
     },
     {
       version: 'v14',
-      url: 'https://v14.angular.io/docs',
+      url: 'https://v14.angular.cn/docs',
     },
     {
       version: 'v13',
-      url: 'https://v13.angular.io/docs',
+      url: 'https://v13.angular.cn/docs',
     },
     {
       version: 'v12',
-      url: 'https://v12.angular.io/docs',
+      url: 'https://v12.angular.cn/docs',
     },
     {
       version: 'v11',
-      url: 'https://v11.angular.io/docs',
+      url: 'https://v11.angular.cn/docs',
     },
     {
       version: 'v10',
-      url: 'https://v10.angular.io/docs',
+      url: 'https://v10.angular.cn/docs',
     },
     {
       version: 'v9',
-      url: 'https://v9.angular.io/docs',
+      url: 'https://v9.angular.cn/docs',
     },
     {
       version: 'v8',
-      url: 'https://v8.angular.io/docs',
+      url: 'https://v8.angular.cn/docs',
     },
     {
       version: 'v7',
-      url: 'https://v7.angular.io/docs',
+      url: 'https://v7.angular.cn/docs',
     },
     {
       version: 'v6',
-      url: 'https://v6.angular.io/docs',
+      url: 'https://v6.angular.cn/docs',
     },
     {
       version: 'v5',
@@ -67,11 +67,11 @@ export const VERSIONS_CONFIG = {
     },
     {
       version: 'v4',
-      url: 'https://v4.angular.io/docs',
+      url: 'https://v4.angular.cn/docs',
     },
     {
       version: 'v2',
-      url: 'https://v2.angular.io/docs',
+      url: 'https://v2.angular.cn/docs',
     },
   ],
 };
diff --git a/adev/src/app/core/layout/footer/footer.component.html b/adev/src/app/core/layout/footer/footer.component.html
index bc076da2ebda..a07311536fff 100644
--- a/adev/src/app/core/layout/footer/footer.component.html
+++ b/adev/src/app/core/layout/footer/footer.component.html
@@ -1,13 +1,13 @@
 <div class="adev-footer-container">
   <div class="adev-footer-columns">
     <div>
-      <h2>Social Media</h2>
+      <h2>社交媒体</h2>
       <ul>
         <li>
-          <a [href]="MEDIUM" title="Angular blog">Blog</a>
+          <a [href]="MEDIUM" title="Angular 博客">博客</a>
         </li>
         <li>
-          <a [href]="X" title="X (formerly Twitter)">X (formerly Twitter)</a>
+          <a [href]="X" title="X (formerly Twitter)">X (前 Twitter)</a>
         </li>
         <li>
           <a [href]="BLUESKY" title="Bluesky">Bluesky</a>
@@ -18,7 +18,7 @@ <h2>Social Media</h2>
         <li>
           <a
             href="https://discord.gg/angular"
-            title="Join the discussions at Angular Community Discord server."
+            title="加入 Angular 社区 Discord 服务器的讨论吧！"
           >
             Discord
           </a>
@@ -29,7 +29,7 @@ <h2>Social Media</h2>
         <li>
           <a
             href="https://stackoverflow.com/questions/tagged/angular"
-            title="Stack Overflow: where the community answers your technical Angular questions."
+            title="Stack Overflow：社区为你解答技术上的 Angular 问题。"
           >
             Stack Overflow
           </a>
@@ -37,66 +37,66 @@ <h2>Social Media</h2>
       </ul>
     </div>
     <div>
-      <h2>Community</h2>
+      <h2>社区</h2>
       <ul>
         <li>
           <a
             href="https://github.com/angular/angular/blob/main/CONTRIBUTING.md"
-            title="Contribute to Angular"
+            title="向 Angular 做贡献"
           >
-            Contribute
+            做贡献
           </a>
         </li>
         <li>
           <a
             href="https://github.com/angular/code-of-conduct/blob/main/CODE_OF_CONDUCT.md"
-            title="Treating each other with respect."
+            title="彼此尊重"
           >
-            Code of Conduct
+            行为准则
           </a>
         </li>
         <li>
           <a
             href="https://github.com/angular/angular/issues"
-            title="Post issues and suggestions on github."
+            title="在 Github 上报告问题或提建议"
           >
-            Report Issues
+            报告问题
           </a>
         </li>
         <li>
           <a
             href="https://devlibrary.withgoogle.com/products/angular?sort=updated"
-            title="Google's DevLibrary"
+            title="Google 的开发库"
           >
-            Google's DevLibrary
+            Google 的 开发库
           </a>
         </li>
         <li>
           <a
             href="https://developers.google.com/community/experts/directory?specialization=angular"
-            title="Angular Google Developer Experts"
+            title="Angular Google 开发技术专家"
           >
-            Angular Google Developer Experts
+            Angular Google 开发技术专家
           </a>
         </li>
       </ul>
     </div>
     <div>
-      <h2>Resources</h2>
+      <h2>资源</h2>
       <ul>
         <li>
-          <a routerLink="/press-kit" title="Press contacts, logos, and branding.">Press Kit</a>
+          <a routerLink="/press-kit" title="媒体联系、标志和品牌形象。">宣传资料</a>
         </li>
         <li>
-          <a routerLink="/roadmap" title="Roadmap">Roadmap</a>
+          <a routerLink="/roadmap" title="路线图">路线图</a>
         </li>
       </ul>
     </div>
     <div>
-      <h2>Languages</h2>
+      <h2>多语言</h2>
       <ul>
         <li>
-          <a href="https://angular.cn/" title="简体中文版">简体中文版</a>
+          <a href="https://angular.dev/" title="English Version">English Version</a>
         </li>
         <li>
           <a href="https://angular.tw/" title="正體中文版">正體中文版</a>
@@ -119,10 +119,7 @@ <h2>Languages</h2>
     </div>
   </div>
   <p class="docs-license">
-    Super-powered by Google ©2010-2025. Code licensed under an
-    <a routerLink="/license" title="License text">MIT-style License</a>
-    . Documentation licensed under
-    <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>
-    .
+    由 Google 强力赋能 ©2010-2025。代码以<a routerLink="/license" title="协议文本">MIT-style 协议</a>授权。文档以
+    <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a> 授权。
   </p>
 </div>
diff --git a/adev/src/app/core/layout/navigation/navigation.component.html b/adev/src/app/core/layout/navigation/navigation.component.html
index e1e8aa9a3feb..cd38cd71e1cf 100644
--- a/adev/src/app/core/layout/navigation/navigation.component.html
+++ b/adev/src/app/core/layout/navigation/navigation.component.html
@@ -11,7 +11,7 @@
     <button
       type="button"
       class="adev-mobile-nav-button"
-      aria-label="Toggle mobile navigation"
+      aria-label="切换移动端导航"
       (click)="openMobileNav($event)"
     >
       <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 223 236" width="32">
@@ -70,7 +70,7 @@
       type="button"
       class="adev-close-nav"
       (click)="closeMobileNav()"
-      aria-label="Close navigation"
+      aria-label="关闭导航"
     >
       <docs-icon role="presentation">close</docs-icon>
     </button>
@@ -81,7 +81,7 @@
         class="adev-nav-item adev-nav-item--logo"
         [class.adev-nav-item--active]="activeRouteItem() === HOME_ROUTE"
       >
-        <a aria-label="Angular homepage" routerLink="/">
+        <a aria-label="Angular 首页" routerLink="/">
           <!-- Logo Symbol -->
           @if(!isUwu) {
           <svg class="angular-logo" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 223 236" width="32">
@@ -141,7 +141,7 @@
         <div class="adev-nav-item">
           <button
             type="button"
-            aria-label="Select Angular version"
+            aria-label="选择 Angular 版本"
             role="menu"
             class="adev-version-button"
             [class.adev-mini-menu-open]="openedMenu === 'version-picker'"
@@ -187,7 +187,7 @@
           class="adev-nav-button"
           type="button"
           (click)="toggleSearchDialog($event)"
-          title="Search docs"
+          title="搜索文档"
         >
           <svg
             aria-hidden="true"
@@ -224,7 +224,7 @@
               d="M3.645 13.792h6.708v-1.25H3.645v1.25Zm0-3.542h6.708V9H3.645v1.25Zm-2.063 7.083a1.2 1.2 0 0 1-.875-.375 1.2 1.2 0 0 1-.375-.875V1.917a1.2 1.2 0 0 1 .375-.875 1.2 1.2 0 0 1 .875-.375h7.52l4.563 4.562v10.854a1.2 1.2 0 0 1-.375.875 1.2 1.2 0 0 1-.875.375H1.582ZM8.478 5.792V1.917H1.582v14.166h10.833V5.792H8.478Z"
             />
           </svg>
-          <span class="adev-nav-item__label">Docs</span>
+          <span class="adev-nav-item__label">文档</span>
         </a>
       </li>
 
@@ -245,7 +245,7 @@
               d="m5.668 10-5-5 5-5 1.187 1.188L3.022 5.02l3.813 3.812L5.668 10Zm6.667 0-1.188-1.188L14.98 4.98l-3.812-3.812L12.335 0l5 5-5 5Z"
             />
           </svg>
-          <span class="adev-nav-item__label">Tutorials</span>
+          <span class="adev-nav-item__label">教程</span>
         </a>
       </li>
 
@@ -260,7 +260,7 @@
               d="M450.001-611.691v-32.386q-39.385-9.923-64.692-41.897-25.308-31.975-25.308-74.025 0-49.922 35.038-84.96 35.039-35.038 84.961-35.038t84.961 35.038q35.038 35.038 35.038 84.96 0 42.05-25.308 74.025-25.307 31.974-64.692 41.897v32.386l273.846 157.538q17.173 9.912 26.663 26.582 9.491 16.671 9.491 36.495v62.152q0 19.824-9.491 36.495-9.49 16.67-26.663 26.582L516.154-111.771q-17.203 9.846-36.217 9.846t-36.091-9.846L176.155-265.847q-17.173-9.912-26.663-26.582-9.491-16.671-9.491-36.495v-62.152q0-19.824 9.491-36.495 9.49-16.67 26.663-26.582l273.846-157.538Zm-6.155 364.537L200-387.461v58.537q0 3.078 1.539 5.962 1.538 2.885 4.615 4.808l267.692 154.692q3.077 1.923 6.154 1.923t6.154-1.923l267.692-154.692q3.077-1.923 4.615-4.808 1.539-2.884 1.539-5.962v-58.537L516.154-247.154q-17.203 9.847-36.217 9.847t-36.091-9.847Zm6.155-162.847V-542.77L250.46-427.691l223.386 128.846q3.077 1.924 6.154 1.924t6.154-1.924l223.001-128.846L509.999-542.77v132.769h-59.998ZM480-699.999q25 0 42.5-17.5t17.5-42.5q0-25-17.5-42.5t-42.5-17.5q-25 0-42.5 17.5t-17.5 42.5q0 25 17.5 42.5t42.5 17.5Zm-2.308 538.46Z"
             />
           </svg>
-          <span class="adev-nav-item__label">Playground</span>
+          <span class="adev-nav-item__label">演练场</span>
         </a>
       </li>
 
@@ -281,7 +281,7 @@
               d="M3.645 13.792h6.708v-1.25H3.645v1.25Zm0-3.542h6.708V9H3.645v1.25Zm-2.063 7.083a1.2 1.2 0 0 1-.875-.375 1.2 1.2 0 0 1-.375-.875V1.917a1.2 1.2 0 0 1 .375-.875 1.2 1.2 0 0 1 .875-.375h7.52l4.563 4.562v10.854a1.2 1.2 0 0 1-.375.875 1.2 1.2 0 0 1-.875.375H1.582ZM8.478 5.792V1.917H1.582v14.166h10.833V5.792H8.478Z"
             />
           </svg>
-          <span class="adev-nav-item__label">Reference</span>
+          <span class="adev-nav-item__label">参考手册</span>
         </a>
       </li>
     </ul>
@@ -294,7 +294,7 @@
           type="button"
           [cdkMenuTriggerFor]="socialMiniMenu"
           [cdkMenuPosition]="miniMenuPositions"
-          aria-label="Open social media links"
+          aria-label="打开社交媒体链接"
           (cdkMenuClosed)="closeMenu()"
           (cdkMenuOpened)="openMenu('social')"
         >
@@ -307,7 +307,7 @@
               <a
                 [href]="YOUTUBE"
                 cdkMenuItem
-                title="Angular YouTube channel"
+                title="Angular YouTube 频道"
                 target="_blank"
                 rel="noopener"
               >
@@ -329,7 +329,7 @@
               <a
                 [href]="X"
                 cdkMenuItem
-                title="Angular X (formerly Twitter) profile"
+                title="Angular X (前 Twitter) 档案"
                 target="_blank"
                 rel="noopener"
               >
@@ -372,7 +372,7 @@
               <a
                 [href]="MEDIUM"
                 cdkMenuItem
-                title="Angular Medium blog"
+                title="Angular Medium 博客"
                 target="_blank"
                 rel="noopener"
               >
@@ -429,7 +429,7 @@
           type="button"
           [cdkMenuTriggerFor]="themeMiniMenu"
           [cdkMenuPosition]="miniMenuPositions"
-          aria-label="Open theme picker"
+          aria-label="打开主题选取器"
           (cdkMenuClosed)="closeMenu()"
           (cdkMenuOpened)="openMenu('theme-picker')"
         >
@@ -451,10 +451,10 @@
                 type="button"
                 cdkMenuItem
                 (click)="setTheme('auto')"
-                aria-label="Set default system theme"
+                aria-label="设置为系统默认主题"
               >
                 <docs-icon class="docs-icon_high-contrast">routine</docs-icon>
-                <span>System</span>
+                <span>系统</span>
               </button>
             </li>
             <li>
@@ -462,10 +462,10 @@
                 type="button"
                 cdkMenuItem
                 (click)="setTheme('dark')"
-                aria-label="Set dark theme"
+                aria-label="设置为暗黑主题"
               >
                 <docs-icon class="docs-icon_high-contrast">dark_mode</docs-icon>
-                <span>Dark</span>
+                <span>暗黑</span>
               </button>
             </li>
             <li>
@@ -473,10 +473,10 @@
                 type="button"
                 cdkMenuItem
                 (click)="setTheme('light')"
-                aria-label="Set light theme"
+                aria-label="设置为明亮主题"
               >
                 <docs-icon class="docs-icon_high-contrast">light_mode</docs-icon>
-                <span>Light</span>
+                <span>明亮</span>
               </button>
             </li>
           </ul>
@@ -491,7 +491,7 @@
     <button type="button" (click)="openMobileNav($event)">
       <docs-icon class="docs-icon_high-contrast">menu</docs-icon>
       @if (activeRouteItem() === DOCS_ROUTE) {
-      <span>Docs</span>
+      <span>文档</span>
       } @if (activeRouteItem() === REFERENCE_ROUTE) {
       <span>API</span>
       }
diff --git a/adev/src/app/core/layout/progress-bar/progress-bar.component.ts b/adev/src/app/core/layout/progress-bar/progress-bar.component.ts
index f6ed7df97b91..21db69152733 100644
--- a/adev/src/app/core/layout/progress-bar/progress-bar.component.ts
+++ b/adev/src/app/core/layout/progress-bar/progress-bar.component.ts
@@ -34,7 +34,7 @@ export const PROGRESS_BAR_DELAY = 30;
   selector: 'adev-progress-bar',
   imports: [NgProgressbar],
   template: `
-    <ng-progress aria-label="Page load progress" />
+    <ng-progress aria-label="页面加载进度" />
   `,
   changeDetection: ChangeDetectionStrategy.OnPush,
 })
diff --git a/adev/src/app/core/services/a-dev-title-strategy.ts b/adev/src/app/core/services/a-dev-title-strategy.ts
index 75a1daa0e977..94a709ae73e1 100644
--- a/adev/src/app/core/services/a-dev-title-strategy.ts
+++ b/adev/src/app/core/services/a-dev-title-strategy.ts
@@ -15,7 +15,7 @@ export const ROUTE_TITLE_PROPERTY = 'label';
 export const ROUTE_PARENT_PROPERTY = 'parent';
 export const TITLE_SUFFIX = 'Angular';
 export const TITLE_SEPARATOR = ' • ';
-export const DEFAULT_PAGE_TITLE = 'Overview';
+export const DEFAULT_PAGE_TITLE = '概览';
 
 @Injectable({providedIn: 'root'})
 export class ADevTitleStrategy extends TitleStrategy {
diff --git a/adev/src/app/core/services/errors-handling/error-handler.ts b/adev/src/app/core/services/errors-handling/error-handler.ts
index 211e0898838e..e8a71d05d216 100644
--- a/adev/src/app/core/services/errors-handling/error-handler.ts
+++ b/adev/src/app/core/services/errors-handling/error-handler.ts
@@ -47,8 +47,8 @@ export class CustomErrorHandler implements ErrorHandler {
       .openFromComponent(ErrorSnackBar, {
         panelClass: 'docs-invert-mode',
         data: {
-          message: `Our docs have been updated, reload the page to see the latest.`,
-          actionText: `Reload`,
+          message: `我们的文档已更新，请刷新页面以查看最新内容。`,
+          actionText: `重新加载`,
         } satisfies ErrorSnackBarData,
       })
       .onAction()
diff --git a/adev/src/app/editor/alert-manager.service.ts b/adev/src/app/editor/alert-manager.service.ts
index 4ea88c6b0b9b..ab1ad2bdad96 100644
--- a/adev/src/app/editor/alert-manager.service.ts
+++ b/adev/src/app/editor/alert-manager.service.ts
@@ -87,10 +87,10 @@ export class AlertManager {
     let message = '';
     switch (reason) {
       case AlertReason.OUT_OF_MEMORY:
-        message = `Your browser is currently limiting the memory available to run the Angular Tutorials or Playground. If you have multiple tabs open with Tutorials or Playground, please close some of them and refresh this page.`;
+        message = `你的浏览器当前限制了运行 Angular 教程或在线演练场所需的内存。如果你有多个标签页打开了教程或在线演练场，请关闭其中的一些并刷新此页面。`;
         break;
       case AlertReason.MOBILE:
-        message = `You are running the embedded editor in a mobile device, this may result in an Out of memory error.`;
+        message = `你正在移动设备上运行嵌入式编辑器，这可能会导致内存不足错误。`;
         break;
     }
 
@@ -98,7 +98,7 @@ export class AlertManager {
       panelClass: 'docs-invert-mode',
       data: {
         message,
-        actionText: 'I understand',
+        actionText: '我明白了',
       } satisfies ErrorSnackBarData,
     });
   }
diff --git a/adev/src/app/editor/code-editor/code-editor.component.html b/adev/src/app/editor/code-editor/code-editor.component.html
index 93d50cde385f..66200c9a8348 100644
--- a/adev/src/app/editor/code-editor/code-editor.component.html
+++ b/adev/src/app/editor/code-editor/code-editor.component.html
@@ -27,7 +27,7 @@
           @if (tab.isActive && canRenameFile(file.filename)) {
             <button
               class="docs-rename-file"
-              aria-label="rename file"
+              aria-label="重命名文件"
               (click)="onRenameButtonClick()"
             >
               <docs-icon>edit</docs-icon>
@@ -36,7 +36,7 @@
           @if (tab.isActive && canDeleteFile(file.filename)) {
           <button
             class="docs-delete-file"
-            aria-label="Delete file"
+            aria-label="删除文件"
             (click)="deleteFile(file.filename)"
           >
             <docs-icon>delete</docs-icon>
@@ -60,7 +60,7 @@
       }
     </mat-tab-group>
 
-    <button class="adev-add-file" (click)="onAddButtonClick()" aria-label="Add a new file">
+    <button class="adev-add-file" (click)="onAddButtonClick()" aria-label="添加新文件">
       <docs-icon>add</docs-icon>
     </button>
   </div>
@@ -68,7 +68,7 @@
   <button
     class="adev-editor-download-button"
     type="button"
-    aria-label="Open current code in editor in an online editor"
+    aria-label="以在线编辑器打开当前代码"
     [cdkMenuTriggerFor]="launcherMenu"
   >
     <docs-icon>launch</docs-icon>
@@ -77,11 +77,11 @@
   <ng-template #launcherMenu>
     <div class="adev-editor-dropdown" cdkMenu>
         <button cdkMenuItem (click)="openCurrentSolutionInIDX()">
-          <span>Open in IDX </span>
+          <span>在 IDX 中打开</span>
           <img class="icon" src="assets/images/tutorials/common/idx_logo.svg" height="32">
         </button>
         <button cdkMenuItem (click)="openCurrentCodeInStackBlitz()">
-          Open in StackBlitz
+          在 StackBlitz 中打开
         </button>
     </div>
   </ng-template>
@@ -89,8 +89,8 @@
     class="adev-editor-download-button"
     type="button"
     (click)="downloadCurrentCodeEditorState()"
-    aria-label="Download current source code"
-    matTooltip="Download current source code"
+    aria-label="下载当前源码"
+    matTooltip="下载当前源码"
     matTooltipPosition="above"
   >
     <docs-icon>download</docs-icon>
diff --git a/adev/src/app/editor/code-editor/code-editor.component.ts b/adev/src/app/editor/code-editor/code-editor.component.ts
index f360e9d65191..831c26400182 100644
--- a/adev/src/app/editor/code-editor/code-editor.component.ts
+++ b/adev/src/app/editor/code-editor/code-editor.component.ts
@@ -137,7 +137,7 @@ export class CodeEditor implements AfterViewInit, OnDestroy {
 
     const path = this.location.path();
     const editorUrl = `${ANGULAR_DEV}${path}`;
-    const description = `Angular.dev example generated from [${editorUrl}](${editorUrl})`;
+    const description = `由 [${editorUrl}](${editorUrl}) 生成的 Angular.dev 代码`;
 
     await this.stackblitzOpener.openCurrentSolutionInStackBlitz({title, description});
   }
@@ -185,7 +185,7 @@ export class CodeEditor implements AfterViewInit, OnDestroy {
 
     if (renameFileInputValue) {
       if (renameFileInputValue.includes('..')) {
-        alert('File name can not contain ".."');
+        alert('文件名不能包含 ".."');
         return;
       }
 
@@ -193,7 +193,7 @@ export class CodeEditor implements AfterViewInit, OnDestroy {
       const newFile = 'src/' + renameFileInputValue;
 
       if (this.files().find(({filename}) => filename.includes(newFile))) {
-        alert('File name already exists');
+        alert('文件名已存在');
         return;
       }
 
@@ -212,7 +212,7 @@ export class CodeEditor implements AfterViewInit, OnDestroy {
 
     if (newFileInputValue) {
       if (newFileInputValue.includes('..')) {
-        alert('File name can not contain ".."');
+        alert('文件名不能包含 ".."');
         return;
       }
 
@@ -220,7 +220,7 @@ export class CodeEditor implements AfterViewInit, OnDestroy {
       const newFile = 'src/' + newFileInputValue;
 
       if (this.files().find(({filename}) => filename.includes(newFile))) {
-        alert('File already exists');
+        alert('文件已存在');
         return;
       }
 
diff --git a/adev/src/app/editor/code-editor/code-mirror-editor.service.ts b/adev/src/app/editor/code-editor/code-mirror-editor.service.ts
index bb476e9f6257..0978af2d1d1d 100644
--- a/adev/src/app/editor/code-editor/code-mirror-editor.service.ts
+++ b/adev/src/app/editor/code-editor/code-mirror-editor.service.ts
@@ -172,7 +172,7 @@ export class CodeMirrorEditor {
     if (!this._editorView) return;
 
     const newFile = this.files().find((file) => file.filename === fileName);
-    if (!newFile) throw new Error(`File '${fileName}' not found`);
+    if (!newFile) throw new Error(`文件 '${fileName}' 未找到`);
 
     this.currentFile.set(newFile);
 
@@ -394,7 +394,7 @@ export class CodeMirrorEditor {
 
         this.currentFile().language,
 
-        placeholderExtension('Type your code here...'),
+        placeholderExtension('在此键入你的代码...'),
 
         ...this.getLanguageExtensions(),
       ],
diff --git a/adev/src/app/editor/embedded-editor.component.html b/adev/src/app/editor/embedded-editor.component.html
index 68644eaff2b6..b2128d2d0f41 100644
--- a/adev/src/app/editor/embedded-editor.component.html
+++ b/adev/src/app/editor/embedded-editor.component.html
@@ -25,7 +25,7 @@
           <!-- Preview Section: for larger screens -->
           <div class="adev-preview-section">
             <div class="adev-preview-header">
-              <span>Preview</span>
+              <span>预览</span>
             </div>
             @if (!displayPreviewInMatTabGroup()) {
             <docs-tutorial-preview />
@@ -38,13 +38,13 @@
           <!-- Container to hide preview, console and footer when only the interactive terminal is used  -->
           <mat-tab-group class="docs-editor-tabs" animationDuration="0ms" mat-stretch-tabs="false">
             @if (displayPreviewInMatTabGroup()) {
-            <mat-tab label="Preview">
+            <mat-tab label="预览">
               <docs-tutorial-preview />
             </mat-tab>
             }
-            <mat-tab label="Console">
+            <mat-tab label="控制台">
               <ng-template mat-tab-label>
-                Console @if (errorsCount()) {
+                控制台 @if (errorsCount()) {
                 <docs-icon class="docs-icon_high-contrast">error</docs-icon>
                 <span>
                   {{ errorsCount() }}
@@ -56,7 +56,7 @@
                 class="docs-tutorial-terminal"
               />
             </mat-tab>
-            <mat-tab label="Terminal">
+            <mat-tab label="终端">
               <docs-tutorial-terminal
                 [type]="TerminalType.INTERACTIVE"
                 class="docs-tutorial-terminal"
@@ -67,7 +67,7 @@
           <button
             type="button"
             (click)="reset()"
-            title="Refresh the preview"
+            title="刷新此预览"
             [disabled]="!shouldEnableReset()"
             class="adev-refresh-btn"
           >
diff --git a/adev/src/app/editor/embedded-tutorial-manager.service.ts b/adev/src/app/editor/embedded-tutorial-manager.service.ts
index 1dcfa872f564..dc251e23ff89 100644
--- a/adev/src/app/editor/embedded-tutorial-manager.service.ts
+++ b/adev/src/app/editor/embedded-tutorial-manager.service.ts
@@ -141,7 +141,7 @@ export class EmbeddedTutorialManager {
       `${TUTORIALS_ASSETS_WEB_PATH}/${tutorial}/source-code.json`,
     );
 
-    if (!tutorialSourceCode.ok) throw new Error(`Missing source code for tutorial ${tutorial}`);
+    if (!tutorialSourceCode.ok) throw new Error(`缺少教程 ${tutorial} 的源代码。`);
 
     return await tutorialSourceCode.json();
   }
@@ -151,7 +151,7 @@ export class EmbeddedTutorialManager {
       `${TUTORIALS_ASSETS_WEB_PATH}/${tutorial}/metadata.json`,
     );
 
-    if (!tutorialSourceCode.ok) throw new Error(`Missing metadata for ${tutorial}`);
+    if (!tutorialSourceCode.ok) throw new Error(`缺少教程 ${tutorial} 的元数据。`);
 
     return await tutorialSourceCode.json();
   }
diff --git a/adev/src/app/editor/node-runtime-sandbox.service.ts b/adev/src/app/editor/node-runtime-sandbox.service.ts
index f036194ff369..23f7d80cdae8 100644
--- a/adev/src/app/editor/node-runtime-sandbox.service.ts
+++ b/adev/src/app/editor/node-runtime-sandbox.service.ts
@@ -20,6 +20,7 @@ import {ErrorType, NodeRuntimeState} from './node-runtime-state.service';
 import {TerminalHandler} from './terminal/terminal-handler.service';
 import {TypingsLoader} from './typings-loader.service';
 
+// 这两个不能翻译，因为它是用于判断状态的信息
 export const DEV_SERVER_READY_MSG = 'Watch mode enabled. Watching for file changes...';
 export const OUT_OF_MEMORY_MSG = 'Out of memory';
 
@@ -79,9 +80,9 @@ export class NodeRuntimeSandbox {
 
     try {
       if (!this.embeddedTutorialManager.type())
-        throw Error("Tutorial type isn't available, can not initialize the NodeRuntimeSandbox");
+        throw Error('教程类型不可用，无法初始化 NodeRuntimeSandbox。');
 
-      console.time('Load time');
+      console.time('加载时间');
 
       let webContainer: WebContainer;
       if (this.nodeRuntimeState.loadingStep() === LoadingStep.NOT_STARTED) {
@@ -103,7 +104,7 @@ export class NodeRuntimeSandbox {
         await this.initProject();
       }
 
-      console.timeEnd('Load time');
+      console.timeEnd('加载时间');
     } catch (error: any) {
       // If we're already in an error state, throw away the most recent error which may have happened because
       // we were in the error state already and tried to do more things after terminating.
@@ -183,7 +184,7 @@ export class NodeRuntimeSandbox {
     const exitCode = await this.installDependencies();
 
     if (![PROCESS_EXIT_CODE.SIGTERM, PROCESS_EXIT_CODE.SUCCESS].includes(exitCode))
-      throw new Error('Installation failed');
+      throw new Error('安装失败');
 
     await Promise.all([this.loadTypes(), this.startDevServer()]);
   }
@@ -485,7 +486,7 @@ export class NodeRuntimeSandbox {
     // wait until the dev server finishes the first compilation
     await new Promise<void>((resolve, reject) => {
       if (!this.devServerProcess) {
-        reject('dev server is not running');
+        reject('没有运行中的开发服务器');
         return;
       }
 
diff --git a/adev/src/app/editor/node-runtime-state.service.ts b/adev/src/app/editor/node-runtime-state.service.ts
index 54b99977338b..317b318668ca 100644
--- a/adev/src/app/editor/node-runtime-state.service.ts
+++ b/adev/src/app/editor/node-runtime-state.service.ts
@@ -79,7 +79,7 @@ export class NodeRuntimeState {
   private checkUnsupportedEnvironment(): void {
     if (isIos) {
       this.setError({
-        message: 'Unsupported environment',
+        message: '不支持此环境',
         type: ErrorType.UNSUPPORTED_BROWSER_ENVIRONMENT,
       });
     }
diff --git a/adev/src/app/editor/preview/preview-error.component.html b/adev/src/app/editor/preview/preview-error.component.html
index 88b6c773f8cc..bcfa5cfa8521 100644
--- a/adev/src/app/editor/preview/preview-error.component.html
+++ b/adev/src/app/editor/preview/preview-error.component.html
@@ -1,23 +1,21 @@
 <div class="adev-preview-error docs-light-mode docs-mini-scroll-track">
   @if (error()?.type === ErrorType.UNSUPPORTED_BROWSER_ENVIRONMENT) {
     @if (isIos) {
-      <p>Open angular.dev on desktop to code in your browser.</p>
+      <p>在桌面设备上打开 angular.dev，直接在浏览器中编写代码。</p>
     }
   } @else if (error()?.type === ErrorType.COOKIES || error()?.type === ErrorType.UNKNOWN) {
     <p>
-      We couldn't start the tutorial app. Please ensure third party cookies are enabled for this
-      site.
+      我们无法启动教程应用。请确保已为此站点启用第三方 Cookie。
     </p>
   } @else if (error()?.type === ErrorType.OUT_OF_MEMORY) {
     <p>
-      We couldn't start the tutorial app because your browser is out of memory. To free up memory,
-      close angular.dev tutorials in other tabs or windows, and refresh the page.
+      我们无法启动教程应用，因为你的浏览器内存不足。请关闭其他标签页或窗口中的 angular.dev 教程，并刷新页面以释放内存。
     </p>
   }
 
   @if (error()?.message) {
     <small>
-      The error message is:
+      错误信息为：
       <code>{{ error()!.message }}</code>
     </small>
   }
diff --git a/adev/src/app/editor/preview/preview.component.html b/adev/src/app/editor/preview/preview.component.html
index edc30bb625f4..f752424efb8a 100644
--- a/adev/src/app/editor/preview/preview.component.html
+++ b/adev/src/app/editor/preview/preview.component.html
@@ -3,7 +3,7 @@
     <iframe
       class="adev-embedded-editor-preview"
       allow="cross-origin-isolated"
-      title="Editor preview"
+      title="编辑器预览"
       [src]="previewUrlForIFrame()"
     ></iframe>
   } @else {
@@ -14,25 +14,25 @@
     <div class="adev-embedded-editor-preview-loading">
       @switch (loadingProgressValue()) {
         @case (loadingEnum.NOT_STARTED) {
-          <span class="adev-embedded-editor-preview-loading-starting">Starting</span>
+          <span class="adev-embedded-editor-preview-loading-starting">正在启动</span>
         }
         @case (loadingEnum.BOOT) {
-          <span class="adev-embedded-editor-preview-loading-boot">Booting</span>
+          <span class="adev-embedded-editor-preview-loading-boot">正在引导</span>
         }
         @case (loadingEnum.LOAD_FILES) {
-          <span class="adev-embedded-editor-preview-loading-load-files">Creating project</span>
+          <span class="adev-embedded-editor-preview-loading-load-files">正在创建项目</span>
         }
         @case (loadingEnum.INSTALL) {
-          <span class="adev-embedded-editor-preview-loading-install">Installing packages</span>
+          <span class="adev-embedded-editor-preview-loading-install">正在安装依赖包</span>
         }
         @case (loadingEnum.START_DEV_SERVER) {
           <span class="adev-embedded-editor-preview-loading-start-dev-server">
-            Initializing dev server
+            正在初始化开发服务器
           </span>
         }
       }
       <progress
-        title="Preview progress"
+        title="预览进度"
         [value]="loadingProgressValue()"
         [max]="loadingEnum.READY"
       ></progress>
diff --git a/adev/src/app/editor/terminal/interactive-terminal.ts b/adev/src/app/editor/terminal/interactive-terminal.ts
index 7a97964d9eb3..d7fc1ffd2266 100644
--- a/adev/src/app/editor/terminal/interactive-terminal.ts
+++ b/adev/src/app/editor/terminal/interactive-terminal.ts
@@ -14,7 +14,7 @@ import {WINDOW} from '@angular/docs';
 
 import {CommandValidator} from './command-validator.service';
 
-export const NOT_VALID_COMMAND_MSG = 'Angular Documentation - Not allowed command!';
+export const NOT_VALID_COMMAND_MSG = 'Angular 文档 - 不允许此命令！';
 export const ALLOWED_KEYS: Array<KeyboardEvent['key']> = [
   // Allow Backspace to delete what was typed
   'Backspace',
diff --git a/adev/src/app/editor/typings-loader.service.ts b/adev/src/app/editor/typings-loader.service.ts
index 429354273901..45618b31b296 100644
--- a/adev/src/app/editor/typings-loader.service.ts
+++ b/adev/src/app/editor/typings-loader.service.ts
@@ -133,7 +133,7 @@ export class TypingsLoader {
   }
 
   private async getTypeDefinitionFilesFromDirectory(directory: string): Promise<string[]> {
-    if (!this.webContainer) throw new Error('this.webContainer is not defined');
+    if (!this.webContainer) throw new Error('this.webContainer 尚未定义');
 
     const files = await this.webContainer.fs.readdir(directory);
 
diff --git a/adev/src/app/features/home/components/home-animation/home-animation.component.html b/adev/src/app/features/home/components/home-animation/home-animation.component.html
index a599d9eefada..512ac6f02142 100644
--- a/adev/src/app/features/home/components/home-animation/home-animation.component.html
+++ b/adev/src/app/features/home/components/home-animation/home-animation.component.html
@@ -5,14 +5,15 @@
       href="https://blog.angular.dev/meet-angular-v19-7b29dfd05b84"
       class="adev-banner"
       target="_blank"
+      rel="noopener"
     >
-      <h1 tabindex="-1">Angular v19 is here!</h1>
-      <p class="adev-banner-cta">Read about our newest release.</p>
+      <h1 tabindex="-1">Angular v19 已发布！</h1>
+      <p class="adev-banner-cta">阅读我们的最新版本。</p>
     </a>
     <div class="learn-angular">
       <a [routerLink]="ctaLink" class="adev-cta">
-        <button class="docs-primary-btn" [attr.text]="'Learn Angular'" aria-label="Learn Angular">
-          Learn Angular
+        <button class="docs-primary-btn" [attr.text]="'学习 Angular'" aria-label="学习 Angular">
+          学习 Angular
         </button>
       </a>
       <div class="adev-arrow"></div>
@@ -99,9 +100,9 @@ <h1 tabindex="-1">Angular v19 is here!</h1>
 
   <!-- Works at any scale -->
   <div adevAnimationLayer layerId="works-at-any-scale" class="works-at-any-scale-layer layer">
-    <h2>Works at any scale</h2>
+    <h2>适用于任何规模</h2>
     <p>
-      Angular lets you start small on a well-lit path and supports you as your team and apps grow.
+      Angular 让你从小规模开始，于坦途之上成长，并随着你的团队和应用程序的发展而提供支持。
     </p>
   </div>
 
@@ -124,19 +125,17 @@ <h2>Works at any scale</h2>
 
   <!-- Loved by millions -->
   <div adevAnimationLayer layerId="loved-by-millions" class="loved-by-millions-layer layer">
-    <h2>Loved by millions</h2>
+    <h2>深受数百万开发者喜爱</h2>
     <p>
-      Join the millions of developers all over the world building with Angular in a thriving and
-      friendly community.
+      加入全球数百万使用 Angular 构建应用的开发者，成为这个充满活力和友好的社区的一员。
     </p>
   </div>
 
   <!-- Build for everyone -->
   <div adevAnimationLayer layerId="build-for-everyone" class="build-for-everyone-layer layer">
-    <h2 class="title">Build for everyone</h2>
+    <h2 class="title">为所有人构建</h2>
     <p>
-      Rely on Angular's built-in hydration, internationalization, security, and accessibility
-      support to build for everyone around the world.
+      依靠 Angular 内置的水合、国际化、安全性和无障碍性支持，为全球所有人构建应用。
     </p>
   </div>
 </div>
diff --git a/adev/src/app/features/home/home.component.html b/adev/src/app/features/home/home.component.html
index 77e44585fc2f..af70bb092e3a 100644
--- a/adev/src/app/features/home/home.component.html
+++ b/adev/src/app/features/home/home.component.html
@@ -11,7 +11,7 @@
     @defer (when showEditor(); prefetch when prefetchEditor()) {
       <adev-code-editor [tutorialFiles]="tutorialFiles" />
     } @loading {
-      <img alt="Code editor" />
+      <img alt="代码编辑器" />
     }
   </div>
 </div>
diff --git a/adev/src/app/features/playground/playground.component.html b/adev/src/app/features/playground/playground.component.html
index 32f533172997..426f42bd9f9d 100644
--- a/adev/src/app/features/playground/playground.component.html
+++ b/adev/src/app/features/playground/playground.component.html
@@ -1,9 +1,9 @@
 <div class="adev-playground-header">
   <header>
-    <h1 tabindex="-1">Angular Playground</h1>
+    <h1 tabindex="-1">Angular 演练场</h1>
   </header>
   <div class="adev-template-select">
-    <label for="playgroundTemplate">Select a template</label>
+    <label for="playgroundTemplate">选择模板</label>
     <button [cdkMenuTriggerFor]="templatesMenu">
       <span>{{ selectedTemplate.label }}</span>
       <docs-icon>expand_more</docs-icon>
diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html
index 8c5e47f8de6e..1ab447fdd0a7 100644
--- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html
+++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html
@@ -6,4 +6,4 @@
   />
 }
 
-<div id="jump-msg" class="cdk-visually-hidden">Jump to details</div>
+<div id="jump-msg" class="cdk-visually-hidden">跳转到详情</div>
diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.html b/adev/src/app/features/references/api-reference-list/api-reference-list.component.html
index e621558c8b97..d1bfff74ba14 100644
--- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.html
+++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.html
@@ -1,25 +1,25 @@
 <header>
-  <h1>API Reference</h1>
+  <h1>API 参考手册</h1>
 </header>
 
 <div class="adev-reference-list-filter">
   <div class="adev-reference-list-query-filter">
     <docs-text-field
       name="query"
-      placeholder="Filter"
+      placeholder="过滤器"
       [(ngModel)]="query"
       (ngModelChange)="syncUrlWithFilters()"
     />
 
     <docs-slide-toggle
       buttonId="includeDeprecated"
-      label="Show @deprecated"
+      label="显示 @deprecated"
       name="includeDeprecated"
       [(ngModel)]="includeDeprecated"
     />
   </div>
 
-  <p class="adev-reference-list-type-filter-label">Filter by Identifier type</p>
+  <p class="adev-reference-list-type-filter-label">按标识符类型筛选</p>
   <ul class="adev-reference-list-type-filter">
     @for (itemType of itemTypes; track itemType) {
       <li
@@ -38,6 +38,6 @@ <h1>API Reference</h1>
   <adev-api-items-section [group]="group" />
 } @empty {
   <div class="adev-reference-list-empty">
-    <p>No API items found.</p>
+    <p>未找到 API 条目。</p>
   </div>
 }
diff --git a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html
index b9ba87546e1d..83054b11635b 100644
--- a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html
+++ b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html
@@ -2,4 +2,4 @@
   <docs-viewer [docContent]="docContent.contents" [hasToc]="true" />
 }
 
-<div id="jump-msg" class="cdk-visually-hidden">Jump to details</div>
+<div id="jump-msg" class="cdk-visually-hidden">跳转到详情</div>
diff --git a/adev/src/app/features/references/pipes/api-label.pipe.ts b/adev/src/app/features/references/pipes/api-label.pipe.ts
index 766d6ff47424..2c414a74927f 100644
--- a/adev/src/app/features/references/pipes/api-label.pipe.ts
+++ b/adev/src/app/features/references/pipes/api-label.pipe.ts
@@ -36,17 +36,17 @@ export const shortLabelsMap: Record<ApiItemType, string> = {
 };
 
 export const fullLabelsMap: Record<ApiItemType, string> = {
-  [ApiItemType.BLOCK]: 'Block',
-  [ApiItemType.CLASS]: 'Class',
-  [ApiItemType.CONST]: 'Const',
-  [ApiItemType.DECORATOR]: 'Decorator',
-  [ApiItemType.DIRECTIVE]: 'Directive',
-  [ApiItemType.ELEMENT]: 'Element',
-  [ApiItemType.ENUM]: 'Enum',
-  [ApiItemType.FUNCTION]: 'Function',
-  [ApiItemType.INTERFACE]: 'Interface',
-  [ApiItemType.PIPE]: 'Pipe',
-  [ApiItemType.NG_MODULE]: 'Module',
-  [ApiItemType.TYPE_ALIAS]: 'Type Alias',
-  [ApiItemType.INITIALIZER_API_FUNCTION]: 'Initializer API',
+  [ApiItemType.BLOCK]: '控制块',
+  [ApiItemType.CLASS]: '类',
+  [ApiItemType.CONST]: '常量',
+  [ApiItemType.DECORATOR]: '装饰器',
+  [ApiItemType.DIRECTIVE]: '指令',
+  [ApiItemType.ELEMENT]: '元素',
+  [ApiItemType.ENUM]: '枚举',
+  [ApiItemType.FUNCTION]: '函数',
+  [ApiItemType.INTERFACE]: '接口',
+  [ApiItemType.PIPE]: '管道',
+  [ApiItemType.NG_MODULE]: '模块',
+  [ApiItemType.TYPE_ALIAS]: '类型别名',
+  [ApiItemType.INITIALIZER_API_FUNCTION]: '初始化 API',
 };
diff --git a/adev/src/app/features/tutorial/tutorial.component.html b/adev/src/app/features/tutorial/tutorial.component.html
index 31c1932aa176..a10595a14caa 100644
--- a/adev/src/app/features/tutorial/tutorial.component.html
+++ b/adev/src/app/features/tutorial/tutorial.component.html
@@ -60,11 +60,11 @@
           (click)="answerRevealed() ? handleResetAnswer() : handleRevealAnswer()"
           [disabled]="!canRevealAnswer()"
           class="docs-reveal-answer-button adev-reveal-desktop-button docs-primary-btn"
-          [attr.text]="answerRevealed() ? 'Reset' : 'Reveal Answer'"
-          [attr.aria-label]="answerRevealed() ? 'Reset' : 'Reveal Answer'"
+          [attr.text]="answerRevealed() ? '重置' : '显示答案'"
+          [attr.aria-label]="answerRevealed() ? '重置' : '显示答案'"
           [class.adev-reset-answer-button]="answerRevealed()"
         >
-          {{ answerRevealed() ? 'Reset' : 'Reveal Answer' }}
+          {{ answerRevealed() ? '重置' : '显示答案' }}
         </button>
       }
 
@@ -116,11 +116,11 @@
             (click)="answerRevealed() ? handleResetAnswer() : handleRevealAnswer()"
             [disabled]="!canRevealAnswer()"
             class="docs-reveal-answer-button adev-reveal-mobile-button docs-primary-btn"
-            [attr.text]="answerRevealed() ? 'Reset' : 'Reveal Answer'"
-            [attr.aria-label]="answerRevealed() ? 'Reset' : 'Reveal Answer'"
+            [attr.text]="answerRevealed() ? '重置' : '显示答案'"
+            [attr.aria-label]="answerRevealed() ? '重置' : '显示答案'"
             [class.adev-reset-answer-button]="answerRevealed()"
           >
-            {{ answerRevealed() ? 'Reset' : 'Reveal Answer' }}
+            {{ answerRevealed() ? '重置' : '显示答案' }}
           </button>
         }
       </div>
@@ -137,7 +137,7 @@
             class="adev-nav-list"
           />
           @if (nextTutorialPath()) {
-            <a [routerLink]="'/' + nextTutorialPath()">Next Tutorial</a>
+            <a [routerLink]="'/' + nextTutorialPath()">下一个教程</a>
           }
         </div>
       }
diff --git a/adev/src/app/features/tutorial/tutorial.component.ts b/adev/src/app/features/tutorial/tutorial.component.ts
index cdb3e6f17dbb..c5e196a24a35 100644
--- a/adev/src/app/features/tutorial/tutorial.component.ts
+++ b/adev/src/app/features/tutorial/tutorial.component.ts
@@ -49,7 +49,7 @@ import {
 } from '../../editor/index';
 import {SplitResizerHandler} from './split-resizer-handler.service';
 
-const INTRODUCTION_LABEL = 'Introduction';
+const INTRODUCTION_LABEL = '简介';
 
 @Component({
   selector: 'adev-tutorial',
diff --git a/adev/src/app/features/update/recommendations.ts b/adev/src/app/features/update/recommendations.ts
index 8e94b03cfe90..ab0768d060a5 100644
--- a/adev/src/app/features/update/recommendations.ts
+++ b/adev/src/app/features/update/recommendations.ts
@@ -31,48 +31,46 @@ export const RECOMMENDATIONS: Step[] = [
     possibleIn: 200,
     necessaryAsOf: 400,
     level: ApplicationComplexity.Basic,
-    step: 'Extends OnInit',
+    step: '扩展 OnInit',
     action:
-      "Ensure you don't use `extends OnInit`, or use `extends` with any lifecycle event. Instead use `implements <lifecycle event>.`",
+      '确保不要使用 `extends OnInit`，或者将 `extends` 与任何生命周期事件合用。而应该使用 `implements <生命周期事件>`。',
   },
   {
     possibleIn: 200,
     necessaryAsOf: 400,
     level: ApplicationComplexity.Advanced,
-    step: 'Deep Imports',
-    action:
-      'Stop using deep imports, these symbols are now marked with ɵ and are not part of our public API.',
+    step: '深层导入',
+    action: '停止使用深层导入，这些符号现在已标记为 ɵ，并不是我们公共 API 的一部分。',
   },
   {
     possibleIn: 200,
     necessaryAsOf: 400,
     level: ApplicationComplexity.Advanced,
     step: 'invokeElementMethod',
-    action:
-      'Stop using `Renderer.invokeElementMethod` as this method has been removed. There is not currently a replacement.',
+    action: '停止使用 `Renderer.invokeElementMethod`，因为该方法已被移除。目前没有替代方法。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 400,
     level: ApplicationComplexity.Basic,
-    step: 'Non Animations Module',
+    step: '非动画模块',
     action:
-      'If you use animations in your application, you should import `BrowserAnimationsModule` from `@angular/platform-browser/animations` in your App `NgModule`.',
+      '如果你的应用中使用了动画，请在你的应用 `NgModule` 中从 `@angular/platform-browser/animations` 导入 `BrowserAnimationsModule`。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 400,
     level: ApplicationComplexity.Medium,
-    step: 'Native Form Validation',
+    step: '原生表单验证',
     action:
-      'Angular began adding a `novalidate` attribute to form elements when you include `FormsModule`. To re-enable native forms behaviors, use `ngNoForm` or add `ngNativeValidate`.',
+      '当你包含 `FormsModule` 时，Angular 就会开始向表单元素添加 `novalidate` 属性。要重新启用原生表单行为，请使用 `ngNoForm` 或添加 `ngNativeValidate`。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 400,
     level: ApplicationComplexity.Advanced,
     step: 'RootRenderer',
-    action: 'Replace `RootRenderer` with `RendererFactoryV2` instead.',
+    action: '用 `RendererFactoryV2` 替换 `RootRenderer`。',
   },
   {
     possibleIn: 400,
@@ -80,15 +78,15 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     ngUpgrade: true,
     step: 'downgradeInjectable',
-    action: 'The return value of `upgrade/static/downgradeInjectable` has changed.',
+    action: '`upgrade/static/downgradeInjectable` 的返回值已更改。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 400,
     level: ApplicationComplexity.Advanced,
-    step: 'Animations Tests',
+    step: '动画测试',
     action:
-      'If you use Animations and tests, add `mods[1].NoopAnimationsModule` to your `TestBed.initTestEnvironment` call.',
+      '如果你使用了动画和测试，请在你的 `TestBed.initTestEnvironment` 调用中添加 `mods[1].NoopAnimationsModule`。',
   },
   {
     possibleIn: 200,
@@ -96,35 +94,35 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'DefaultIterableDiffer',
     action:
-      'Stop using `DefaultIterableDiffer`, `KeyValueDiffers#factories`, or `IterableDiffers#factories`',
+      '停止使用 `DefaultIterableDiffer`、`KeyValueDiffers#factories` 或 `IterableDiffers#factories`。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 500,
     level: ApplicationComplexity.Basic,
-    step: 'Template Tag',
-    action: 'Rename your `template` tags to `ng-template`',
+    step: '模板标签',
+    action: '将你的 `template` 标签重命名为 `ng-template`。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 500,
     level: ApplicationComplexity.Medium,
     step: 'OpaqueToken',
-    action: 'Replace any `OpaqueToken` with `InjectionToken`.',
+    action: '用 `InjectionToken` 替换任何 `OpaqueToken`。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 500,
     level: ApplicationComplexity.Advanced,
     step: 'DifferFactory',
-    action: 'If you call `DifferFactory.create(...)` remove the `ChangeDetectorRef` argument.',
+    action: '如果调用了 `DifferFactory.create(...)`，就移除 `ChangeDetectorRef` 参数。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 500,
     level: ApplicationComplexity.Advanced,
-    step: 'ErrorHandler Parameter',
-    action: 'Stop passing any arguments to the constructor for ErrorHandler',
+    step: 'ErrorHandler 参数',
+    action: '停止向 ErrorHandler 构造函数传递任何参数。',
   },
   {
     possibleIn: 400,
@@ -132,22 +130,22 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'ngProbeToken',
     action:
-      'If you use ngProbeToken, make sure you import it from @angular/core instead of @angular/platform-browser',
+      '如果使用了 ngProbeToken，请确保从 @angular/core 而不是 @angular/platform-browser 导入它。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 500,
     level: ApplicationComplexity.Advanced,
     step: 'TrackByFn',
-    action: 'If you use TrackByFn, instead use TrackByFunction',
+    action: '如果使用了 TrackByFn，改用 TrackByFunction。',
   },
   {
     possibleIn: 500,
     necessaryAsOf: 500,
     level: ApplicationComplexity.Basic,
-    step: 'i18n Pipe Change',
+    step: 'i18n 管道更改',
     action:
-      'If you rely on the date, currency, decimal, or percent pipes, in 5 you will see minor changes to the format. For applications using locales other than en-us you will need to import it and optionally `locale_extended_fr` from `@angular/common/i18n_data/locale_fr` and registerLocaleData(local).',
+      '如果依赖于日期、货币、小数或百分比管道，在 5 中将看到格式的轻微更改。对于使用其他区域设置而不是 en-us 的应用程序，你需要导入它，可选择从 `@angular/common/i18n_data/locale_fr` 导入 `locale_extended_fr` 并注册 locale。',
   },
   {
     possibleIn: 500,
@@ -155,52 +153,51 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'gendir',
     action:
-      'Do not rely on `gendir`, instead look at using `skipTemplateCodeGen`. <a href=https://github.com/angular/angular/issues/19339#issuecomment-332607471" target="_blank">Read More</a>',
+      '不要依赖于 `gendir`，而是考虑使用 `skipTemplateCodeGen`。 <a href=https://github.com/angular/angular/issues/19339#issuecomment-332607471" target="_blank">阅读更多</a>',
   },
   {
     possibleIn: 220,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Basic,
     ngUpgrade: true,
-    step: 'Dynamic ngUpgrade',
+    step: '动态 ngUpgrade',
     action:
-      'Replace `downgradeComponent`, `downgradeInjectable`, `UpgradeComponent`, and `UpgradeModule` imported from `@angular/upgrade`. Instead use the new versions in `@angular/upgrade/static`',
+      '用 `@angular/upgrade/static` 中的新版本替换从 `@angular/upgrade` 导入的 `downgradeComponent`、`downgradeInjectable`、`UpgradeComponent` 和 `UpgradeModule`。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Medium,
-    step: 'Animations in Core',
-    action:
-      'If you import any animations services or tools from @angular/core, you should import them from @angular/animations',
+    step: '核心中的动画',
+    action: '如果从 @angular/core 导入了任何动画服务或工具，应该从 @angular/animations 导入。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Advanced,
     step: 'ngOutletContext',
-    action: 'Replace `ngOutletContext` with `ngTemplateOutletContext`.',
+    action: '用 `ngTemplateOutletContext` 替换 `ngOutletContext`。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Advanced,
     step: 'collectionChangeRecord',
-    action: 'Replace `CollectionChangeRecord` with `IterableChangeRecord`',
+    action: '用 `IterableChangeRecord` 替换 `CollectionChangeRecord`。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Advanced,
     step: 'Renderer',
-    action: 'Anywhere you use Renderer, now use Renderer2',
+    action: '任何使用 Renderer 的地方，现在使用 Renderer2。',
   },
   {
     possibleIn: 400,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Advanced,
-    step: 'Router Query Params',
-    action: 'If you use preserveQueryParams, instead use queryParamsHandling',
+    step: '路由器查询参数',
+    action: '如果使用了 preserveQueryParams，改用 queryParamsHandling。',
   },
   {
     possibleIn: 430,
@@ -208,82 +205,81 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'Http',
     action:
-      "If you use the legacy `HttpModule` and the `Http` service, switch to `HttpClientModule` and the `HttpClient` service. HttpClient simplifies the default ergonomics (you don't need to map to JSON anymore) and now supports typed return values and interceptors. Read more on [angular.dev](https://angular.io/guide/http).",
+      '如果使用传统的 `HttpModule` 和 `Http` 服务，请切换到 `HttpClientModule` 和 `HttpClient` 服务。HttpClient 简化了默认的人体工程学（你不再需要映射到 JSON），现在支持类型化返回值和拦截器。在 [angular.dev](https://angular.io/guide/http) 上阅读更多。',
   },
   {
     possibleIn: 430,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Advanced,
-    step: 'DOCUMENT in @angular/platform-browser',
-    action:
-      'If you use DOCUMENT from @angular/platform-browser, you should start to import this from @angular/common',
+    step: '@angular/platform-browser 中的 DOCUMENT',
+    action: '如果使用 @angular/platform-browser 中的 DOCUMENT，请开始从 @angular/common 导入。',
   },
   {
     possibleIn: 500,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Advanced,
     step: 'ReflectiveInjector',
-    action: 'Anywhere you use ReflectiveInjector, now use StaticInjector',
+    action: '任何使用 ReflectiveInjector 的地方，现在使用 StaticInjector。',
   },
   {
     possibleIn: 500,
     necessaryAsOf: 550,
     level: ApplicationComplexity.Medium,
-    step: 'Whitespace',
+    step: '空白字符',
     action:
-      'Choose a value of `off` for `preserveWhitespaces` in your `tsconfig.json` under the `angularCompilerOptions` key to gain the benefits of this setting, which was set to `off` by default in v6.',
+      '在你的 `tsconfig.json` 的 `angularCompilerOptions` 键下选择 `off` 作为 `preserveWhitespaces` 的值，以获得此设置的好处，该设置在 v6 中默认设置为 `off`。',
   },
   {
     possibleIn: 600,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Basic,
-    step: 'node 8',
+    step: 'Node 8',
     action:
-      'Make sure you are using <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 8 or later</a>',
+      '确保你正在使用<a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 8或更高版本</a>。',
   },
   {
     possibleIn: 600,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Basic,
     windows: false,
-    step: 'Update to CLI v6',
+    step: '更新到 CLI v6',
     action:
-      'Update your Angular CLI, and migrate the configuration to the <a href="https://github.com/angular/angular-cli/wiki/angular-workspace" target="_blank">new angular.json format</a> by running the following:<br/><br/>`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@6 update @angular/cli@6`<br/>',
+      '更新你的 Angular CLI，并将配置迁移到<a href="https://github.com/angular/angular-cli/wiki/angular-workspace" target="_blank">新的 angular.json 格式</a>，方法如下：<br/><br/>`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@6 update @angular/cli@6`<br/>',
   },
   {
     possibleIn: 600,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Basic,
     windows: true,
-    step: 'Update to CLI v6',
+    step: '更新到 CLI v6',
     action:
-      'Update your Angular CLI, and migrate the configuration to the <a href="https://github.com/angular/angular-cli/wiki/angular-workspace" target="_blank">new angular.json format</a> by running the following:<br/><br/>`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@6 update @angular/cli@6 @angular/core@6"`<br/>',
+      '更新你的 Angular CLI，并将配置迁移到<a href="https://github.com/angular/angular-cli/wiki/angular-workspace" target="_blank">新的 angular.json 格式</a>，方法如下：<br/><br/>`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@6 update @angular/cli@6 @angular/core@6"`<br/>',
   },
   {
     possibleIn: 600,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Medium,
-    step: 'cli v6 scripts',
+    step: 'CLI v6 脚本',
     action:
-      'Update any `scripts` you may have in your `package.json` to use the latest Angular CLI commands. All CLI commands now use two dashes for flags (eg `ng build --prod --source-map`) to be POSIX compliant.',
+      '更新你在 `package.json` 中可能有的任何 `scripts`，以使用最新的 Angular CLI 命令。所有 CLI 命令现在使用两个短横线作为标志（例如 `ng build --prod --source-map`）以符合 POSIX 规范。',
   },
   {
     possibleIn: 600,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Basic,
     windows: false,
-    step: 'Update to Angular v6',
+    step: '更新到 Angular v6',
     action:
-      "Update all of your Angular framework packages to v6, and the correct version of RxJS and TypeScript.<br/><br/>`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@6 update @angular/core@6`<br/><br/>After the update, TypeScript and RxJS will more accurately flow types across your application, which may expose existing errors in your application's typings",
+      '将你的所有 Angular 框架包更新到 v6，并正确安装 RxJS 和 TypeScript 的版本。<br/><br/>`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@6 update @angular/core@6`<br/><br/>更新后，TypeScript 和 RxJS 将更准确地流经你的应用程序的类型，这可能会暴露出应用程序类型的现有错误',
   },
   {
     possibleIn: 600,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Basic,
     windows: true,
-    step: 'Update to Angular v6',
+    step: '更新到 Angular v6',
     action:
-      'Update all of your Angular framework packages to v6, and the correct version of RxJS and TypeScript.<br/><br/>`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@6 update @angular/cli@6 @angular/core@6"`<br/><br/>After the update, TypeScript and RxJS will more accurately flow types across your application, which may expose existing errors in your application\'s typings',
+      '将你的所有 Angular 框架包更新到 v6，并正确安装 RxJS 和 TypeScript 的版本。<br/><br/>`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@6 update @angular/cli@6 @angular/core@6"`<br/><br/>更新后，TypeScript 和 RxJS 将更准确地流经你的应用程序的类型，这可能会暴露出应用程序类型的现有错误',
   },
   {
     possibleIn: 600,
@@ -291,31 +287,31 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'forms v6',
     action:
-      'In Angular Forms, `AbstractControl#statusChanges` now emits an event of `PENDING` when you call `AbstractControl#markAsPending`. Ensure that if you are filtering or checking events from `statusChanges` that you account for the new event when calling `markAsPending`.',
+      '在 Angular Forms 中，当调用 `AbstractControl#markAsPending` 时，`AbstractControl#statusChanges` 现在会发出 `PENDING` 事件。确保如果你在调用 `markAsPending` 时过滤或检查 `statusChanges` 事件，你要考虑到调用 `markAsPending` 时的新事件。',
   },
   {
     possibleIn: 600,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Advanced,
-    step: 'animations timing',
+    step: '动画时序',
     action:
-      'If you use totalTime from an `AnimationEvent` within a disabled Zone, it will no longer report a time of 0. To detect if an animation event is reporting a disabled animation then the `event.disabled` property can be used instead.',
+      '如果在禁用的 Zone 中使用 `AnimationEvent` 的 `totalTime`，它将不再报告为 0。要检测动画事件是否报告为禁用的动画，则可以使用 `event.disabled` 属性。',
   },
   {
     possibleIn: 600,
     necessaryAsOf: 700,
     level: ApplicationComplexity.Advanced,
-    step: 'ngModel on form control',
+    step: '表单控件上的 ngModel',
     action:
-      'Support for using the ngModel input property and ngModelChange event with reactive form directives has been deprecated in v6 and removed in v7.',
+      '在 v6 中已弃用并在 v7 中删除了对使用 ngModel 输入属性和 ngModelChange 事件与响应式表单指令一起使用的支持。',
   },
   {
     possibleIn: 600,
     necessaryAsOf: 600,
     level: ApplicationComplexity.Medium,
-    step: 'ngModelChange order',
+    step: 'ngModelChange 顺序',
     action:
-      'ngModelChange is now emitted after the value/validity is updated on its control instead of before to better match expectations. If you rely on the order of these events, you will need to begin tracking the old value in your component.',
+      '现在，在更新控件的值/有效性后，`ngModelChange` 被发出，而不是之前，以更好地匹配预期。如果你依赖于这些事件的顺序，你需要开始在你的组件中跟踪旧值。',
   },
   {
     possibleIn: 600,
@@ -323,9 +319,9 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     windows: false,
     material: true,
-    step: 'Update Dependencies for v6',
+    step: '更新到 v6 的依赖项',
     action:
-      'Update Angular Material to the latest version.<br/><br/>`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@6 update @angular/material@6`<br/><br/>This will also automatically migrate deprecated APIs.',
+      '将 Angular Material 更新到最新版本。<br/><br/>`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@6 update @angular/material@6`<br/><br/>这也将自动迁移已弃用的 API。',
   },
   {
     possibleIn: 600,
@@ -333,9 +329,9 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     windows: true,
     material: true,
-    step: 'Update Dependencies for v6',
+    step: '更新到 v6 的依赖项',
     action:
-      'Update Angular Material to the latest version.<br/><br/>`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@6 update @angular/material@6"`<br/><br/>This will also automatically migrate deprecated APIs.',
+      '将 Angular Material 更新到最新版本。<br/><br/>`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@6 update @angular/material@6"`<br/><br/>这也将自动迁移已弃用的 API。',
   },
   {
     possibleIn: 600,
@@ -343,30 +339,30 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'strictPropertyInitializer',
     action:
-      'If you have TypeScript configured to be strict (if you have set `strict` to `true` in your `tsconfig.json` file), update your `tsconfig.json` to disable `strictPropertyInitialization` or move property initialization from `ngOnInit` to your constructor. You can learn more about this flag on the <a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#strict-class-initialization">TypeScript 2.7 release notes</a>.',
+      '如果 TypeScript 配置为严格模式（如果你在 `tsconfig.json` 文件中将 `strict` 设置为 `true`），请更新你的 `tsconfig.json` 以禁用 `strictPropertyInitialization` 或将属性初始化从 `ngOnInit` 移动到你的构造函数。你可以在<a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#strict-class-initialization">TypeScript 2.7 发布说明</a>中了解更多关于此标志的信息。',
   },
   {
     possibleIn: 600,
     necessaryAsOf: 700,
     level: ApplicationComplexity.Basic,
-    step: 'update to RxJS 6',
+    step: '更新到 RxJS 6',
     action:
-      'Remove deprecated RxJS 5 features using <a href="https://github.com/ReactiveX/rxjs-tslint" target="_blank">rxjs-tslint auto update rules</a><br/><br/>For most applications this will mean running the following two commands:<br/><br/>`npx rxjs-tslint`<br/>`rxjs-5-to-6-migrate -p src/tsconfig.app.json`',
+      '使用<a href="https://github.com/ReactiveX/rxjs-tslint" target="_blank">rxjs-tslint 自动更新规则</a>删除已弃用的 RxJS 5 特性<br/><br/>对于大多数应用程序，这意味着运行以下两个命令：<br/><br/>`npx rxjs-tslint`<br/>`rxjs-5-to-6-migrate -p src/tsconfig.app.json`',
   },
   {
     possibleIn: 600,
     necessaryAsOf: 800,
     level: ApplicationComplexity.Medium,
-    step: 'remove rxjs-compat',
-    action: 'Once you and all of your dependencies have updated to RxJS 6, remove `rxjs-compat`.',
+    step: '移除 rxjs-compat',
+    action: '一旦你和你所有的依赖项都已更新到 RxJS 6，请移除 `rxjs-compat`。',
   },
   {
     possibleIn: 610,
     necessaryAsOf: 800,
     level: ApplicationComplexity.Medium,
-    step: 'use files instead of versionedFiles',
+    step: '使用文件而不是 versionedFiles',
     action:
-      'If you use the Angular Service worker, migrate any `versionedFiles` to the `files` array. The behavior is the same.',
+      '如果你使用 Angular Service Worker，请将任何 `versionedFiles` 迁移到 `files` 数组中。行为是一样的。',
   },
   {
     possibleIn: 700,
@@ -374,7 +370,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'TypeScript 3.1',
     action:
-      'Angular now uses TypeScript 3.1, read more about any potential breaking changes: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-1.html',
+      'Angular 现在使用 TypeScript 3.1，请阅读有关任何潜在的破坏性变化：<a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-1.html">TypeScript 3.1 发布说明</a>',
   },
   {
     possibleIn: 700,
@@ -382,25 +378,25 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'Node 10',
     action:
-      'Angular has now added support for Node 10: https://nodejs.org/en/blog/release/v10.0.0/',
+      'Angular 现在添加了对 Node 10 的支持：<a href="https://nodejs.org/en/blog/release/v10.0.0/" target="_blank">Node 10 发布说明</a>',
   },
   {
     possibleIn: 700,
     necessaryAsOf: 700,
     level: ApplicationComplexity.Basic,
     windows: false,
-    step: 'v7 update',
+    step: '更新到 v7',
     action:
-      'Update to v7 of the core framework and CLI by running `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@7 update @angular/cli@7 @angular/core@7` in your terminal.',
+      '在终端中运行`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@7 update @angular/cli@7 @angular/core@7`来更新核心框架和 CLI 到 v7。',
   },
   {
     possibleIn: 700,
     necessaryAsOf: 700,
     level: ApplicationComplexity.Basic,
     windows: true,
-    step: 'v7 update',
+    step: '更新到 v7',
     action:
-      'Update to v7 of the core framework and CLI by running `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@7 update @angular/cli@7 @angular/core@7"` in your terminal.',
+      '在终端中运行`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@7 update @angular/cli@7 @angular/core@7"`来更新核心框架和 CLI 到 v7。',
   },
   {
     possibleIn: 700,
@@ -408,9 +404,9 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     windows: false,
     material: true,
-    step: 'v7 material update',
+    step: '更新到 v7 的 Material',
     action:
-      'Update Angular Material to v7 by running `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@7 update @angular/material@7` in your terminal. You should test your application for sizing and layout changes.',
+      '在终端中运行`NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@7 update @angular/material@7`来更新 Angular Material 到 v7。你应该测试你的应用程序是否有大小和布局的变化。',
   },
   {
     possibleIn: 700,
@@ -418,53 +414,52 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     windows: true,
     material: true,
-    step: 'v7 material update',
+    step: '更新到 v7 的 Material',
     action:
-      'Update Angular Material to v7 by running `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@7 update @angular/material@7"` in your terminal. You should test your application for sizing and layout changes.',
+      '在终端中运行`cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@7 update @angular/material@7"`来更新 Angular Material 到 v7。你应该测试你的应用程序是否有大小和布局的变化。',
   },
   {
     possibleIn: 700,
     necessaryAsOf: 700,
     level: ApplicationComplexity.Medium,
     material: true,
-    step: 'v7 material changes',
+    step: 'v7 的 Material 变化',
     action:
-      "If you use screenshot tests, you'll need to regenerate your screenshot golden files as many minor visual tweaks have landed.",
+      '如果你使用屏幕截图测试，你需要重新生成你的屏幕截图黄金文件，因为许多次要的视觉调整已经完成。',
   },
   {
     possibleIn: 700,
     necessaryAsOf: 800,
     level: ApplicationComplexity.Advanced,
     material: true,
-    step: 'v7 material deprecations',
-    action:
-      'Stop using `matRippleSpeedFactor` and `baseSpeedFactor` for ripples, using Animation config instead.',
+    step: 'v7 的 Material 弃用',
+    action: '停止使用 `matRippleSpeedFactor` 和 `baseSpeedFactor` 来进行涟漪，改用动画配置。',
   },
   {
     possibleIn: 800,
     necessaryAsOf: 800,
     level: ApplicationComplexity.Basic,
     windows: false,
-    step: 'v8 update',
+    step: '更新到 v8',
     action:
-      'Update to version 8 of the core framework and CLI by running `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@8 update @angular/cli@8 @angular/core@8` in your terminal and review and commit the changes.',
+      '在终端中运行 `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@8 update @angular/cli@8 @angular/core@8`，然后查看并提交更改。',
   },
   {
     possibleIn: 800,
     necessaryAsOf: 800,
     level: ApplicationComplexity.Basic,
     windows: true,
-    step: 'v8 update',
+    step: '更新到 v8',
     action:
-      'Update to version 8 of the core framework and CLI by running `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@8 update @angular/cli@8 @angular/core@8"` in your terminal and review and commit the changes.',
+      '在终端中运行 `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@8 update @angular/cli@8 @angular/core@8"`，然后查看并提交更改。',
   },
   {
     possibleIn: 800,
     necessaryAsOf: 800,
     level: ApplicationComplexity.Basic,
-    step: 'use ::ng-deep instead of /deep/',
+    step: '使用 ::ng-deep 替代 /deep/',
     action:
-      'Replace `/deep/` with `::ng-deep` in your styles, [read more about angular component styles and ::ng-deep](https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep). `/deep/` and `::ng-deep` both are deprecated but using `::ng-deep` is preferred until the shadow-piercing descendant combinator is [removed from browsers and tools](https://www.chromestatus.com/features/6750456638341120) completely.',
+      '在你的样式中用 `::ng-deep` 替换 `/deep/`，[了解更多关于 Angular 组件样式和 ::ng-deep](https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep)。 `/deep/` 和 `::ng-deep` 都已弃用，但在完全从浏览器和工具中移除影子穿透后，使用 `::ng-deep` 更可取。',
   },
   {
     possibleIn: 800,
@@ -472,7 +467,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'TypeScript 3.4',
     action:
-      'Angular now uses TypeScript 3.4, [read more about errors that might arise from improved type checking](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html).',
+      'Angular 现在使用 TypeScript 3.4，[了解更多可能由改进的类型检查引起的错误](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html)。',
   },
   {
     possibleIn: 800,
@@ -480,31 +475,31 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'node 10',
     action:
-      'Make sure you are using <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 10 or later</a>.',
+      '确保你正在使用 <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 10 或更高版本</a>。',
   },
   {
     possibleIn: 800,
     necessaryAsOf: 800,
     level: ApplicationComplexity.Basic,
-    step: 'Differential Loading',
+    step: '差异化加载',
     action:
-      "The CLI's build command now automatically creates a modern ES2015 build with minimal polyfills and a compatible ES5 build for older browsers, and loads the appropriate file based on the browser.  You may opt-out of this change by setting your `target` back to `es5` in your `tsconfig.json`. Learn more on [angular.io](https://angular.io/guide/deployment#differential-loading).",
+      'CLI 的构建命令现在会自动创建一个现代的 ES2015 构建，带有最小的 polyfills，并为旧版浏览器创建兼容的 ES5 构建，并根据浏览器加载适当的文件。 你可以通过将 `tsconfig.json` 中的 `target` 设置回 `es5` 来选择退出此更改。在 [angular.io](https://angular.io/guide/deployment#differential-loading) 上了解更多。',
   },
   {
     possibleIn: 800,
     necessaryAsOf: 800,
     level: ApplicationComplexity.Basic,
-    step: 'CLI Telemetry',
+    step: 'CLI 遥测',
     action:
-      'When using new versions of the CLI, you will be asked if you want to opt-in to share your CLI usage data. You can also add your own Google Analytics account. This lets us make better decisions about which CLI features to prioritize, and measure the impact of our improvements. Learn more on [angular.io](https://angular.io/analytics).',
+      '使用 CLI 的新版本时，你将被询问是否要选择加入共享 CLI 使用数据。你也可以添加自己的 Google Analytics 帐户。这样我们可以更好地决定优先考虑哪些 CLI 功能，并衡量我们改进的影响。在 [angular.io](https://angular.io/analytics) 上了解更多。',
   },
   {
     possibleIn: 800,
     necessaryAsOf: 800,
     level: ApplicationComplexity.Basic,
-    step: 'static query timing',
+    step: '静态查询时机',
     action:
-      "If you use `ViewChild` or `ContentChild`, we're updating the way we resolve these queries to give developers more control. You must now specify that change detection should run before results are set. Example: `@ContentChild('foo', {static: false}) foo !: ElementRef;`. `ng update` will update your queries automatically, but it will err on the side of making your queries `static` for compatibility. Learn more on [angular.io](https://angular.io/guide/static-query-migration).",
+      "如果你使用 `ViewChild` 或 `ContentChild`，我们正在更新解析这些查询的方式，以给开发者更多控制。你现在必须指定变更检测应该在设置结果之前运行。示例：`@ContentChild('foo', {static: false}) foo !: ElementRef;`。 `ng update` 将自动更新你的查询，但它会倾向于使你的查询为 `static`，以保证兼容性。在 [angular.io](https://angular.io/guide/static-query-migration) 上了解更多。",
   },
   {
     possibleIn: 800,
@@ -512,9 +507,9 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     windows: false,
     material: true,
-    step: 'v8 material update',
+    step: '更新到 v8 的 Material',
     action:
-      'Update Angular Material to version 8 by running `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@8 update @angular/material@8` in your terminal.',
+      '在终端中运行 `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@8 update @angular/material@8`。',
   },
   {
     possibleIn: 800,
@@ -522,50 +517,50 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     windows: true,
     material: true,
-    step: 'v8 material update',
+    step: '更新到 v8 的 Material',
     action:
-      'Update Angular Material to version 8 by running `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@8 update @angular/material@8"` in your terminal.',
+      '在终端中运行 `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@8 update @angular/material@8"`。',
   },
   {
     possibleIn: 800,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Basic,
     material: true,
-    step: 'deep imports',
+    step: '深度导入',
     action:
-      'Instead of importing from `@angular/material`, you should import deeply from the specific component. E.g. `@angular/material/button`. `ng update` will do this automatically for you.',
+      '不要直接从 `@angular/material` 导入，而是从特定组件进行深度导入。例如 `@angular/material/button`。`ng update` 将为你自动完成此操作。',
   },
   {
     possibleIn: 800,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Basic,
-    step: 'new loadChildren',
+    step: '新的 loadChildren',
     action:
-      'For lazy loaded modules via the router, make sure you are [using dynamic imports](https://angular.io/guide/deprecations#loadchildren-string-syntax). Importing via string is removed in v9. `ng update` should take care of this automatically. Learn more on [angular.io](https://angular.io/guide/deprecations#loadchildren-string-syntax).',
+      '对于通过路由器进行的惰性加载的模块，请确保你正在[使用动态导入](https://angular.io/guide/deprecations#loadchildren-string-syntax)。在 v9 中，通过字符串进行导入已被移除。`ng update` 应该会自动处理这个。在 [angular.io](https://angular.io/guide/deprecations#loadchildren-string-syntax) 上了解更多。',
   },
   {
-    possibleIn: 800,
+    possibleIn: 900,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Advanced,
-    step: 'platform deprecated',
+    step: '平台废弃',
     action:
-      "We are deprecating support for `@angular/platform-webworker`, as it has been incompatible with the CLI. Running Angular's rendering architecture in a web worker did not meet developer needs. You can still use web workers with Angular. Learn more in our [web worker guide](https://v9.angular.io/guide/web-worker). If you have use cases where you need this, let us know at devrel@angular.io!",
+      '我们正在废弃对 `@angular/platform-webworker` 的支持，因为它与 CLI 不兼容。在 Web Worker 中运行 Angular 的渲染架构不符合开发者的需求。你仍然可以在 Angular 中使用 Web Worker。在我们的 [Web Worker 指南](https://v9.angular.io/guide/web-worker) 中了解更多。如果你有需要这方面的用例，请通过 devrel@angular.io 与我们联系！',
   },
   {
-    possibleIn: 800,
-    necessaryAsOf: 800,
+    possibleIn: 900,
+    necessaryAsOf: 900,
     level: ApplicationComplexity.Advanced,
     step: 'node-sass',
     action:
-      'We have switched from the native Sass compiler to the JavaScript compiler. To switch back to the native version, install it as a devDependency: `npm install node-sass --save-dev`.',
+      '我们已经从本地 Sass 编译器切换到 JavaScript 编译器。要切换回本地版本，请将其安装为 devDependency：`npm install node-sass --save-dev`。',
   },
   {
-    possibleIn: 800,
-    necessaryAsOf: 800,
+    possibleIn: 900,
+    necessaryAsOf: 900,
     level: ApplicationComplexity.Advanced,
-    step: 'schematics async',
+    step: 'schematics 异步',
     action:
-      'If you are building your own Schematics, they have previously been *potentially* asynchronous. As of 8.0, all schematics will be asynchronous.',
+      '如果你正在构建自己的 Schematics，它们之前*可能*是异步的。从 8.0 开始，所有的 Schematics 都将是异步的。',
   },
   {
     possibleIn: 900,
@@ -573,33 +568,33 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'node 10.13',
     action:
-      'Make sure you are using <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 10.13 or later</a>.',
+      '确保你正在使用 <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 10.13 或更高版本</a>。',
   },
   {
     possibleIn: 900,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Basic,
     windows: false,
-    step: 'cli v8 latest',
+    step: '更新到 CLI v8 最新版本',
     action:
-      'Run `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@8 update @angular/core@8 @angular/cli@8` in your workspace directory to update to the latest 8.x version of `@angular/core` and `@angular/cli` and commit these changes.',
+      '在你的工作空间目录中运行 `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@8 update @angular/core@8 @angular/cli@8`，以更新到最新的 8.x 版本的 `@angular/core` 和 `@angular/cli` 并提交这些更改。',
   },
   {
     possibleIn: 900,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Basic,
     windows: true,
-    step: 'cli v8 latest',
+    step: '更新到 CLI v8 最新版本',
     action:
-      'Run `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@8 update @angular/cli@8 @angular/core@8"` in your workspace directory to update to the latest 8.x version of `@angular/core` and `@angular/cli` and commit these changes.',
+      '在你的工作空间目录中运行 `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@8 update @angular/cli@8 @angular/core@8`，以更新到最新的 8.x 版本的 `@angular/core` 和 `@angular/cli` 并提交这些更改。',
   },
   {
     possibleIn: 900,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Medium,
-    step: 'create commits',
+    step: '创建提交',
     action:
-      'You can optionally pass the `--create-commits` (or `-C`) flag to [ng update](https://angular.io/cli/update) commands to create a git commit per individual migration.',
+      '你可以选择向 [ng update](https://angular.io/cli/update) 命令传递 `--create-commits`（或 `-C`）标志，以每个独立迁移创建一个 git 提交。',
   },
   {
     possibleIn: 900,
@@ -608,7 +603,7 @@ export const RECOMMENDATIONS: Step[] = [
     windows: false,
     step: 'ng update v9',
     action:
-      'Run `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @angular/core@9 @angular/cli@9` which should bring you to version 9 of Angular.',
+      '运行 `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @angular/core@9 @angular/cli@9`，应该将你升级到 Angular 的 9 版本。',
   },
   {
     possibleIn: 900,
@@ -617,7 +612,7 @@ export const RECOMMENDATIONS: Step[] = [
     windows: true,
     step: 'ng update v9',
     action:
-      'Run `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @angular/cli@9 @angular/core@9"` which should bring you to version 9 of Angular.',
+      '运行 `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @angular/cli@9 @angular/core@9"`，应该将你升级到 Angular 的 9 版本。',
   },
   {
     possibleIn: 900,
@@ -625,7 +620,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'typescript 3.8',
     action:
-      'Your project has now been updated to TypeScript 3.8, read more about new compiler checks and errors that might require you to fix issues in your code in the [TypeScript 3.7](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html) or [TypeScript 3.8](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html) announcements.',
+      '你的项目现在已更新到 TypeScript 3.8，请阅读有关新编译器检查和可能需要修复代码中问题的错误的更多信息，可在 [TypeScript 3.7](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html) 或 [TypeScript 3.8](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html) 公告中了解更多。',
   },
   {
     possibleIn: 900,
@@ -633,8 +628,8 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     windows: false,
     material: true,
-    step: 'update @angular/material',
-    action: 'Run `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @angular/material@9`.',
+    step: '更新 @angular/material',
+    action: '运行 `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @angular/material@9`。',
   },
   {
     possibleIn: 900,
@@ -642,51 +637,51 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     windows: true,
     material: true,
-    step: 'update @angular/material',
+    step: '更新 @angular/material',
     action:
-      'Run `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @angular/material@9"`.',
+      '运行 `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @angular/material@9"`。',
   },
   {
     possibleIn: 900,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Advanced,
     windows: false,
-    step: 'update @nguniversal/hapi-engine',
+    step: '更新 @nguniversal/hapi-engine',
     action:
-      'If you use Angular Universal, run `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @nguniversal/hapi-engine@9` or `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @nguniversal/express-engine@9` depending on the engine you use. This step may require the `--force` flag if any of your third-party dependencies have not updated the Angular version of their peer dependencies.',
+      '如果你使用 Angular Universal，请运行 `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @nguniversal/hapi-engine@9` 或 `NG_DISABLE_VERSION_CHECK=1 npx @angular/cli@9 update @nguniversal/express-engine@9`，具体取决于你使用的引擎。如果你的任何第三方依赖项未更新其对等依赖项的 Angular 版本，则此步骤可能需要 `--force` 标志。',
   },
   {
     possibleIn: 900,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Advanced,
     windows: true,
-    step: 'update @nguniversal/hapi-engine',
+    step: '更新 @nguniversal/hapi-engine',
     action:
-      'If you use Angular Universal, run `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @nguniversal/hapi-engine@9"` or `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @nguniversal/express-engine@9"` depending on the engine you use. This step may require the `--force` flag if any of your third-party dependencies have not updated the Angular version of their peer dependencies.',
+      '如果你使用 Angular Universal，请运行 `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @nguniversal/hapi-engine@9"` 或 `cmd /C "set "NG_DISABLE_VERSION_CHECK=1" && npx @angular/cli@9 update @nguniversal/express-engine@9"`，具体取决于你使用的引擎。如果你的任何第三方依赖项未更新其对等依赖项的 Angular 版本，则此步骤可能需要 `--force` 标志。',
   },
   {
     possibleIn: 900,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Basic,
-    step: 'dependencies update',
+    step: '更新依赖项',
     action:
-      'If your project depends on other Angular libraries, we recommend that you consider updating to their latest version. In some cases this update might be required in order to resolve API incompatibilities. Consult `ng update` or `npm outdated` to learn about your outdated libraries.',
+      '如果你的项目依赖于其他 Angular 库，我们建议你考虑更新到它们的最新版本。在某些情况下，此更新可能是必需的，以解决 API 不兼容性。查阅 `ng update` 或 `npm outdated` 以了解你过时的库。',
   },
   {
     possibleIn: 900,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Basic,
-    step: 'ivy update',
+    step: '更新 Ivy',
     action:
-      'During the update to version 9, your project was transformed as necessary via code migrations in order to remove any incompatible or deprecated API calls from your code base. You can now review these changes, and consult the [Updating to version 9 guide](https://v9.angular.io/guide/updating-to-version-9) to learn more about the changes.',
+      '在升级到 9 版本期间，通过代码迁移必要地转换了你的项目，以从代码库中移除任何不兼容或已废弃的 API 调用。现在你可以查看这些更改，并查阅 [升级到 9 版本指南](https://v9.angular.io/guide/updating-to-version-9) 以了解更多详情。',
   },
   {
     possibleIn: 900,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Medium,
-    step: 'stylesUpdate',
+    step: '更新样式',
     action:
-      'Bound CSS styles and classes previously were applied with a "last change wins" strategy, but now follow a defined precedence. Learn more about [Styling Precedence](https://angular.io/guide/attribute-binding#styling-precedence).',
+      '以前，绑定的 CSS 样式和类是采用“最后一次更改获胜”的策略应用的，但现在遵循一个定义好的优先级。了解更多关于 [样式优先级](https://angular.io/guide/attribute-binding#styling-precedence)。',
   },
   {
     possibleIn: 900,
@@ -694,7 +689,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'ModuleWithProviders',
     action:
-      'If you are a library author and you had a method returning `ModuleWithProviders`  (typically via a method named `forRoot()`), you will need to specify the generic type. Learn more [angular.io](https://v9.angular.io/guide/deprecations#modulewithproviders-type-without-a-generic)',
+      '如果你是库的作者，并且有一个返回 `ModuleWithProviders` 的方法（通常是通过名为 `forRoot()` 的方法），则需要指定泛型类型。了解更多 [angular.io](https://v9.angular.io/guide/deprecations#modulewithproviders-type-without-a-generic)',
   },
   {
     possibleIn: 800,
@@ -702,39 +697,38 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'wtf',
     action:
-      'Support for web tracing framework in Angular was deprecated in version 8. You should stop using any of the `wtf*` APIs. To do performance tracing, we recommend using [browser performance tools](https://developers.google.com/web/tools/lighthouse/audits/user-timing).',
+      '在 Angular 8 中，支持 Web 追踪框架已废弃。你应该停止使用任何 `wtf*` API。为了进行性能追踪，我们建议使用 [浏览器性能工具](https://developers.google.com/web/tools/lighthouse/audits/user-timing)。',
   },
   {
     possibleIn: 800,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Medium,
-    step: 'es5browser',
+    step: 'es5 浏览器',
     action:
-      'Remove any `es5BrowserSupport` flags in your `angular.json` and set your `target` to `es2015` in your `tsconfig.json`. Angular now uses your browserslist to determine if an ES5 build is needed. `ng update` will migrate you automatically.',
+      '在你的 `angular.json` 中删除任何 `es5BrowserSupport` 标志，并将你的 `tsconfig.json` 中的 `target` 设置为 `es2015`。Angular 现在使用你的 browserslist 来确定是否需要 ES5 构建。`ng update` 将自动迁移你。',
   },
   {
     possibleIn: 900,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Medium,
-    step: 'ngForm selector',
-    action:
-      'If you use `ngForm` element selector to create Angular Forms, you should instead use `ng-form`.',
+    step: 'ngForm 选择器',
+    action: '如果你使用 `ngForm` 元素选择器创建 Angular 表单，你应该改用 `ng-form`。',
   },
   {
     possibleIn: 900,
     necessaryAsOf: 900,
     level: ApplicationComplexity.Advanced,
-    step: 'typings compilation',
+    step: 'typings 编译',
     action:
-      'We have updated the `tsconfig.app.json` to limit the files compiled. If you rely on other files being included in the compilation, such as a `typings.d.ts` file, you need to manually add it to the compilation.',
+      '我们已更新 `tsconfig.app.json` 以限制编译的文件。如果你依赖于其他文件被包含在编译中，比如一个 `typings.d.ts` 文件，你需要手动将其添加到编译中。',
   },
   {
     possibleIn: 900,
     necessaryAsOf: 1000,
     level: ApplicationComplexity.Medium,
-    step: 'debug',
+    step: '调试',
     action:
-      'With Angular 9 Ivy is now the default rendering engine, for any compatibility problems that might arise, read the [Ivy compatibility guide](https://v9.angular.io/guide/ivy-compatibility).',
+      '随着 Angular 9，Ivy 现在是默认的渲染引擎，针对可能出现的任何兼容性问题，阅读 [Ivy 兼容性指南](https://v9.angular.io/guide/ivy-compatibility)。',
   },
   {
     possibleIn: 900,
@@ -742,7 +736,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'express-universal-server',
     action:
-      'If you use Angular Universal with  `@nguniversal/express-engine` or `@nguniversal/hapi-engine`, several backup files will be created. One of them for `server.ts`. If this file defers from the default one, you may need to copy some changes from the `server.ts.bak` to `server.ts` manually.',
+      '如果你使用 Angular Universal 与 `@nguniversal/express-engine` 或 `@nguniversal/hapi-engine`，将会创建几个备份文件。其中一个是用于 `server.ts` 的。如果此文件与默认文件不同，你可能需要手动将一些更改从 `server.ts.bak` 复制到 `server.ts`。',
   },
   {
     possibleIn: 900,
@@ -750,7 +744,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'ivy i18n',
     action:
-      "Angular 9 introduced a global `$localize()` function that needs to be loaded if you depend on Angular's internationalization (i18n). Run `ng add @angular/localize` to add the necessary packages and code modifications. Consult the [$localize Global Import Migration guide](https://v9.angular.io/guide/migration-localize) to learn more about the changes.",
+      'Angular 9 引入了一个全局的 `$localize()` 函数，如果你依赖于 Angular 的国际化（i18n），则需要加载它。运行 `ng add @angular/localize` 来添加必要的包和代码修改。查阅 [$localize 全局导入迁移指南](https://v9.angular.io/guide/migration-localize) 以了解更多变化。',
   },
   {
     possibleIn: 900,
@@ -758,7 +752,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'entryComponents',
     action:
-      'In your application projects, you can remove `entryComponents` NgModules and any uses of `ANALYZE_FOR_ENTRY_COMPONENTS`. They are no longer required with the Ivy compiler and runtime. You may need to keep these if building a library that will be consumed by a View Engine application.',
+      '在你的应用项目中，你可以删除 `entryComponents` NgModules 和任何使用 `ANALYZE_FOR_ENTRY_COMPONENTS` 的地方。它们在 Ivy 编译器和运行时中不再需要。如果构建的是一个将被 View Engine 应用程序消费的库，可能需要保留这些。',
   },
   {
     possibleIn: 900,
@@ -766,7 +760,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'testbed-get',
     action:
-      'If you use `TestBed.get`, you should instead use `TestBed.inject`. This new method has the same behavior, but is type safe.',
+      '如果你使用 `TestBed.get`，你应该改用 `TestBed.inject`。这个新方法具有相同的行为，但是类型安全。',
   },
   {
     possibleIn: 900,
@@ -774,16 +768,15 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: '$localize',
     action:
-      "If you use [Angular's i18n support](http://angular.io/guide/i18n), you will need to begin using `@angular/localize`. Learn more about the [$localize Global Import Migration](https://v9.angular.io/guide/migration-localize).",
+      '如果你使用 [Angular 的国际化支持](http://angular.io/guide/i18n)，你将需要开始使用 `@angular/localize`。了解更多关于 [$localize 全局导入迁移](https://v9.angular.io/guide/migration-localize)。',
   },
-
   {
     possibleIn: 1000,
     necessaryAsOf: 1000,
     level: ApplicationComplexity.Basic,
     step: 'v10 NodeJS 12',
     action:
-      'Make sure you are using <a href="https://nodejs.org/dist/latest-v12.x/" target="_blank">Node 12 or later</a>.',
+      '确保你正在使用 <a href="https://nodejs.org/dist/latest-v12.x/" target="_blank">Node 12 或更高版本</a>。',
   },
   {
     possibleIn: 1000,
@@ -791,23 +784,22 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'ng update v10',
     action:
-      'Run `npx @angular/cli@10 update @angular/core@10 @angular/cli@10` which should bring you to version 10 of Angular.',
+      '运行 `npx @angular/cli@10 update @angular/core@10 @angular/cli@10`，这将使你的 Angular 版本升级到 10。',
   },
   {
     possibleIn: 1000,
     necessaryAsOf: 1000,
     level: ApplicationComplexity.Basic,
     material: true,
-    step: 'update @angular/material',
-    action: 'Run `npx @angular/cli@10 update @angular/material@10`.',
+    step: '更新 @angular/material',
+    action: '运行 `npx @angular/cli@10 update @angular/material@10`。',
   },
   {
     possibleIn: 1000,
     necessaryAsOf: 1000,
     level: ApplicationComplexity.Basic,
     step: 'browserlist',
-    action:
-      'New projects use the filename `.browserslistrc` instead of `browserslist`. `ng update` will migrate you automatically.',
+    action: '新项目使用文件名 `.browserslistrc`，而不是 `browserslist`。`ng update` 将自动迁移你。',
   },
   {
     possibleIn: 1000,
@@ -815,15 +807,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v10-versions',
     action:
-      'Angular now requires `tslint` v6, `tslib` v2, and [TypeScript 3.9](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-9.html). `ng update` will migrate you automatically.',
+      'Angular 现在需要 `tslint` v6、`tslib` v2 和 [TypeScript 3.9](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-9.html)。`ng update` 将自动迁移你。',
   },
   {
     possibleIn: 1000,
     necessaryAsOf: 1000,
     level: ApplicationComplexity.Advanced,
     step: 'styleext',
-    action:
-      'Stop using `styleext` or `spec` in your Angular schematics. `ng update` will migrate you automatically.',
+    action: '停止在你的 Angular schematics 中使用 `styleext` 或 `spec`。`ng update` 将自动迁移你。',
   },
   {
     possibleIn: 900,
@@ -831,7 +822,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'classes-without-decorators',
     action:
-      'In version 10, classes that use Angular features and do not have an Angular decorator are no longer supported.  [Read more](https://v10.angular.io/guide/migration-undecorated-classes).  `ng update` will migrate you automatically.',
+      '在 10 版本中，不带有 Angular 装饰器的类不再受支持。[了解更多](https://v10.angular.io/guide/migration-undecorated-classes)。`ng update` 将自动迁移你。',
   },
   {
     possibleIn: 900,
@@ -839,7 +830,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'injectable-definitions',
     action:
-      'As of Angular 9, enforcement of @Injectable decorators for DI is stricter and incomplete provider definitions behave differently. [Read more](https://v9.angular.io/guide/migration-injectable). `ng update` will migrate you automatically.',
+      '从 Angular 9 开始，对于 DI，@Injectable 装饰器的执行更加严格，不完整的提供程序定义的行为会有所不同。[了解更多](https://v9.angular.io/guide/migration-injectable)。`ng update` 将自动迁移你。',
   },
   {
     possibleIn: 1000,
@@ -847,7 +838,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'closure-jsdoc-comments',
     action:
-      "Angular's NPM packages no longer contain jsdoc comments, which are necessary for use with closure compiler (extremely uncommon). This support was experimental and only worked in some use cases. There will be an alternative recommended path announced shortly.",
+      'Angular 的 NPM 包不再包含 jsdoc 注释，这在与闭包编译器的使用中是必需的（极其罕见）。此支持是实验性的，并且只在一些情况下起作用。很快将宣布替代推荐路径。',
   },
   {
     possibleIn: 1000,
@@ -855,7 +846,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'forms-number-input',
     action:
-      'If you use Angular forms, inputs of type `number` no longer listen to [change events](https://developer.mozilla.org/docs/Web/API/HTMLElement/change_event) (this events are not necessarily fired for each alteration the value), instead listen for an [input events](https://developer.mozilla.org/docs/Web/API/HTMLElement/input_event). ',
+      '如果你使用 Angular 表单，`number` 类型的输入不再监听 [change 事件](https://developer.mozilla.org/docs/Web/API/HTMLElement/change_event)（这些事件不一定会在每次更改值时触发），而是监听 [input 事件](https://developer.mozilla.org/docs/Web/API/HTMLElement/input_event)。',
   },
   {
     possibleIn: 1000,
@@ -863,7 +854,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'forms-length-input',
     action:
-      "For Angular forms validation, the `minLength` and `maxLength` validators now verify that the form control's value has a numeric length property, and only validate for length if that's the case.",
+      '对于 Angular 表单验证，`minLength` 和 `maxLength` 验证器现在验证表单控件的值是否具有数字长度属性，并且仅在这种情况下验证长度。',
   },
   {
     possibleIn: 1000,
@@ -871,7 +862,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'esm5-bundles',
     action:
-      "The [Angular Package Format](https://g.co/ng/apf) has been updated to remove `esm5` and `fesm5` formats. These are no longer distributed in our npm packages. If you don't use the CLI, you may need to downlevel Angular code to ES5 yourself.",
+      'Angular 包格式已更新，删除了 `esm5` 和 `fesm5` 格式。这些不再分发在我们的 npm 包中。如果你不使用 CLI，你可能需要自行将 Angular 代码降级到 ES5。',
   },
   {
     possibleIn: 1000,
@@ -879,7 +870,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'console-errors',
     action:
-      "Warnings about unknown elements are now logged as errors. This won't break your app, but it may trip up tools that expect nothing to be logged via `console.error`.",
+      '有关未知元素的警告现在记录为错误。这不会破坏你的应用程序，但可能会使期望 `console.error` 不记录任何内容的工具受到影响。',
   },
   {
     possibleIn: 1000,
@@ -887,7 +878,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'router-resolver-empty',
     action:
-      'Any resolver which returns `EMPTY` will cancel navigation. If you want to allow navigation to continue, you will need to update the resolvers to emit some value, (i.e. `defaultIfEmpty(...)`, `of(...)`, etc).',
+      '任何返回 `EMPTY` 的解析器将取消导航。如果你想要允许导航继续，你需要更新解析器以发出一些值（例如 `defaultIfEmpty(...)`、`of(...)` 等）。',
   },
   {
     possibleIn: 1000,
@@ -895,7 +886,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'sw-vary-headers',
     action:
-      'If you use the Angular service worker and rely on resources with [Vary](https://developer.mozilla.org/docs/Web/HTTP/Headers/Vary) headers, these headers are now ignored to avoid unpredictable behavior across browsers. To avoid this, [configure](https://angular.io/guide/service-worker-config) your service worker to avoid caching these resources.',
+      '如果你使用 Angular 服务工作器并依赖于带有 [Vary](https://developer.mozilla.org/docs/Web/HTTP/Headers/Vary) 标头的资源，这些标头现在被忽略，以避免在各个浏览器之间出现不可预测的行为。为了避免这种情况，[配置](https://angular.io/guide/service-worker-config) 你的服务工作器以避免缓存这些资源。',
   },
   {
     possibleIn: 1000,
@@ -903,7 +894,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'expression-changed-after-checked-new',
     action:
-      'You may see `ExpressionChangedAfterItHasBeenChecked` errors that were not detected before when using the `async` pipe. The error could previously have gone undetected because two `WrappedValues` are considered "equal" in all cases for the purposes of the check, even if their respective unwrapped values are not. In version 10, `WrappedValue` has been removed.',
+      '当使用 `async` 管道时，你可能会看到之前未检测到的 `ExpressionChangedAfterItHasBeenChecked` 错误。以前的错误可能未被检测到，因为两个 `WrappedValues` 在检查目的上被认为是“相等的”，即使它们各自的未包装值不相等。在版本 10 中，`WrappedValue` 已被移除。',
   },
   {
     possibleIn: 1000,
@@ -911,7 +902,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'property-binding-change-detection',
     action:
-      'If you have a property binding such as `[val]=(observable | async).someProperty`, this will no longer trigger change detection if the value of `someProperty` is identical to the previous emit. If you rely on this, either manually subscribe and call `markForCheck` as needed or update the binding to ensure the reference changes.',
+      '如果你有一个属性绑定，例如 `[val]=(observable | async).someProperty`，如果 `someProperty` 的值与之前的发射值相同，这将不再触发变更检测。如果你依赖于此行为，要么手动订阅并根据需要调用 `markForCheck`，要么更新绑定以确保引用更改。',
   },
   {
     possibleIn: 1000,
@@ -919,15 +910,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'day-periods-crossing-midnight',
     action:
-      'If you use either `formatDate()` or `DatePipe` and any of the `b` or `B` format codes, the logic has been updated so that it matches times that are within a day period that spans midnight, so it will now render the correct output, such as at `night` in the case of English.',
+      '如果你使用 `formatDate()` 或 `DatePipe`，并且使用了任何 `b` 或 `B` 格式代码，逻辑已更新，使其匹配跨越午夜的一天时段内的时间，因此现在将渲染正确的输出，例如在英文环境中的 `night`。',
   },
   {
     possibleIn: 1000,
     necessaryAsOf: 1000,
     level: ApplicationComplexity.Advanced,
     step: 'urlmatcher-null',
-    action:
-      'If you use the `UrlMatcher`, the type now reflects that it could always return `null`.',
+    action: '如果你使用 `UrlMatcher`，现在其类型反映了它可以始终返回 `null`。',
   },
   {
     possibleIn: 1000,
@@ -935,7 +925,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v10-more-details',
     action:
-      'For more details about deprecations, automated migrations, and changes visit the [guide angular.io](https://v10.angular.io/guide/updating-to-version-10)',
+      '有关停用、自动迁移和更改的更多详细信息，请访问 [guide angular.io](https://v10.angular.io/guide/updating-to-version-10)',
   },
   {
     possibleIn: 1020,
@@ -943,16 +933,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'universal-baseurl',
     action:
-      'For Angular Universal users, if you use `useAbsoluteUrl` to setup `platform-server`, you now need to also specify `baseUrl`.',
+      '对于 Angular Universal 用户，如果你使用 `useAbsoluteUrl` 来设置 `platform-server`，现在还需要指定 `baseUrl`。',
   },
-
   {
     possibleIn: 1100,
     necessaryAsOf: 1100,
     level: ApplicationComplexity.Basic,
     step: 'v11 ng update',
-    action:
-      'Run `ng update @angular/core@11 @angular/cli@11` which should bring you to version 11 of Angular.',
+    action: '运行 `ng update @angular/core@11 @angular/cli@11` 将把你的 Angular 版本升级到 11。',
   },
   {
     possibleIn: 1100,
@@ -960,7 +948,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     material: true,
     step: 'update @angular/material',
-    action: 'Run `ng update @angular/material@11`.',
+    action: '运行 `ng update @angular/material@11`。',
   },
   {
     possibleIn: 1100,
@@ -968,7 +956,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v11 versions',
     action:
-      'Angular now requires [TypeScript 4.0](https://devblogs.microsoft.com/typescript/announcing-typescript-4-0/). `ng update` will migrate you automatically.',
+      'Angular 现在需要 [TypeScript 4.0](https://devblogs.microsoft.com/typescript/announcing-typescript-4-0/)。`ng update` 将自动迁移你的项目。',
   },
   {
     possibleIn: 1100,
@@ -976,7 +964,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v11 browser support',
     action:
-      'Support for IE9, IE10, and IE mobile has been removed. This was announced in the [v10 update](http://blog.angular.dev/version-10-of-angular-now-available-78960babd41#c357). ',
+      '不再支持 IE9、IE10 和 IE 移动版。这在 [v10 更新](http://blog.angular.dev/version-10-of-angular-now-available-78960babd41#c357) 中已经宣布。',
   },
   {
     possibleIn: 1100,
@@ -984,7 +972,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'webpack5 optin',
     action:
-      'You can now opt-in to use webpack 5 by using Yarn and adding `"resolutions": {"webpack": "^5.0.0"}` to your `package.json`.',
+      '你现在可以选择使用 webpack 5，使用 Yarn 并将 `"resolutions": {"webpack": "^5.0.0"}` 添加到你的 `package.json`。',
   },
   {
     possibleIn: 1100,
@@ -992,7 +980,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'ng new strict prompt',
     action:
-      'When generating new projects, you will be asked if you want to enable strict mode. This will configure TypeScript and the Angular compiler for stricter type checking, and apply smaller bundle budgets by default. You can use the `--strict=true` or `--strict=false` to skip the prompt.',
+      '当生成新项目时，你将被询问是否要启用严格模式。这将为 TypeScript 和 Angular 编译器配置更严格的类型检查，并默认应用更小的捆绑预算。你可以使用 `--strict=true` 或 `--strict=false` 来跳过提示。',
   },
   {
     possibleIn: 1100,
@@ -1000,15 +988,15 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v11 router relativeLinkResolution',
     action:
-      "If you use the router, the default value of `relativeLinkResolution` has changed from `legacy` to `corrected`. If your application previously used the default by not specifying a value in the `ExtraOptions` and uses relative links when navigating from children of empty path routes, you will need to update your `RouterModule`'s configuration to specifically specify `legacy` for `relativeLinkResolution`. See [the documentation](https://v11.angular.io/api/router/ExtraOptions#relativeLinkResolution) for more details.",
+      '如果你使用路由器，`relativeLinkResolution` 的默认值从 `legacy` 改为 `corrected`。如果你的应用程序以前使用默认值而未在 `ExtraOptions` 中指定值，并且在从空路径路由的子路由导航时使用相对链接，你需要更新你的 `RouterModule` 配置，明确为 `relativeLinkResolution` 指定 `legacy`。参见 [文档](https://v11.angular.io/api/router/ExtraOptions#relativeLinkResolution) 以获取更多详细信息。',
   },
   {
     possibleIn: 1100,
     necessaryAsOf: 1100,
     level: ApplicationComplexity.Advanced,
-    step: 'router initialNavigation',
+    step: 'v11 router initialNavigation',
     action:
-      'In the Angular Router, the options deprecated in v4 for `initialNavigation` have been removed. If you previously used `enabled` or `true`, now choose `enabledNonBlocking` or `enabledBlocking`. If you previously used `false` or `legacy_disabled`, now use `disabled`.',
+      '在 Angular 路由器中，v4 中已弃用的 `initialNavigation` 选项已被移除。如果你以前使用了 `enabled` 或 `true`，现在请选择 `enabledNonBlocking` 或 `enabledBlocking`。如果你以前使用了 `false` 或 `legacy_disabled`，现在使用 `disabled`。',
   },
   {
     possibleIn: 1100,
@@ -1016,7 +1004,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'routerlink preserveQueryParams',
     action:
-      'In the Angular Router\'s `routerLink`, `preserveQueryParams` has been removed, use `queryParamsHandling="preserve"` instead.',
+      '在 Angular 路由器的 `routerLink` 中，已删除了 `preserveQueryParams`，请使用 `queryParamsHandling="preserve"`。',
   },
   {
     possibleIn: 1100,
@@ -1024,7 +1012,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'routerlink queryParams typing',
     action:
-      'If you were accessing the `routerLink` values of `queryParams`, `fragment` or `queryParamsHandling` you might need to relax the typing to also accept `undefined` and `null`.',
+      '如果你正在访问 `routerLink` 的 `queryParams`、`fragment` 或 `queryParamsHandling` 值，你可能需要放宽类型以接受 `undefined` 和 `null`。',
   },
   {
     possibleIn: 1100,
@@ -1032,7 +1020,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'viewencapsulation native removed',
     action:
-      'The component view encapsulation option `ViewEncapsulation.Native` has been removed. Use `ViewEncapsulation.ShadowDom` instead. `ng update` will migrate you automatically.',
+      '组件视图封装选项 `ViewEncapsulation.Native` 已被移除。请使用 `ViewEncapsulation.ShadowDom`。`ng update` 将自动迁移你。',
   },
   {
     possibleIn: 1100,
@@ -1040,7 +1028,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'ICU expressions typechecked',
     action:
-      'If you use i18n, expressions within International Components for Unicode (ICUs) expressions are now type-checked again. This may cause compilation failures if errors are found in expressions that appear within an ICU. ',
+      '如果你使用 i18n，在 International Components for Unicode (ICUs) 表达式中的表达式现在再次进行类型检查。如果在 ICU 中的表达式中发现错误，可能会导致编译失败。',
   },
   {
     possibleIn: 1100,
@@ -1048,7 +1036,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'forms validators asyncValidators typing',
     action:
-      "Directives in the `@angular/forms` package used to have `any[]` as the type of the expected `validators` and `asyncValidators` arguments in constructors. Now these arguments are properly typed, so if your code relies on form's directive constructor types it may require some updates to improve type safety.",
+      '在 `@angular/forms` 包中的指令构造函数中，预期的 `validators` 和 `asyncValidators` 参数的类型曾经是 `any[]`。现在这些参数已经被正确地类型化，因此如果你的代码依赖于表单指令构造函数类型，可能需要一些更新来提高类型安全性。',
   },
   {
     possibleIn: 1100,
@@ -1056,7 +1044,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'forms AbstractFormControl',
     action:
-      "If you use Angular Forms, the type of `AbstractFormControl.parent` now includes null.  `ng update` will migrate you automatically, but in an unlikely case your code was testing the parent against undefined with strict equality, you'll need to change this to `=== null` instead, since the parent is now explicitly initialized with `null` instead of being left undefined.",
+      '如果你使用 Angular Forms，`AbstractFormControl.parent` 的类型现在包括 null。`ng update` 将自动迁移你，但在一个不太可能的情况下，如果你的代码使用严格相等将父级与 undefined 进行比较，你需要改为使用 `=== null`，因为父级现在明确初始化为 `null`，而不是保留为 undefined。',
   },
   {
     possibleIn: 1100,
@@ -1064,15 +1052,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'platform-webworker',
     action:
-      'The rarely used `@angular/platform-webworker` and `@angular/platform-webworker-dynamic` were deprecated in v8 and have been removed. Running parts of Angular in a web worker was an experiment that never worked well for common use cases. Angular still has great support for [Web Workers](https://angular.io/guide/web-worker). ',
+      '很少使用的 `@angular/platform-webworker` 和 `@angular/platform-webworker-dynamic` 在 v8 中已被弃用并移除。在 web worker 中运行 Angular 的部分是一个从未对常见用例产生良好效果的实验。Angular 对 [Web Workers](https://angular.io/guide/web-worker) 仍然有很好的支持。',
   },
   {
     possibleIn: 1100,
     necessaryAsOf: 1100,
     level: ApplicationComplexity.Advanced,
     step: 'v11 slice pipe typing',
-    action:
-      'The `slice` pipe now returns null for the undefined input value, which is consistent with the behavior of most pipes.',
+    action: '现在 `slice` 管道对于未定义的输入值返回 null，这与大多数管道的行为一致。',
   },
   {
     possibleIn: 1100,
@@ -1080,22 +1067,21 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v11 keyvalue typing',
     action:
-      'The `keyvalue` pipe has been fixed to report that for input objects that have number keys, the result type will contain the string representation of the keys. This was already the case and the code has simply been updated to reflect this. Please update the consumers of the pipe output if they were relying on the incorrect types. Note that this does not affect use cases where the input values are `Map`s, so if you need to preserve `number`s, this is an effective way.',
+      '修复了 `keyvalue` 管道，对于具有数字键的输入对象，结果类型将包含键的字符串表示形式。这已经是现实，代码已经更新以反映这一点。如果管道输出的使用方依赖于不正确的类型，请更新。请注意，这不会影响输入值为 `Map` 的用例，因此如果你需要保留 `number`，这是一种有效的方法。',
   },
   {
     possibleIn: 1100,
     necessaryAsOf: 1100,
     level: ApplicationComplexity.Advanced,
     step: 'v11 number pipe typing',
-    action:
-      'The number pipes (`decimal`, `percent`, `currency`, etc) now explicitly state which types are accepted.',
+    action: '数字管道（`decimal`、`percent`、`currency` 等）现在明确指定接受的类型。',
   },
   {
     possibleIn: 1100,
     necessaryAsOf: 1100,
     level: ApplicationComplexity.Advanced,
     step: 'v11 date pipe typing',
-    action: 'The `date` pipe now explicitly states which types are accepted.',
+    action: '日期管道现在明确指定接受的类型。',
   },
   {
     possibleIn: 1100,
@@ -1103,7 +1089,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v11 datetime rounding',
     action:
-      'When passing a date-time formatted string to the `DatePipe` in a format that contains fractions of a millisecond, the milliseconds will now always be rounded down rather than to the nearest millisecond. Most applications will not be affected by this change. If this is not the desired behaviour then consider pre-processing the string to round the millisecond part before passing it to the `DatePipe`.',
+      '当将带有毫秒分数的日期时间格式的字符串传递给 `DatePipe` 时，毫秒现在总是向下舍入，而不是舍入到最近的毫秒。大多数应用程序不会受到此更改的影响。如果这不是预期的行为，考虑在将字符串传递给 `DatePipe` 之前预处理毫秒部分以舍入。',
   },
   {
     possibleIn: 1100,
@@ -1111,7 +1097,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v11 async pipe typing',
     action:
-      'The `async` pipe no longer claims to return undefined for an input that was typed as undefined. Note that the code actually returned null on undefined inputs.',
+      '`async` 管道不再声称对于类型为 undefined 的输入返回 undefined。请注意，代码实际上对于未定义的输入返回 null。',
   },
   {
     possibleIn: 1100,
@@ -1119,7 +1105,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v11 case pipe update',
     action:
-      'The `uppercase` and `lowercase` pipes no longer let falsy values through. They now map both `null` and `undefined` to `null` and raise an exception on invalid input (`0`, `false`, `NaN`). This matches other Angular pipes.',
+      '`uppercase` 和 `lowercase` 管道不再通过假值。它们现在将 `null` 和 `undefined` 都映射到 `null`，并在无效输入（`0`、`false`、`NaN`）时引发异常。这与其他 Angular 管道的行为相匹配。',
   },
   {
     possibleIn: 1100,
@@ -1127,7 +1113,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v11 router NavigationExtras typing',
     action:
-      'If you use the router with `NavigationExtras`, new typings allow a variable of type `NavigationExtras` to be passed in, but they will not allow object literals, as they may only specify known properties. They will also not accept types that do not have properties in common with the ones in the `Pick`. If you are affected by this change, only specify properties from the NavigationExtras which are actually used in the respective function calls or use a type assertion on the object or variable: `as NavigationExtras`.',
+      '如果你使用带有 `NavigationExtras` 的路由器，新的类型允许传递类型为 `NavigationExtras` 的变量，但不允许对象字面量，因为它们只能指定已知属性。它们也不接受与 `Pick` 中的属性没有共同属性的类型。如果你受到此更改的影响，请仅指定在相应函数调用中实际使用的 NavigationExtras 中的属性，或在对象或变量上使用类型断言：`as NavigationExtras`。',
   },
   {
     possibleIn: 1100,
@@ -1135,7 +1121,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v11 TestBed.overrideProvider',
     action:
-      'In your tests if you call `TestBed.overrideProvider` after TestBed initialization, provider overrides are no longer applied. This behavior is consistent with other override methods (such as `TestBed.overrideDirective`, etc) but they throw an error to indicate that. The check was previously missing in the TestBed.overrideProvider function. If you see this error, you should move `TestBed.overrideProvider` calls before TestBed initialization is completed.',
+      '如果在 TestBed 初始化之后调用 `TestBed.overrideProvider`，则不再应用提供者覆盖。这种行为与其他覆盖方法（如 `TestBed.overrideDirective` 等）一致，但会引发错误以指示。之前在 TestBed.overrideProvider 函数中缺少此检查。如果看到此错误，请确保在 TestBed 初始化完成之前移动 `TestBed.overrideProvider` 调用。',
   },
   {
     possibleIn: 1100,
@@ -1143,7 +1129,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v11 router RouteReuseStrategy',
     action:
-      "If you use the Router's RouteReuseStrategy, the argument order has changed. When calling `RouteReuseStrategy#shouldReuseRoute` previously when evaluating child routes, they would be called with the `future` and `current` arguments swapped. If your `RouteReuseStrategy` relies specifically on only the future or current snapshot state, you may need to update the `shouldReuseRoute` implementation's use of `future` and `current` `ActivateRouteSnapshots`.",
+      '如果你使用路由器的 RouteReuseStrategy，参数顺序已更改。在调用 `RouteReuseStrategy#shouldReuseRoute` 时，以前在评估子路由时，会调用 `future` 和 `current` 参数的顺序已更改。如果你的 `RouteReuseStrategy` 专门依赖于将来或当前快照状态，可能需要更新 `shouldReuseRoute` 实现对 `future` 和 `current` `ActivateRouteSnapshots` 的使用。',
   },
   {
     possibleIn: 1100,
@@ -1151,15 +1137,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v11 locale data readonly',
     action:
-      'If you use locale data arrays, this API will now return readonly arrays. If you were mutating them (e.g. calling `sort()`, `push()`, `splice()`, etc) then your code will not longer compile. If you need to mutate the array, you should now take a copy (e.g. by calling `slice()`) and mutate the copy.',
+      '如果你使用区域设置数据数组，此 API 现在将返回只读数组。如果你对其进行了更改（例如调用 `sort()`、`push()`、`splice()` 等），那么你的代码将不再编译。如果你需要更改数组，则现在应该复制它（例如通过调用 `slice()`）并更改副本。',
   },
   {
     possibleIn: 1100,
     necessaryAsOf: 1100,
     level: ApplicationComplexity.Advanced,
     step: 'v11 CollectionChangeRecord',
-    action:
-      'In change detection, `CollectionChangeRecord` has been removed, use `IterableChangeRecord` instead.',
+    action: '在变更检测中，已移除了 `CollectionChangeRecord`，请改用 `IterableChangeRecord`。',
   },
   {
     possibleIn: 1100,
@@ -1167,16 +1152,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v11 forms async validators',
     action:
-      'If you use Angular Forms with async validators defined at initialization time on class instances of `FormControl`, `FormGroup` or `FormArray` , the status change event was not previously emitted once async validator completed. This has been changed so that the status event is emitted into the `statusChanges` observable. If your code relies on the old behavior, you can filter/ignore this additional status change event.',
+      '如果你在 `FormControl`、`FormGroup` 或 `FormArray` 的类实例的初始化时间上使用异步验证器来定义，则在异步验证器完成后先前未发出状态更改事件。已更改为将状态事件发出到 `statusChanges` 可观察对象中。如果你的代码依赖于旧行为，你可以过滤/忽略此额外的状态更改事件。',
   },
-
   {
     possibleIn: 1200,
     necessaryAsOf: 1200,
     level: ApplicationComplexity.Basic,
     step: 'v12 ng update',
-    action:
-      'Run `ng update @angular/core@12 @angular/cli@12` which should bring you to version 12 of Angular.',
+    action: '运行 `ng update @angular/core@12 @angular/cli@12`，这将把你的 Angular 版本升级到 12。',
   },
   {
     possibleIn: 1200,
@@ -1184,7 +1167,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     material: true,
     step: 'update @angular/material',
-    action: 'Run `ng update @angular/material@12`.',
+    action: '运行 `ng update @angular/material@12`。',
   },
   {
     possibleIn: 1200,
@@ -1192,7 +1175,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v12 versions',
     action:
-      'Angular now requires [TypeScript 4.2](https://devblogs.microsoft.com/typescript/announcing-typescript-4-2/). `ng update` will update you automatically.',
+      'Angular 现在要求 [TypeScript 4.2](https://devblogs.microsoft.com/typescript/announcing-typescript-4-2/)。`ng update` 将自动更新你的 TypeScript。',
   },
   {
     possibleIn: 1200,
@@ -1200,21 +1183,21 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v12 browser support',
     action:
-      'IE11 support has been deprecated. Find details in the [RFC for IE11 removal](https://github.com/angular/angular/issues/41840).',
+      'IE11 支持已弃用。在 [IE11 删除 RFC](https://github.com/angular/angular/issues/41840) 中找到详细信息。',
   },
   {
     possibleIn: 1200,
     necessaryAsOf: 1200,
     level: ApplicationComplexity.Basic,
     step: 'v12 minimum  Node.js version',
-    action: 'You can no longer use Angular with Node.js version 10 or older',
+    action: '你不能再使用 Node.js 版本 10 或更早的版本。',
   },
   {
     possibleIn: 1200,
     necessaryAsOf: 1200,
     level: ApplicationComplexity.Medium,
     step: 'v12 `XhrFactory` relocation',
-    action: 'Change the import of `XhrFactory` from `@angular/common/http` to `@angular/common`.',
+    action: '将 `XhrFactory` 的导入从 `@angular/common/http` 改为 `@angular/common`。',
   },
   {
     possibleIn: 1200,
@@ -1222,7 +1205,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v12 i18n message ids',
     action:
-      'If you rely on legacy i18n message IDs use the `localize-migrate` tool to [move away from them](https://angular.io/guide/migration-legacy-message-id).',
+      '如果你依赖于旧版 i18n 消息 ID，请使用 `localize-migrate` 工具[迁移至新版](https://angular.io/guide/migration-legacy-message-id)。',
   },
   {
     possibleIn: 1200,
@@ -1230,7 +1213,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v12 deprecates `emitDistinctChangesOnly`',
     action:
-      'If you are using `emitDistinctChangesOnly` to configure `@ContentChildren` and `@ViewChildren` queries, you may need to update its value to `false` to align with its previous behavior. In v12 `emitDistinctChangesOnly` has default value `true`, and in future releases we will remove this configuration option to prevent triggering of unnecessary changes.',
+      '如果你正在使用 `emitDistinctChangesOnly` 来配置 `@ContentChildren` 和 `@ViewChildren` 查询，可能需要将其值更新为 `false` 以与其先前行为对齐。在 v12 中，`emitDistinctChangesOnly` 的默认值为 `true`，在将来的版本中，我们将删除此配置选项，以防止触发不必要的更改。',
   },
   {
     possibleIn: 1200,
@@ -1238,7 +1221,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v12 prod by default',
     action:
-      'You can run the optional migration for enabling production builds by default `ng update @angular/cli@12 --migrate-only production-by-default`.',
+      '你可以运行可选的迁移以将默认启用生产构建 `ng update @angular/cli@12 --migrate-only production-by-default`。',
   },
   {
     possibleIn: 1200,
@@ -1246,7 +1229,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v12 min and max form attributes',
     action:
-      'If you  use Angular forms, `min` and `max` attributes on `<input type="number">` will now trigger validation logic.',
+      '如果你使用 Angular 表单，在 `<input type="number">` 上使用 `min` 和 `max` 属性现在将触发验证逻辑。',
   },
   {
     possibleIn: 1200,
@@ -1254,23 +1237,21 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v12 `emitEvent` in `FormArray` and `FormGroup`',
     action:
-      'If your app has custom classes that extend `FormArray` or `FormGroup` classes and override the above-mentioned methods, you may need to update your implementation',
+      '如果你的应用程序具有自定义类，它们扩展了 `FormArray` 或 `FormGroup` 类，并覆盖了上述方法，则可能需要更新你的实现。',
   },
   {
     possibleIn: 1200,
     necessaryAsOf: 1200,
     level: ApplicationComplexity.Advanced,
     step: 'v12 zone.js minimum version',
-    action:
-      'Update zone.js to version 0.11.4. `ng update` will update this dependency automatically.',
+    action: '将 zone.js 更新到版本 0.11.4。`ng update` 将自动更新此依赖项。',
   },
   {
     possibleIn: 1200,
     necessaryAsOf: 1200,
     level: ApplicationComplexity.Advanced,
     step: 'v12 `HttpParams` method params update',
-    action:
-      'If you extend the `HttpParams` class you may have to update the signature of its method to reflect changes in the parameter types.',
+    action: '如果你扩展了 `HttpParams` 类，你可能需要更新其方法的签名以反映参数类型的更改。',
   },
   {
     possibleIn: 1200,
@@ -1278,7 +1259,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v12 `routerLinkActiveOptions`',
     action:
-      '`routerLinkActiveOptions` property of `RouterLinkActive` now has a more specific type. You may need to update code accessing this property to align with the changes.',
+      '`RouterLinkActive` 的 `routerLinkActiveOptions` 属性现在具有更具体的类型。你可能需要更新访问此属性的代码以与更改保持一致。',
   },
   {
     possibleIn: 1200,
@@ -1286,23 +1267,21 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v12 `APP_INITIALIZER` callback types',
     action:
-      'The initializer callbacks now have more specific return types, which may require update of your code if you are getting an `APP_INITIALIZER` instance via `Injector.get` or `TestBed.inject`.',
+      '初始化回调现在具有更具体的返回类型，如果你通过 `Injector.get` 或 `TestBed.inject` 获取 `APP_INITIALIZER` 实例，则可能需要更新你的代码。',
   },
   {
     possibleIn: 1200,
     necessaryAsOf: 1200,
     level: ApplicationComplexity.Advanced,
     step: 'v12 fragment typings',
-    action:
-      'The router fragments now could be `null`. Add `null` checks to avoid TypeScript failing with type errors.',
+    action: '路由器片段现在可能是 `null`。添加 `null` 检查以避免 TypeScript 产生类型错误。',
   },
   {
     possibleIn: 1200,
     necessaryAsOf: 1200,
     level: ApplicationComplexity.Advanced,
     step: 'v12 `ng.getDirectives`',
-    action:
-      "Make sure you don't rely on `ng.getDirectives` throwing an error if it can't find a directive associated with a particular DOM node.",
+    action: '确保不依赖于 `ng.getDirectives` 如果找不到与特定 DOM 节点相关联的指令，则引发错误。',
   },
   {
     possibleIn: 1200,
@@ -1310,7 +1289,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v12 `optimization.styles.inlineCritical`',
     action:
-      'Check out `optimization.styles.inlineCritical` option in your angular.json file. It now defaults to `true`. Remember that the whole `optimization` option can be set as boolean which will set all the suboptions to defaults.',
+      '检查你的 angular.json 文件中的 `optimization.styles.inlineCritical` 选项。现在默认为 `true`。请记住，整个 `optimization` 选项可以设置为布尔值，这将将所有子选项设置为默认值。',
   },
 
   {
@@ -1318,8 +1297,7 @@ export const RECOMMENDATIONS: Step[] = [
     necessaryAsOf: 1300,
     level: ApplicationComplexity.Basic,
     step: 'v13 ng update',
-    action:
-      'Run `ng update @angular/core@13 @angular/cli@13` which should bring you to version 13 of Angular.',
+    action: '运行 `ng update @angular/core@13 @angular/cli@13` 将你的 Angular 版本更新至 13。',
   },
   {
     possibleIn: 1300,
@@ -1327,7 +1305,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     material: true,
     step: 'update @angular/material',
-    action: 'Run `ng update @angular/material@13`.',
+    action: '运行 `ng update @angular/material@13`。',
   },
   {
     possibleIn: 1300,
@@ -1335,7 +1313,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'TypeScript 4.4',
     action:
-      'Angular now uses TypeScript 4.4, read more about any potential breaking changes: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-4.html',
+      'Angular 现在使用 TypeScript 4.4，请阅读有关任何潜在变更的更多信息：[TypeScript 4.4 发布说明](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-4.html)',
   },
   {
     possibleIn: 1300,
@@ -1343,7 +1321,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v13 node',
     action:
-      'Make sure you are using <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 12.20.0 or later</a>',
+      '确保你使用的是 <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 12.20.0 或更高版本</a>。',
   },
   {
     possibleIn: 1300,
@@ -1351,7 +1329,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v13 routerLink',
     action:
-      'You can now disable the navigation of a `routerLink` by passing `undefined` and `null`. Previously the `routerLink` directive used to accept these two values as equivalent to an empty string.',
+      '现在可以通过传递 `undefined` 和 `null` 来禁用 `routerLink` 的导航。之前，`routerLink` 指令接受这两个值等同于空字符串。',
   },
   {
     possibleIn: 1300,
@@ -1359,7 +1337,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v13 router loadChildren',
     action:
-      'You can no longer specify lazy-loaded routes by setting a string value to `loadChildren`. Make sure you move to dynamic ESM import statements.',
+      '不能再通过将字符串值设置为 `loadChildren` 来指定惰性加载的路由。确保切换到动态 ESM 导入语句。',
   },
   {
     possibleIn: 1300,
@@ -1367,7 +1345,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v13 service worker activated',
     action:
-      'The `activated` observable of `SwUpdate` is now deprecated. To check the activation status of a service worker use the `activatedUpdate` method instead.',
+      '`SwUpdate` 的 `activated` 可观察对象现已弃用。要检查服务工作器的激活状态，请改用 `activatedUpdate` 方法。',
   },
   {
     possibleIn: 1300,
@@ -1375,7 +1353,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v13 service worker available',
     action:
-      'The `available` observable of `SwUpdate` is now deprecated. To get the same information use `versionUpdates` and filter only the `VersionReadyEvent` events.',
+      '`SwUpdate` 的 `available` 可观察对象现已弃用。要获取相同的信息，请使用 `versionUpdates` 并仅过滤 `VersionReadyEvent` 事件。',
   },
   {
     possibleIn: 1300,
@@ -1383,7 +1361,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v13 renderModuleFactory',
     action:
-      'The `renderModuleFactory` from `@angular/platform-server` is no longer necessary with Ivy. Use `renderModule` instead.',
+      '`@angular/platform-server` 中的 `renderModuleFactory` 不再与 Ivy 一起使用。改用 `renderModule`。',
   },
   {
     possibleIn: 1300,
@@ -1391,7 +1369,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v13 forms status',
     action:
-      'We narrowed the type of `AbstractControl.status` to `FormControlStatus` and `AbstractControl.status` to `Observable<FormControlStatus>`. `FormControlStatus` is the union of all possible status strings for form controls.',
+      '我们将 `AbstractControl.status` 的类型缩小为 `FormControlStatus`，并将 `AbstractControl.status` 的类型缩小为 `Observable<FormControlStatus>`。 `FormControlStatus` 是表单控件的所有可能状态字符串的联合。',
   },
   {
     possibleIn: 1300,
@@ -1399,7 +1377,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v13 router serializer',
     action:
-      'To align with the URI spec, now the URL serializer respects question marks in the query parameters. For example `/path?q=hello?&q2=2` will now be parsed to `{ q: `hello?`, q2: 2 }`',
+      '现在，URL 序列化程序遵守 URI 规范，会考虑查询参数中的问号。例如，`/path?q=hello?&q2=2` 现在将解析为 `{ q: `hello?`, q2: 2 }`。',
   },
   {
     possibleIn: 1300,
@@ -1407,7 +1385,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v13 host binding',
     action:
-      "`href` is now an attribute binding. This means that `DebugElement.properties['href']` now returns the `href` value returned by the native element, rather than the internal value of the `href` property of the `routerLink`.",
+      "`href` 现在是属性绑定。这意味着 `DebugElement.properties['href']` 现在返回原生元素返回的 `href` 值，而不是 `routerLink` 的 `href` 属性的内部值。",
   },
   {
     possibleIn: 1300,
@@ -1415,7 +1393,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v13 spy location',
     action:
-      '`SpyLocation` no longer emits the `popstate` event when `location.go` is called. In addition, `simulateHashChange` now triggers both `haschange` and `popstate`. Tests that rely on `location.go` most likely need to now use `simulateHashChange` to capture `popstate`.',
+      '`SpyLocation` 在调用 `location.go` 时不再触发 `popstate` 事件。此外，`simulateHashChange` 现在触发 `haschange` 和 `popstate`。依赖于 `location.go` 的测试现在可能需要使用 `simulateHashChange` 来捕获 `popstate`。',
   },
   {
     possibleIn: 1300,
@@ -1424,7 +1402,7 @@ export const RECOMMENDATIONS: Step[] = [
     ngUpgrade: true,
     step: 'v13 router URL replacement',
     action:
-      'The router will no longer replace the browser URL when a new navigation cancels an ongoing navigation. Hybrid applications which rely on the `navigationId` being present on initial navigations that were handled by the Angular router should subscribe to `NavigationCancel` events and perform the `location.replaceState` to add `navigationId` to the `Router` state. In addition, tests which assert `urlChanges` on the `SpyLocation` may need to be adjusted to account for the `replaceState` which is no longer triggered.',
+      '当新导航取消正在进行的导航时，路由器将不再替换浏览器 URL。依赖于 Angular 路由器处理的初始导航上存在 `navigationId` 的混合应用程序应该订阅 `NavigationCancel` 事件，并执行 `location.replaceState` 以将 `navigationId` 添加到 `Router` 状态中。此外，断言 `SpyLocation` 上的 `urlChanges` 的测试可能需要调整以考虑不再触发的 `replaceState`。',
   },
   {
     possibleIn: 1300,
@@ -1432,16 +1410,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v13 removed symbols',
     action:
-      'The route package no longer exports `SpyNgModuleFactoryLoader` and `DeprecatedLoadChildren`. In case you use them, make sure you remove their corresponding import statements.',
+      '路由器包不再导出 `SpyNgModuleFactoryLoader` 和 `DeprecatedLoadChildren`。如果使用了它们，请确保删除其对应的导入语句。',
   },
-
   {
     possibleIn: 1400,
     necessaryAsOf: 1400,
     level: ApplicationComplexity.Basic,
     step: 'v14 ng update',
-    action:
-      'Run `ng update @angular/core@14 @angular/cli@14` which should bring you to version 14 of Angular.',
+    action: '运行 `ng update @angular/core@14 @angular/cli@14` 将你的 Angular 版本更新至 14。',
   },
   {
     possibleIn: 1400,
@@ -1449,7 +1425,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     material: true,
     step: 'update @angular/material',
-    action: 'Run `ng update @angular/material@14`.',
+    action: '运行 `ng update @angular/material@14`。',
   },
   {
     possibleIn: 1400,
@@ -1457,16 +1433,15 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'TypeScript 4.6',
     action:
-      'Angular now uses TypeScript 4.6, read more about any potential breaking changes: https://devblogs.microsoft.com/typescript/announcing-typescript-4-6/',
+      'Angular 现在使用 TypeScript 4.6，请阅读有关任何潜在变更的更多信息：[TypeScript 4.6 发布公告](https://devblogs.microsoft.com/typescript/announcing-typescript-4-6/)',
   },
-
   {
     possibleIn: 1400,
     necessaryAsOf: 1400,
     level: ApplicationComplexity.Basic,
     step: 'v14 node',
     action:
-      'Make sure you are using <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 14.15.0 or later</a>',
+      '确保你使用的是 <a href="http://www.hostingadvice.com/how-to/update-node-js-latest-version/" target="_blank">Node 14.15.0 或更高版本</a>。',
   },
   {
     possibleIn: 1400,
@@ -1474,14 +1449,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v14 strict forms',
     action:
-      'Form models now require a generic type parameter. For gradual migration you can opt-out using the untyped version of the form model classes.',
+      '表单模型现在需要一个泛型类型参数。你可以选择使用表单模型类的不带类型的版本进行渐进式迁移。',
   },
   {
     possibleIn: 1400,
     necessaryAsOf: 1400,
     level: ApplicationComplexity.Medium,
     step: 'v14 aotSummaries',
-    action: 'Remove `aotSummaries` from `TestBed` since Angular no longer needs them in Ivy.',
+    action: '从 `TestBed` 中删除 `aotSummaries`，因为 Angular 不再在 Ivy 中需要它们。',
   },
   {
     possibleIn: 1400,
@@ -1490,7 +1465,7 @@ export const RECOMMENDATIONS: Step[] = [
     material: true,
     step: 'v14 MatVertical and Horizontal Stepper',
     action:
-      'If you are using `MatVerticalStepper` or `MatHorizontalStepper` make sure you switch to `MatStepper`.',
+      '如果你正在使用 `MatVerticalStepper` 或 `MatHorizontalStepper`，请确保切换到 `MatStepper`。',
   },
   {
     possibleIn: 1400,
@@ -1498,7 +1473,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v14 JSONP',
     action:
-      'Remove headers from JSONP requests. JSONP does not supports headers and if specified the HTTP module will now throw an error rather than ignoring them.',
+      '从 JSONP 请求中删除头部。JSONP 不支持头部，如果指定了头部，HTTP 模块现在将抛出错误而不是忽略它们。',
   },
   {
     possibleIn: 1400,
@@ -1506,7 +1481,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v14 resolvers',
     action:
-      'Resolvers now will take the first emitted value by an observable and after that proceed to navigation to better align with other guards rather than taking the last emitted value.',
+      '解析器现在将接收到的 observable 的第一个发射值，并在此之后进行导航，以更好地与其他守卫保持一致，而不是取最后发射的值。',
   },
   {
     possibleIn: 1400,
@@ -1514,7 +1489,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     material: true,
     step: 'v14 deprecate protractor entry',
-    action: 'The deprecated `angular/cdk/testing/protractor` entry point is now removed.',
+    action: '已移除废弃的 `angular/cdk/testing/protractor` 入口点。',
   },
   {
     possibleIn: 1400,
@@ -1522,7 +1497,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     material: true,
     step: 'v14 chipInput',
-    action: 'Make sure you specify `chipInput` of `MatChipInputEvent` because it is now required.',
+    action: '确保指定 `MatChipInputEvent` 的 `chipInput`，因为现在它是必需的。',
   },
   {
     possibleIn: 1400,
@@ -1531,7 +1506,7 @@ export const RECOMMENDATIONS: Step[] = [
     material: true,
     step: 'v14 mixinErrorState',
     action:
-      'You need to implement `stateChanges` class member in abstractions using `mixinErrorState` because the mixin no longer provides it.',
+      '在使用 `mixinErrorState` 的抽象类中，你需要实现 `stateChanges` 类成员，因为 mixin 不再提供它。',
   },
   {
     possibleIn: 1400,
@@ -1539,7 +1514,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     material: true,
     step: 'v14 CdkStepper orientation',
-    action: 'Use `CdkStepper.orientation` instead of `CdkStepper._orientation`.',
+    action: '使用 `CdkStepper.orientation`，而不是 `CdkStepper._orientation`。',
   },
   {
     possibleIn: 1400,
@@ -1548,7 +1523,7 @@ export const RECOMMENDATIONS: Step[] = [
     material: true,
     step: 'v14 CdkStepper and MatStepper',
     action:
-      'If you are extending or using `CdkStepper` or `MatStepper` in the constructor you should no longer pass the `_document` parameter since it is now removed.',
+      '如果你在构造函数中扩展或使用 `CdkStepper` 或 `MatStepper`，则不再需要传递 `_document` 参数，因为它现在已被移除。',
   },
   {
     possibleIn: 1400,
@@ -1556,7 +1531,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     material: true,
     step: 'v14 mat-list-item-avatar',
-    action: 'Rename the `mat-list-item-avatar` CSS class to `mat-list-item-with-avatar`.',
+    action: '将 `mat-list-item-avatar` CSS 类重命名为 `mat-list-item-with-avatar`。',
   },
   {
     possibleIn: 1400,
@@ -1564,7 +1539,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     material: true,
     step: 'v14 MatSelectionListChange.option',
-    action: 'Use `MatSelectionListChange.options` rather than `MatSelectionListChange.option`.',
+    action: '使用 `MatSelectionListChange.options`，而不是 `MatSelectionListChange.option`。',
   },
   {
     possibleIn: 1400,
@@ -1573,7 +1548,7 @@ export const RECOMMENDATIONS: Step[] = [
     material: true,
     step: 'v14 getHarnessLoaderForContent',
     action:
-      'Use `getChildLoader(MatListItemSection.CONTENT)` rather than `getHarnessLoaderForContent`.',
+      '使用 `getChildLoader(MatListItemSection.CONTENT)`，而不是 `getHarnessLoaderForContent`。',
   },
   {
     possibleIn: 1400,
@@ -1582,14 +1557,14 @@ export const RECOMMENDATIONS: Step[] = [
     material: true,
     step: 'v14 MatSelectionList',
     action:
-      'If you are using `MatSelectionList` make sure you pass `_focusMonitor` in its constructor because it is now required. Additionally, this class no longer has `tabIndex` property and a `tabIndex` constructor parameter.',
+      '如果你正在使用 `MatSelectionList`，请确保在其构造函数中传递 `_focusMonitor`，因为现在它是必需的。此外，这个类不再具有 `tabIndex` 属性和 `tabIndex` 构造函数参数。',
   },
   {
     possibleIn: 1400,
     necessaryAsOf: 1400,
     level: ApplicationComplexity.Advanced,
     step: 'v14 initialNavigation',
-    action: "Update `initialNavigation: 'enabled'` to `initialNavigation: 'enabledBlocking'`.",
+    action: "将 `initialNavigation: 'enabled'` 更新为 `initialNavigation: 'enabledBlocking'`。",
   },
   {
     possibleIn: 1400,
@@ -1597,7 +1572,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v14 Route.pathMatch',
     action:
-      'If you are defining routes with `pathMatch`, you may have to cast it to `Route` or `Routes` explicitly. `Route.pathMatch` is no longer compatible with `string` type.',
+      '如果你正在定义带有 `pathMatch` 的路由，可能需要将其显式转换为 `Route` 或 `Routes`。`Route.pathMatch` 不再兼容 `string` 类型。',
   },
   {
     possibleIn: 1400,
@@ -1605,46 +1580,42 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v14 stricter LoadChildrenCallback',
     action:
-      'The promise returned by `LoadChildrenCallback` now has a stricter type parameter `Type<any>|NgModuleFactory<any>` rather than `any`.',
+      '`LoadChildrenCallback` 返回的 Promise 现在具有更严格的类型参数 `Type<any>|NgModuleFactory<any>`，而不是 `any`。',
   },
   {
     possibleIn: 1400,
     necessaryAsOf: 1400,
     level: ApplicationComplexity.Advanced,
     step: 'v14 router scheduling',
-    action:
-      'The router does no longer schedule redirect navigation within a `setTimeout`. Make sure your tests do not rely on this behavior.',
+    action: '路由器不再在 `setTimeout` 内安排重定向导航。确保你的测试不依赖于这种行为。',
   },
   {
     possibleIn: 1400,
     necessaryAsOf: 1400,
     level: ApplicationComplexity.Advanced,
     step: 'v14 LocationStrategy',
-    action:
-      'Implementing the `LocationStrategy` interface now requires definition of `getState()`.',
+    action: '现在实现 `LocationStrategy` 接口需要定义 `getState()`。',
   },
   {
     possibleIn: 1400,
     necessaryAsOf: 1400,
     level: ApplicationComplexity.Advanced,
     step: 'v14 http queries',
-    action:
-      'Sending `+` as part of a query no longer requires workarounds since `+` no longer sends a space.',
+    action: '发送查询时不再需要对 `+` 进行处理，因为 `+` 不再发送空格。',
   },
   {
     possibleIn: 1400,
     necessaryAsOf: 1400,
     level: ApplicationComplexity.Advanced,
     step: 'v14 AnimationDriver.getParentElement',
-    action: 'Implementing `AnimationDriver` now requires the `getParentElement` method.',
+    action: '现在实现 `AnimationDriver` 需要 `getParentElement` 方法。',
   },
   {
     possibleIn: 1400,
     necessaryAsOf: 1400,
     level: ApplicationComplexity.Advanced,
     step: 'v14 invalid config',
-    action:
-      'Invalid route configurations of lazy-loaded modules will now throw an error rather than being ignored.',
+    action: '懒加载模块的无效路由配置现在会引发错误，而不是被忽略。',
   },
   {
     possibleIn: 1400,
@@ -1652,64 +1623,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v14 router resolver',
     action:
-      'Remove the `resolver` from `RouterOutletContract.activateWith` function and the `resolver` from `OutletContext` class since factory resolvers are no longer needed.',
+      '从 `RouterOutletContract.activateWith` 函数中移除 `resolver`，以及从 `OutletContext` 类中移除 `resolver`，因为不再需要工厂解析器。',
   },
   {
     possibleIn: 1400,
     necessaryAsOf: 1400,
     level: ApplicationComplexity.Advanced,
     step: 'v14 initialUrl',
-    action:
-      '`Router.initialUrl` accepts only `UrlTree` to prevent a misuse of the API by assigning a `string` value.',
-  },
-
-  {
-    possibleIn: 1500,
-    necessaryAsOf: 1500,
-    level: ApplicationComplexity.Basic,
-    step: 'v15 node support',
-    action:
-      'Make sure that you are using a supported version of node.js before you upgrade your application. Angular v15 supports node.js versions: 14.20.x, 16.13.x and 18.10.x. <a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-01" alt="Link to more information about this change">Read further</a>',
-  },
-  {
-    possibleIn: 1500,
-    necessaryAsOf: 1500,
-    level: ApplicationComplexity.Basic,
-    step: 'v15 ts support',
-    action:
-      'Make sure that you are using a supported version of TypeScript before you upgrade your application. Angular v15 supports TypeScript version 4.8 or later.  <a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-02" alt="Link to more information about this change">Read further</a>',
-  },
-  {
-    possibleIn: 1500,
-    necessaryAsOf: 1500,
-    level: ApplicationComplexity.Basic,
-    step: 'v15 ng update',
-    action:
-      "In the application's project directory, run `ng update @angular/core@15 @angular/cli@15` to update your application to Angular v15.",
-  },
-  {
-    possibleIn: 1500,
-    necessaryAsOf: 1500,
-    level: ApplicationComplexity.Basic,
-    material: true,
-    step: 'V15 update @angular/material',
-    action: 'Run `ng update @angular/material@15` to update the Material components.',
-  },
-  {
-    possibleIn: 1500,
-    necessaryAsOf: 1500,
-    level: ApplicationComplexity.Medium,
-    step: 'v15 keyframe',
-    action:
-      'In v15, the Angular compiler prefixes `@keyframes` in CSS with the component\'s scope. This means that any TypeScript code that relies on `keyframes` names no longer works in v15. Update any such instances to: define keyframes programmatically, use global stylesheets, or change the component\'s view encapsulation. <a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-03" alt="Link to more information about this change">Read further</a>',
-  },
-  {
-    possibleIn: 1500,
-    necessaryAsOf: 1500,
-    level: ApplicationComplexity.Basic,
-    step: 'v15 no-ivy',
-    action:
-      "In your application's `tsconfig.json` file, remove `enableIvy`. In v15, Ivy is the only rendering engine so `enableIvy` is not required.",
+    action: '`Router.initialUrl` 只接受 `UrlTree`，以防止通过分配 `string` 值来误用 API。',
   },
   {
     possibleIn: 1500,
@@ -1717,7 +1638,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v15 base-decorators',
     action:
-      'Make sure to use decorators in base classes with child classes that inherit constructors and use dependency injection. Such base classes should be decorated with either `@Injectable` or `@Directive` or the compiler returns an error. <a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-05" alt="Link to more information about this change">Read further</a>',
+      '确保在具有继承构造函数和使用依赖注入的子类中使用基类中的装饰器。这样的基类应该用 `@Injectable` 或 `@Directive` 装饰，否则编译器会返回错误。<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-05" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1725,7 +1646,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v15 setDisabledState',
     action:
-      'In v15, `setDisabledState` is always called when a `ControlValueAccessor` is attached. To opt-out of this behavior, use `FormsModule.withConfig` or `ReactiveFormsModule.withConfig`. <a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-06" alt="Link to more information about this change">Read further</a>',
+      '在 v15 中，当附加 `ControlValueAccessor` 时，始终调用 `setDisabledState`。要退出此行为，使用 `FormsModule.withConfig` 或 `ReactiveFormsModule.withConfig`。<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-06" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1733,7 +1654,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v15 canParse',
     action:
-      'Applications that use `canParse` should use `analyze` from `@angular/localize/tools` instead. In v15, the `canParse` method was removed from all translation parsers in `@angular/localize/tools`.  <a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-07" alt="Link to more information about this change">Read further</a>',
+      '使用 `canParse` 的应用程序应该改为使用 `@angular/localize/tools` 中的 `analyze`。在 v15 中，从 `@angular/localize/tools` 的所有翻译解析器中删除了 `canParse` 方法。<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-07" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1741,7 +1662,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v15 ActivatedRoutSnapshot',
     action:
-      'Make sure that all `ActivatedRouteSnapshot` objects have a `title` property. In v15, the `title` property is a required property of `ActivatedRouteSnapshot`. <a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-08" alt="Link to more information about this change">Read further</a>',
+      '确保所有 `ActivatedRouteSnapshot` 对象都有 `title` 属性。在 v15 中，`title` 属性是 `ActivatedRouteSnapshot` 的必需属性。<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-08" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1749,7 +1670,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v15 RouterOutlet',
     action:
-      'If your tests with `RouterOutlet` break, make sure they don\'t depend on the instantiation order of the corresponding component relative to change detection. In v15, `RouterOutlet` instantiates the component after change detection. <a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-09" alt="Link to more information about this change">Read further</a>',
+      '如果你的 `RouterOutlet` 测试出现问题，请确保它们不依赖于与变更检测相关的相应组件的实例化顺序。在 v15 中，`RouterOutlet` 在变更检测之后实例化组件。<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-09" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1757,7 +1678,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v15 relativeLinkResolution',
     action:
-      'In v15, `relativeLinkResolution` is not configurable in the Router. It was used to opt out of an earlier bug fix that is now standard.  <a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-10" alt="Link to more information about this change">Read further</a>',
+      '在 v15 中，`relativeLinkResolution` 在路由器中不可配置。它用于退出先前的错误修复，现在已成为标准。<a href="https://v15.angular.io/guide/update-to-version-15#v15-bc-10" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1765,7 +1686,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v15 DATE_PIPE_DEFAULT_OPTIONS',
     action:
-      'Change instances of the `DATE_PIPE_DEFAULT_TIMEZONE` token to use `DATE_PIPE_DEFAULT_OPTIONS` to configure time zones.  In v15, the `DATE_PIPE_DEFAULT_TIMEZONE` token is deprecated. <a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-01" alt="Link to more information about this change">Read further</a>',
+      '将 `DATE_PIPE_DEFAULT_TIMEZONE` 令牌的实例更改为使用 `DATE_PIPE_DEFAULT_OPTIONS` 配置时区。在 v15 中，`DATE_PIPE_DEFAULT_TIMEZONE` 令牌已过时。<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-01" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1773,7 +1694,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v15 iframe',
     action:
-      "Existing `<iframe>` instances might have security-sensitive attributes applied to them as an attribute or property binding. These security-sensitive attributes can occur in a template or in a directive's host bindings. Such occurrences require an update to ensure compliance with the new and stricter rules about `<iframe>` bindings. For more information, see [the error page](https://v15.angular.io/errors/NG0910).",
+      "现有的 `<iframe>` 实例可能已经应用了安全敏感属性，作为属性或属性绑定。这些安全敏感属性可能出现在模板中或指令的宿主绑定中。这些情况需要更新，以确保符合对 `<iframe>` 绑定的新和更严格的规则。<a href='https://v15.angular.io/errors/NG0910' title='错误页面的链接'>查看更多信息</a>",
   },
   {
     possibleIn: 1500,
@@ -1781,7 +1702,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v15 Injector.get',
     action:
-      'Update instances of `Injector.get()` that use an `InjectFlags` parameter to use an `InjectOptions` parameter. The `InjectFlags` parameter of `Injector.get()` is deprecated in v15. <a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-02" alt="Link to more information about this change">Read further</a>',
+      '更新使用 `InjectFlags` 参数的 `Injector.get()` 的实例，以使用 `InjectOptions` 参数。在 v15 中，`Injector.get()` 的 `InjectFlags` 参数已过时。<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-02" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1789,7 +1710,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v15 TestBed.inject',
     action:
-      'Update instances of `TestBed.inject()` that use an `InjectFlags` parameter to use an `InjectOptions` parameter. The `InjectFlags` parameter of `TestBed.inject()` is deprecated in v15. <a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-01" alt="Link to more information about this change">Read further</a>',
+      '更新使用 `InjectFlags` 参数的 `TestBed.inject()` 的实例，以使用 `InjectOptions` 参数。在 v15 中，`TestBed.inject()` 的 `InjectFlags` 参数已过时。<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-01" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1797,7 +1718,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v15 ngModule in providedIn',
     action:
-      'Using `providedIn: ngModule` for an `@Injectable` and `InjectionToken` is deprecated in v15. <a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-04" alt="Link to more information about this change">Read further</a>',
+      '在 v15 中，对 `@Injectable` 和 `InjectionToken` 使用 `providedIn: ngModule` 已过时。<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-04" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1805,7 +1726,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v15 providedIn any',
     action:
-      'Using `providedIn: \'any\'` for an `@Injectable` or `InjectionToken` is deprecated in v15. <a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-05" alt="Link to more information about this change">Read further</a>',
+      '在 v15 中，对 `@Injectable` 或 `InjectionToken` 使用 `providedIn: \'any\'` 已过时。<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-05" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1813,7 +1734,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v15 RouterLinkWithHref',
     action:
-      'Update instances of the `RouterLinkWithHref`directive to use the `RouterLink` directive. The `RouterLinkWithHref` directive is deprecated in v15. <a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-06" alt="Link to more information about this change">Read further</a>',
+      '更新 `RouterLinkWithHref` 指令的实例以使用 `RouterLink` 指令。`RouterLinkWithHref` 指令在 v15 中已过时。<a href="https://v15.angular.io/guide/update-to-version-15#v15-dp-06" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
@@ -1822,24 +1743,22 @@ export const RECOMMENDATIONS: Step[] = [
     material: true,
     step: 'v15 mat refactor',
     action:
-      'In Angular Material v15, many of the components have been refactored to be based on the official Material Design Components for Web (MDC). This change affected the DOM and CSS classes of many components. <a href="https://rc.material.angular.io/guide/mdc-migration" alt="Link to more information about this change">Read further</a>',
+      '在 Angular Material v15 中，许多组件已被重构为基于官方 Material Design Components for Web (MDC)。这个变化影响了许多组件的 DOM 和 CSS 类。<a href="https://rc.material.angular.io/guide/mdc-migration" title="有关此更改的更多信息">继续阅读</a>',
   },
   {
     possibleIn: 1500,
     necessaryAsOf: 1500,
     level: ApplicationComplexity.Basic,
     step: 'v15 visual review',
-    action:
-      'After you update your application to v15, visually review your application and its interactions to ensure everything is working as it should.',
+    action: '在将应用程序更新到 v15 后，通过视觉审查应用程序及其交互，确保一切正常运行。',
   },
-
   {
     possibleIn: 1600,
     necessaryAsOf: 1600,
     level: ApplicationComplexity.Basic,
     step: 'v16 node support',
     action:
-      'Make sure that you are using a supported version of node.js before you upgrade your application. Angular v16 supports node.js versions: v16 and v18.',
+      '确保在升级应用程序之前使用受支持的 node.js 版本。Angular v16 支持 node.js 版本：v16 和 v18。',
   },
   {
     possibleIn: 1600,
@@ -1847,7 +1766,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v16 ts support',
     action:
-      'Make sure that you are using a supported version of TypeScript before you upgrade your application. Angular v16 supports TypeScript version 4.9.3 or later.',
+      '确保在升级应用程序之前使用受支持的 TypeScript 版本。Angular v16 支持 TypeScript 版本 4.9.3 或更高版本。',
   },
   {
     possibleIn: 1600,
@@ -1855,7 +1774,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v16 ng update',
     action:
-      "In the application's project directory, run `ng update @angular/core@16 @angular/cli@16` to update your application to Angular v16.",
+      '在应用程序的项目目录中，运行 `ng update @angular/core@16 @angular/cli@16`，将应用程序更新到 Angular v16。',
   },
   {
     possibleIn: 1600,
@@ -1863,7 +1782,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     material: true,
     step: 'update @angular/material',
-    action: 'Run `ng update @angular/material@16`.',
+    action: '运行 `ng update @angular/material@16`。',
   },
   {
     possibleIn: 1600,
@@ -1871,7 +1790,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v16 zone.js support',
     action:
-      'Make sure that you are using a supported version of Zone.js before you upgrade your application. Angular v16 supports Zone.js version 0.13.x or later.',
+      '在升级应用程序之前，请确保使用受支持的 Zone.js 版本。Angular v16 支持 Zone.js 版本 0.13.x 或更高版本。',
   },
   {
     possibleIn: 1600,
@@ -1879,23 +1798,21 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v16 RouterEvent',
     action:
-      "The Event union no longer contains `RouterEvent`, which means that if you're using the Event type you may have to change the type definition from `(e: Event)` to `(e: Event|RouterEvent)`",
+      'Event 联合体不再包含 `RouterEvent`，这意味着如果你正在使用 Event 类型，则可能必须将类型定义从 `(e: Event)` 更改为 `(e: Event|RouterEvent)`',
   },
   {
     possibleIn: 1600,
     necessaryAsOf: 1600,
     level: ApplicationComplexity.Advanced,
     step: 'v16 routerEvent prop type',
-    action:
-      'In addition to `NavigationEnd` the `routerEvent` property now also accepts type `NavigationSkipped`',
+    action: '除了 `NavigationEnd`，`routerEvent` 属性现在还接受类型 `NavigationSkipped`',
   },
   {
     possibleIn: 1600,
     necessaryAsOf: 1600,
     level: ApplicationComplexity.Advanced,
     step: 'v16 RendererType2',
-    action:
-      'Pass only flat arrays to `RendererType2.styles` because it no longer accepts nested arrays',
+    action: '仅将扁平数组传递给 `RendererType2.styles`，因为它不再接受嵌套数组',
   },
   {
     possibleIn: 1600,
@@ -1903,7 +1820,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v16 BrowserPlatformLocation',
     action:
-      'You may have to update tests that use `BrowserPlatformLocation` because `MockPlatformLocation` is now provided by default in tests. [Read further](https://github.com/angular/angular/blob/main/CHANGELOG.md#common-9).',
+      '你可能需要更新使用 `BrowserPlatformLocation` 的测试，因为 `MockPlatformLocation` 现在默认在测试中提供。[继续阅读](https://github.com/angular/angular/blob/main/CHANGELOG.md#common-9)',
   },
   {
     possibleIn: 1600,
@@ -1911,7 +1828,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v16 ngcc',
     action:
-      'Due to the removal of the Angular Compatibility Compiler (ngcc) in v16, projects on v16 and later no longer support View Engine libraries.',
+      '由于在 v16 中删除了 Angular Compatibility Compiler (ngcc)，因此 v16 及更高版本的项目不再支持 View Engine 库。',
   },
   {
     possibleIn: 1600,
@@ -1919,22 +1836,21 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v16 createUrlTree',
     action:
-      'After bug fixes in `Router.createUrlTree` you may have to readjust tests which mock `ActivatedRoute`. [Read further](https://github.com/angular/angular/blob/main/CHANGELOG.md#1600-2023-05-03)',
+      '在 `Router.createUrlTree` 中的错误修复后，你可能需要调整模拟 `ActivatedRoute` 的测试。[继续阅读](https://github.com/angular/angular/blob/main/CHANGELOG.md#1600-2023-05-03)',
   },
   {
     possibleIn: 1600,
     necessaryAsOf: 1600,
     level: ApplicationComplexity.Medium,
     step: 'v16 ApplicationConfig imports',
-    action: 'Change imports of `ApplicationConfig` to be from `@angular/core`.',
+    action: '将 `ApplicationConfig` 的导入更改为来自 `@angular/core`。',
   },
   {
     possibleIn: 1600,
     necessaryAsOf: 1600,
     level: ApplicationComplexity.Advanced,
     step: 'v16 renderModule',
-    action:
-      'Revise your code to use `renderModule` instead of `renderModuleFactory` because it has been deleted.',
+    action: '修改代码以使用 `renderModule` 而不是 `renderModuleFactory`，因为后者已被删除。',
   },
   {
     possibleIn: 1600,
@@ -1942,7 +1858,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v16 XhrFactory',
     action:
-      'Revise your code to use `XhrFactory` from `@angular/common` instead of `XhrFactory` export from `@angular/common/http`.',
+      '修改代码，使用 `@angular/common` 中的 `XhrFactory` 而不是来自 `@angular/common/http` 的 `XhrFactory`。',
   },
   {
     possibleIn: 1600,
@@ -1950,7 +1866,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v16 withServerTransition',
     action:
-      "If you're running multiple Angular apps on the same page and you're using `BrowserModule.withServerTransition({ appId: 'serverApp' })` make sure you set the `APP_ID` instead since `withServerTransition` is now deprecated. [Read further](https://github.com/angular/angular/blob/main/CHANGELOG.md#platform-browser-4)",
+      "如果你在同一页上运行多个 Angular 应用程序，并且使用了 `BrowserModule.withServerTransition({ appId: 'serverApp' })`，请确保设置 `APP_ID`，因为 `withServerTransition` 现已过时。[继续阅读](https://github.com/angular/angular/blob/main/CHANGELOG.md#platform-browser-4)",
   },
   {
     possibleIn: 1600,
@@ -1958,7 +1874,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v16 EnvironmentInjector',
     action:
-      'Change `EnvironmentInjector.runInContext` to `runInInjectionContext` and pass the environment injector as the first parameter.',
+      '将 `EnvironmentInjector.runInContext` 更改为 `runInInjectionContext`，并将环境注入器作为第一个参数传递。',
   },
   {
     possibleIn: 1600,
@@ -1966,14 +1882,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v16 ViewContainerRef.createComponent',
     action:
-      'Update your code to use `ViewContainerRef.createComponent` without the factory resolver. `ComponentFactoryResolver` has been removed from Router APIs.',
+      '更新你的代码，使用 `ViewContainerRef.createComponent` 而不使用工厂解析器。`ComponentFactoryResolver` 已从 Router API 中移除。',
   },
   {
     possibleIn: 1600,
     necessaryAsOf: 1600,
     level: ApplicationComplexity.Advanced,
     step: 'v16 APP_ID',
-    action: 'If you bootstrap multiple apps on the same page, make sure you set unique `APP_IDs`.',
+    action: '如果在同一页上引导多个应用程序，请确保设置唯一的 `APP_IDs`。',
   },
   {
     possibleIn: 1600,
@@ -1981,7 +1897,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v16 server renderApplication',
     action:
-      'Update your code to revise `renderApplication` method as it no longer accepts a root component as first argument, but instead a callback that should bootstrap your app. [Read further](https://github.com/angular/angular/blob/main/CHANGELOG.md#platform-server-3)',
+      '更新你的代码，修订 `renderApplication` 方法，因为它不再接受根组件作为第一个参数，而是应该引导你的应用程序的回调函数。[继续阅读](https://github.com/angular/angular/blob/main/CHANGELOG.md#platform-server-3)',
   },
   {
     possibleIn: 1600,
@@ -1989,7 +1905,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v16 PlatformConfig.baseUrl',
     action:
-      'Update your code to remove any reference to `PlatformConfig.baseUrl` and `PlatformConfig.useAbsoluteUrl` platform-server config options as it has been deprecated.',
+      '更新你的代码，删除对 `PlatformConfig.baseUrl` 和 `PlatformConfig.useAbsoluteUrl` platform-server 配置选项的任何引用，因为它已被弃用。',
   },
   {
     possibleIn: 1600,
@@ -1997,7 +1913,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v16 moduleid',
     action:
-      'Update your code to remove any reference to `@Directive`/`@Component` `moduleId` property as it does not have any effect and will be removed in v17.',
+      '更新你的代码，删除对 `@Directive`/`@Component` `moduleId` 属性的任何引用，因为它不起作用，将在 v17 中删除。',
   },
   {
     possibleIn: 1600,
@@ -2005,7 +1921,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v16 transfer state imports',
     action:
-      "Update imports from `import {makeStateKey, StateKey, TransferState} from '@angular/platform-browser'` to `import {makeStateKey, StateKey, TransferState} from '@angular/core'`",
+      "从 `import {makeStateKey, StateKey, TransferState} from '@angular/platform-browser'` 更新导入到 `import {makeStateKey, StateKey, TransferState} from '@angular/core'`",
   },
   {
     possibleIn: 1600,
@@ -2013,7 +1929,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v16 ComponentRef',
     action:
-      "If you rely on `ComponentRef.setInput` to set the component input even if it's the same based on `Object.is` equality check, make sure you copy its value.",
+      '如果依赖于 `ComponentRef.setInput` 来设置组件输入，即使它基于 `Object.is` 相等性检查是相同的，请确保复制其值。',
   },
   {
     possibleIn: 1600,
@@ -2021,7 +1937,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v16 ANALYZE_FOR_ENTRY_COMPONENTS',
     action:
-      'Update your code to remove any reference to `ANALYZE_FOR_ENTRY_COMPONENTS` injection token as it has been deleted.',
+      '更新你的代码，删除对 `ANALYZE_FOR_ENTRY_COMPONENTS` 注入令牌的任何引用，因为它已被删除。',
   },
   {
     possibleIn: 1600,
@@ -2029,7 +1945,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v16 entry components',
     action:
-      '`entryComponents` is no longer available and any reference to it can be removed from the `@NgModule` and `@Component` public APIs.',
+      '`entryComponents` 不再可用，并且可以从 `@NgModule` 和 `@Component` 公共 API 中删除任何对它的引用。',
   },
   {
     possibleIn: 1600,
@@ -2037,31 +1953,28 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v16 ngTemplateOutletContext',
     action:
-      'ngTemplateOutletContext has stricter type checking which requires you to declare all the properties in the corresponding object. [Read further](https://github.com/angular/angular/blob/main/CHANGELOG.md#common-1).',
+      'ngTemplateOutletContext 具有更严格的类型检查，需要你在相应对象中声明所有属性。[继续阅读](https://github.com/angular/angular/blob/main/CHANGELOG.md#common-1).',
   },
   {
     possibleIn: 1600,
     necessaryAsOf: 1600,
     level: ApplicationComplexity.Medium,
     step: 'v16 APF',
-    action:
-      'Angular packages no longer include FESM2015 and the distributed ECMScript has been updated from 2020 to 2022.',
+    action: 'Angular 包不再包括 FESM2015，并且分布式 ECMScript 已从 2020 更新到 2022。',
   },
   {
     possibleIn: 1600,
     necessaryAsOf: 1600,
     level: ApplicationComplexity.Advanced,
     step: 'v16 EventManager',
-    action:
-      'The deprecated `EventManager` method `addGlobalEventListener` has been removed as it is not used by Ivy.',
+    action: '已删除已弃用的 `EventManager` 方法 `addGlobalEventListener`，因为它未被 Ivy 使用。',
   },
   {
     possibleIn: 1600,
     necessaryAsOf: 1600,
     level: ApplicationComplexity.Medium,
     step: 'v16 BrowserTransferStateModule',
-    action:
-      '`BrowserTransferStateModule` is no longer available and any reference to it can be removed from your applications.',
+    action: '`BrowserTransferStateModule` 不再可用，并且可以从你的应用程序中删除任何对它的引用。',
   },
   {
     possibleIn: 1600,
@@ -2069,7 +1982,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v16 ReflectiveInjector',
     action:
-      'Update your code to use `Injector.create` rather than `ReflectiveInjector` since `ReflectiveInjector` is removed.',
+      '更新你的代码，使用 `Injector.create` 而不是 `ReflectiveInjector`，因为 `ReflectiveInjector` 已被移除。',
   },
   {
     possibleIn: 1600,
@@ -2077,16 +1990,15 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v16 QueryList',
     action:
-      '`QueryList.filter` now supports type guard functions. Since the type will be narrowed, you may have to update your application code that relies on the old behavior.',
+      '`QueryList.filter` 现在支持类型保护函数。由于类型将被缩小，你可能需要更新依赖于旧行为的应用程序代码。',
   },
-
   {
     possibleIn: 1700,
     necessaryAsOf: 1700,
     level: ApplicationComplexity.Basic,
     step: 'v17 node support',
     action:
-      'Make sure that you are using a supported version of node.js before you upgrade your application. Angular v17 supports node.js versions: v18.13.0 and newer',
+      '在升级应用程序之前，请确保你正在使用受支持的 node.js 版本。Angular v17 支持 node.js 版本：v18.13.0 及更高版本。',
   },
   {
     possibleIn: 1700,
@@ -2094,7 +2006,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v17 ts support',
     action:
-      'Make sure that you are using a supported version of TypeScript before you upgrade your application. Angular v17 supports TypeScript version 5.2 or later.',
+      '在升级应用程序之前，请确保你正在使用受支持的 TypeScript 版本。Angular v17 支持 TypeScript 版本 5.2 或更高版本。',
   },
   {
     possibleIn: 1700,
@@ -2102,7 +2014,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v17 zone.js support',
     action:
-      'Make sure that you are using a supported version of Zone.js before you upgrade your application. Angular v17 supports Zone.js version 0.14.x or later.',
+      '在升级应用程序之前，请确保你正在使用受支持的 Zone.js 版本。Angular v17 支持 Zone.js 版本 0.14.x 或更高版本。',
   },
   {
     possibleIn: 1700,
@@ -2110,7 +2022,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v17 ng update',
     action:
-      "In the application's project directory, run `ng update @angular/core@17 @angular/cli@17` to update your application to Angular v17.",
+      '在应用程序的项目目录中运行 `ng update @angular/core@17 @angular/cli@17`，将你的应用程序升级到 Angular v17。',
   },
   {
     possibleIn: 1700,
@@ -2118,7 +2030,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     material: true,
     step: 'update @angular/material',
-    action: 'Run `ng update @angular/material@17`.',
+    action: '运行 `ng update @angular/material@17`。',
   },
   {
     possibleIn: 1700,
@@ -2126,7 +2038,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v17 style removal',
     action:
-      'Angular now automatically removes styles of destroyed components, which may impact your existing apps in cases you rely on leaked styles. To change this update the value of the `REMOVE_STYLES_ON_COMPONENT_DESTROY` provider to `false`.',
+      'Angular 现在会自动删除销毁组件的样式，这可能会影响到你现有的应用程序，特别是在你依赖于泄漏样式的情况下。要更改此设置，请将 `REMOVE_STYLES_ON_COMPONENT_DESTROY` 提供程序的值更改为 `false`。',
   },
   {
     possibleIn: 1700,
@@ -2134,7 +2046,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v17 router removals',
     action:
-      "Make sure you configure `setupTestingRouter`, `canceledNavigationResolution`, `paramsInheritanceStrategy`, `titleStrategy`, `urlUpdateStrategy`, `urlHandlingStrategy`, and `malformedUriErrorHandler` in `provideRouter` or `RouterModule.forRoot` since these properties are now not part of the `Router`'s public API",
+      '确保你在 `provideRouter` 或 `RouterModule.forRoot` 中配置 `setupTestingRouter`、`canceledNavigationResolution`、`paramsInheritanceStrategy`、`titleStrategy`、`urlUpdateStrategy`、`urlHandlingStrategy` 和 `malformedUriErrorHandler`，因为这些属性现在不再是 `Router` 的公共 API 的一部分。',
   },
   {
     possibleIn: 1700,
@@ -2142,7 +2054,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v17 ngDoCheck dynamic components',
     action:
-      'For dynamically instantiated components we now execute `ngDoCheck` during change detection if the component is marked as dirty. You may need to update your tests or logic within `ngDoCheck` for dynamically instantiated components.',
+      '对于动态实例化的组件，我们现在在变更检测期间执行 `ngDoCheck`，如果组件被标记为脏，则可能需要更新动态实例化组件的测试或 `ngDoCheck` 中的逻辑。',
   },
   {
     possibleIn: 1700,
@@ -2150,7 +2062,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v17 malformedUriErrorHandler',
     action:
-      "Handle URL parsing errors in the `UrlSerializer.parse` instead of `malformedUriErrorHandler` because it's now part of the public API surface.",
+      '在 `UrlSerializer.parse` 中处理 URL 解析错误，而不是 `malformedUriErrorHandler`，因为它现在是公共 API 的一部分。',
   },
   {
     possibleIn: 1700,
@@ -2158,7 +2070,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v17 zone deep imports',
     action:
-      'Change Zone.js deep imports like `zone.js/bundles/zone-testing.js` and `zone.js/dist/zone` to `zone.js` and `zone.js/testing`.',
+      '将 Zone.js 的深度导入（如 `zone.js/bundles/zone-testing.js` 和 `zone.js/dist/zone`）更改为 `zone.js` 和 `zone.js/testing`。',
   },
   {
     possibleIn: 1700,
@@ -2166,7 +2078,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v17 absolute redirects',
     action:
-      'You may need to adjust your router configuration to prevent infinite redirects after absolute redirects. In v17 we no longer prevent additional redirects after absolute redirects.',
+      '你可能需要调整路由器配置以防止绝对重定向后的无限重定向。在 v17 中，我们不再在绝对重定向后阻止额外的重定向。',
   },
   {
     possibleIn: 1700,
@@ -2174,7 +2086,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v17 AnimationDriver',
     action:
-      'Change references to `AnimationDriver.NOOP` to use `NoopAnimationDriver` because `AnimationDriver.NOOP` is now deprecated.',
+      '将对 `AnimationDriver.NOOP` 的引用更改为使用 `NoopAnimationDriver`，因为 `AnimationDriver.NOOP` 现在已被弃用。',
   },
   {
     possibleIn: 1700,
@@ -2182,7 +2094,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v17 switch strictness',
     action:
-      "You may need to adjust the equality check for `NgSwitch` because now it defaults to stricter check with `===` instead of `==`. Angular will log a warning message for the usages where you'd need to provide an adjustment.",
+      '你可能需要调整 `NgSwitch` 的相等性检查，因为现在默认采用更严格的 `===` 而不是 `==`。Angular 将为需要提供调整的用法记录警告消息。',
   },
   {
     possibleIn: 1700,
@@ -2190,7 +2102,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: 'v17 mutate in signals',
     action:
-      'Use `update` instead of `mutate` in Angular Signals. For example `items.mutate(itemsArray => itemsArray.push(newItem));` will now be `items.update(itemsArray => [itemsArray, …newItem]);`',
+      '在 Angular 信号中使用 `update` 代替 `mutate`。例如，`items.mutate(itemsArray => itemsArray.push(newItem));` 现在是 `items.update(itemsArray => [itemsArray, …newItem]);`',
   },
   {
     possibleIn: 1700,
@@ -2198,7 +2110,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: 'v17 withNoDomReuse',
     action:
-      'To disable hydration use `ngSkipHydration` or remove the `provideClientHydration` call from the provider list since `withNoDomReuse` is no longer part of the public API.',
+      '要禁用水合作用，请使用 `ngSkipHydration` 或从提供程序列表中删除 `provideClientHydration` 调用，因为 `withNoDomReuse` 不再是公共 API 的一部分。',
   },
   {
     possibleIn: 1700,
@@ -2206,16 +2118,15 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v17 paramsInheritanceStrategy',
     action:
-      'If you want the child routes of `loadComponent` routes to inherit data from their parent specify the `paramsInheritanceStrategy` to `always`, which in v17 is now set to `emptyOnly`.',
+      '如果你希望 `loadComponent` 路由的子路由从其父路由继承数据，请将 `paramsInheritanceStrategy` 指定为 `always`，在 v17 中，现在设置为 `emptyOnly`。',
   },
-
   {
     possibleIn: 1800,
     necessaryAsOf: 1800,
     level: ApplicationComplexity.Basic,
     step: 'v18 node support',
     action:
-      'Make sure that you are using a supported version of node.js before you upgrade your application. Angular v18 supports node.js versions: v18.19.0 and newer',
+      '在升级应用程序之前，请确保你正在使用受支持的 node.js 版本。Angular v18 支持 node.js 版本：v18.19.0 及更高版本。',
   },
   {
     possibleIn: 1800,
@@ -2223,7 +2134,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     step: 'v18 ng update',
     action:
-      "In the application's project directory, run `ng update @angular/core@18 @angular/cli@18` to update your application to Angular v18.",
+      '在应用程序的项目目录中运行 `ng update @angular/core@18 @angular/cli@18`，将你的应用程序升级到 Angular v18。',
   },
   {
     possibleIn: 1800,
@@ -2231,28 +2142,28 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     material: true,
     step: 'update @angular/material',
-    action: 'Run `ng update @angular/material@18`.',
+    action: '运行 `ng update @angular/material@18`。',
   },
   {
     possibleIn: 1800,
     necessaryAsOf: 1800,
     level: ApplicationComplexity.Basic,
     step: '18.0.0 Upgrade TypeScript',
-    action: 'Update TypeScript to versions 5.4 or newer.',
+    action: '将 TypeScript 更新到 5.4 版本或更高版本。',
   },
   {
     possibleIn: 1800,
     necessaryAsOf: 1800,
     level: ApplicationComplexity.Advanced,
     step: '18.0.0: async has been removed, use `waitForAsync` instead',
-    action: 'Replace `async` from `@angular/core` with `waitForAsync`.',
+    action: '从 `@angular/core` 中替换 `async` 为 `waitForAsync`。',
   },
   {
     possibleIn: 1800,
     necessaryAsOf: 1800,
     level: ApplicationComplexity.Advanced,
     step: '18.0.0: Deprecated matchesElement method removed from AnimationDriver',
-    action: "Remove calls to `matchesElement` because it's now not part of `AnimationDriver`.",
+    action: '删除对 `matchesElement` 的调用，因为它现在不再是 `AnimationDriver` 的一部分。',
   },
   {
     possibleIn: 1800,
@@ -2260,7 +2171,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: '18.0.0. Use `@angular/core` StateKey and TransferState',
     action:
-      'Import `StateKey` and `TransferState` from `@angular/core` instead of `@angular/platform-browser`.',
+      '从 `@angular/core` 中导入 `StateKey` 和 `TransferState`，而不是 `@angular/platform-browser`。',
   },
   {
     possibleIn: 1800,
@@ -2268,7 +2179,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: '18.0.0. Opt-in of caching for HTTP requests with auth headers',
     action:
-      'Use `includeRequestsWithAuthHeaders: true` in `withHttpTransferCache` to opt-in of caching for HTTP requests that require authorization.',
+      '在 `withHttpTransferCache` 中使用 `includeRequestsWithAuthHeaders: true` 以选择不缓存需要授权的 HTTP 请求。',
   },
   {
     possibleIn: 1800,
@@ -2276,7 +2187,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: '18.0.0.REMOVE_OBSOLETE_IS_WORKER',
     action:
-      'Update the application to remove `isPlatformWorkerUi` and `isPlatformWorkerApp` since they were part of platform WebWorker which is now not part of Angular.',
+      '更新应用程序以删除 `isPlatformWorkerUi` 和 `isPlatformWorkerApp`，因为它们是平台 WebWorker 的一部分，而现在不再是 Angular 的一部分。',
   },
   {
     possibleIn: 1800,
@@ -2284,14 +2195,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: '18.0.0.FORCE_ZONE_CHANGE_DETECTION',
     action:
-      'Tests may run additional rounds of change detection to fully reflect test state in the DOM. As a last resort, revert to the old behavior by adding `provideZoneChangeDetection({ignoreChangesOutsideZone: true})` to the TestBed providers.',
+      '测试可能需要运行额外的变更检测轮次，以完全反映 DOM 中的测试状态。作为最后的手段，通过将 `provideZoneChangeDetection({ignoreChangesOutsideZone: true})` 添加到 TestBed 的提供程序中，恢复旧的行为。',
   },
   {
     possibleIn: 1800,
     necessaryAsOf: 1800,
     level: ApplicationComplexity.Medium,
     step: '18.0.0: Remove two-way binding expressions in writable bindings',
-    action: 'Remove expressions that write to properties in templates that use `[(ngModel)]`',
+    action: '删除在使用 `[(ngModel)]` 的模板中写入属性的表达式。',
   },
   {
     possibleIn: 1800,
@@ -2299,7 +2210,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: '18.0.0: Use zones to track pending requests',
     action:
-      'Remove calls to `Testability` methods `increasePendingRequestCount`, `decreasePendingRequestCount`, and `getPendingRequestCount`. This information is tracked by ZoneJS.',
+      '删除对 `Testability` 方法 `increasePendingRequestCount`、`decreasePendingRequestCount` 和 `getPendingRequestCount` 的调用。这些信息由 ZoneJS 跟踪。',
   },
   {
     possibleIn: 1800,
@@ -2307,7 +2218,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Medium,
     step: '18.0.0: Move shared providers to the routed component',
     action:
-      'Move any environment providers that should be available to routed components from the component that defines the `RouterOutlet` to the providers of `bootstrapApplication` or the `Route` config.',
+      '将应该对路由组件可用的任何环境提供者从定义 `RouterOutlet` 的组件移动到 `bootstrapApplication` 或 `Route` 配置的提供者中。',
   },
   {
     possibleIn: 1800,
@@ -2315,15 +2226,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: '18.0.0 Use RedirectCommand or new NavigationBehaviorOptions',
     action:
-      'When a guard returns a `UrlTree` as a redirect, the redirecting navigation will now use `replaceUrl` if the initial navigation was also using the `replaceUrl` option. If you prefer the previous behavior, configure the redirect using the new `NavigationBehaviorOptions` by returning a `RedirectCommand` with the desired options instead of `UrlTree`.',
+      '当守卫将 `UrlTree` 作为重定向返回时，重定向导航现在将使用 `replaceUrl`，如果初始导航也使用了 `replaceUrl` 选项。如果你希望保留以前的行为，请使用新的 `NavigationBehaviorOptions` 配置重定向，方法是返回具有所需选项的 `RedirectCommand` 而不是 `UrlTree`。',
   },
   {
     possibleIn: 1800,
     necessaryAsOf: 1800,
     level: ApplicationComplexity.Advanced,
     step: '18.0.0: Remove deprecated resource cache providers',
-    action:
-      "Remove dependencies of `RESOURCE_CACHE_PROVIDER` since it's no longer part of the Angular runtime.",
+    action: '删除 `RESOURCE_CACHE_PROVIDER` 的依赖项，因为它不再是 Angular 运行时的一部分。',
   },
   {
     possibleIn: 1800,
@@ -2331,15 +2241,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: '18.0.0: Update Node.js URL parsing in `ServerPlatformLocation`',
     action:
-      'In `@angular/platform-server` now `pathname` is always suffixed with `/` and the default ports for http: and https: respectively are 80 and 443.',
+      '在 `@angular/platform-server` 中，现在 `pathname` 总是以 `/` 结尾，而 http: 和 https: 的默认端口分别是 80 和 443。',
   },
   {
     possibleIn: 1800,
     necessaryAsOf: 1800,
     level: ApplicationComplexity.Medium,
     step: '18.0.0. Use absolute URLs',
-    action:
-      'Provide an absolute `url` instead of using `useAbsoluteUrl` and `baseUrl` from `PlatformConfig`.',
+    action: '提供绝对 `url`，而不是使用 `PlatformConfig` 中的 `useAbsoluteUrl` 和 `baseUrl`。',
   },
   {
     possibleIn: 1800,
@@ -2347,15 +2256,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: '18.0.0. Switch from `platformDynamicServer` to `platformServer`.',
     action:
-      'Replace the usage of `platformDynamicServer` with `platformServer`. Also, add an `import @angular/compiler`.',
+      '将 `platformDynamicServer` 的用法替换为 `platformServer`。另外，添加一个 `import @angular/compiler`。',
   },
   {
     possibleIn: 1800,
     necessaryAsOf: 1800,
     level: ApplicationComplexity.Medium,
     step: '18.0.0. Remove `ServerTransferStateModule` from app imports',
-    action:
-      'Remove all imports of `ServerTransferStateModule` from your application. It is no longer needed.',
+    action: '从应用程序中删除所有对 `ServerTransferStateModule` 的导入。它不再需要。',
   },
   {
     possibleIn: 1800,
@@ -2363,7 +2271,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: '18.0.0. Update `Route.redirectTo` to accept functions',
     action:
-      '`Route.redirectTo` can now include a function in addition to a string. Any code which reads `Route` objects directly and expects `redirectTo` to be a string may need to update to account for functions as well.',
+      '`Route.redirectTo` 现在可以接受函数，而不仅仅是字符串。任何直接读取 `Route` 对象并期望 `redirectTo` 是字符串的代码可能需要更新，以考虑函数。',
   },
   {
     possibleIn: 1800,
@@ -2371,15 +2279,14 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: '18.0.0: Guards can return `RedirectCommand`',
     action:
-      '`Route` guards and resolvers can now return a `RedirectCommand` object in addition to a `UrlTree` and `boolean`. Any code which reads `Route` objects directly and expects only `boolean` or `UrlTree` may need to update to account for `RedirectCommand` as well.',
+      '除了 `UrlTree` 和 `boolean`，`Route` 守卫和解析器现在还可以返回一个 `RedirectCommand` 对象。任何直接读取 `Route` 对象并期望只有 `boolean` 或 `UrlTree` 的代码可能需要更新，以考虑 `RedirectCommand`。',
   },
   {
     possibleIn: 1800,
     necessaryAsOf: 1800,
     level: ApplicationComplexity.Medium,
     step: '18.0.0: Mark `OnPush` views dirty',
-    action:
-      'For any components using `OnPush` change detection, ensure they are properly marked dirty to enable host binding updates.',
+    action: '对于使用 `OnPush` 变更检测的任何组件，请确保它们被正确标记为脏，以启用宿主绑定更新。',
   },
   {
     possibleIn: 1800,
@@ -2387,7 +2294,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: '18.0.0-Refresh-Newly-Created-Views',
     action:
-      'Be aware that newly created views or views marked for check and reattached during change detection are now guaranteed to be refreshed in that same change detection cycle.',
+      '请注意，新创建的视图或在变更检测期间标记为检查并重新附加的视图现在保证在同一变更检测周期中刷新。',
   },
   {
     possibleIn: 1800,
@@ -2395,7 +2302,7 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: '18.0.0: `ComponentFixture.whenStable` matches `ApplicationRef.isStable`',
     action:
-      'After aligning the semantics of `ComponentFixture.whenStable` and `ApplicationRef.isStable`, your tests may wait longer when using `whenStable`.',
+      '在调整 `ComponentFixture.whenStable` 和 `ApplicationRef.isStable` 语义后，使用 `whenStable` 时你的测试可能需要更长时间等待。',
   },
   {
     possibleIn: 1800,
@@ -2403,11 +2310,11 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Advanced,
     step: '18.0.0. `ComponentFixture.autoDetect` behavior more closely matches Application behavior',
     action:
-      'You may experience tests failures if you have tests that rely on change detection execution order when using `ComponentFixture.autoDetect` because it now executes change detection for fixtures within `ApplicationRef.tick`. For example, this will cause test fixture to refresh before any dialogs that it creates whereas this may have been the other way around in the past.',
+      '如果你的测试依赖于 `ComponentFixture.autoDetect` 的变更检测执行顺序，可能会遇到测试失败，因为它现在会在 `ApplicationRef.tick` 中执行测试夹具的变更检测。例如，这将导致测试夹具在创建任何对话框之前刷新，而以前可能相反。',
   },
   {
     action:
-      "In the application's project directory, run `ng update @angular/core@19 @angular/cli@19` to update your application to Angular v19.",
+      '在应用程序的项目目录中，运行 `ng update @angular/core@19 @angular/cli@19` 以将应用升级到Angular v19。',
     level: ApplicationComplexity.Basic,
     necessaryAsOf: 1900,
     possibleIn: 1900,
@@ -2419,11 +2326,11 @@ export const RECOMMENDATIONS: Step[] = [
     level: ApplicationComplexity.Basic,
     material: true,
     step: 'update @angular/material',
-    action: 'Run `ng update @angular/material@19`.',
+    action: '运行 `ng update @angular/material@19`。',
   },
   {
     action:
-      'Angular directives, components and pipes are now standalone by default. Specify "standalone: false" for declarations that are currently declared in an NgModule. The Angular CLI will automatically update your code to reflect that.',
+      'Angular指令、组件和管道现在默认是独立的。对于当前在NgModule中声明的声明，需明确指定 `standalone: false`。Angular CLI将自动更新代码以反映此变更。',
     level: ApplicationComplexity.Basic,
     necessaryAsOf: 1900,
     possibleIn: 1900,
@@ -2431,7 +2338,7 @@ export const RECOMMENDATIONS: Step[] = [
   },
   {
     action:
-      'Remove `this.` prefix when accessing template reference variables. For example, refactor `<div #foo></div>{{ this.foo }}` to `<div #foo></div>{{ foo }}`',
+      '访问模板引用变量时移除 `this.` 前缀。例如，将 `<div #foo></div>{{ this.foo }}` 重构为 `<div #foo></div>{{ foo }}`',
     level: ApplicationComplexity.Medium,
     necessaryAsOf: 1900,
     possibleIn: 1900,
@@ -2439,29 +2346,28 @@ export const RECOMMENDATIONS: Step[] = [
   },
   {
     action:
-      'Replace usages of `BrowserModule.withServerTransition()` with injection of the `APP_ID` token to set the application `id` instead.',
+      '将 `BrowserModule.withServerTransition()` 的用法替换为注入 `APP_ID` 令牌来设置应用 `id`。',
     level: ApplicationComplexity.Basic,
     necessaryAsOf: 1900,
     possibleIn: 1900,
     step: '19.0.0-remove-browser-module-with-server-transition',
   },
   {
-    action: 'The `factories` property in `KeyValueDiffers` has been removed.',
+    action: '`KeyValueDiffers` 中的 `factories` 属性已被移除。',
     level: ApplicationComplexity.Advanced,
     necessaryAsOf: 1900,
     possibleIn: 1900,
     step: '19.0.0-remove-key-value-differs-factories',
   },
   {
-    action:
-      'In angular.json, replace the "name" option with "project" for the `@angular/localize` builder.',
+    action: '在angular.json中，将 `@angular/localize` 构建器的 `name` 选项替换为 `project`。',
     level: ApplicationComplexity.Medium,
     necessaryAsOf: 1900,
     possibleIn: 1900,
     step: '19.0.0_localize_builder_project_option',
   },
   {
-    action: 'Rename `ExperimentalPendingTasks` to `PendingTasks`.',
+    action: '将 `ExperimentalPendingTasks` 重命名为 `PendingTasks`。',
     level: ApplicationComplexity.Advanced,
     necessaryAsOf: 1900,
     possibleIn: 1900,
@@ -2469,14 +2375,14 @@ export const RECOMMENDATIONS: Step[] = [
   },
   {
     action:
-      "Update tests that relied on the `Promise` timing of effects to use `await whenStable()` or call `.detectChanges()` to trigger effects. For effects triggered during change detection, ensure they don't depend on the application being fully rendered or consider using `afterRenderEffect()`. Tests using faked clocks may need to fast-forward/flush the clock.",
+      '更新依赖effects的 `Promise` 时序的测试，改用 `await whenStable()` 或调用 `.detectChanges()` 来触发effects。对于在变更检测期间触发的effects，确保它们不依赖应用完全渲染，或考虑使用 `afterRenderEffect()`。使用模拟时钟的测试可能需要快进/清空时钟。',
     level: ApplicationComplexity.Medium,
     necessaryAsOf: 1900,
     possibleIn: 1900,
     step: '19.0.0.1',
   },
   {
-    action: 'Upgrade to TypeScript version 5.5 or later.',
+    action: '升级至TypeScript 5.5或更高版本。',
     level: ApplicationComplexity.Basic,
     necessaryAsOf: 1900,
     possibleIn: 1900,
@@ -2484,7 +2390,7 @@ export const RECOMMENDATIONS: Step[] = [
   },
   {
     action:
-      'Update tests using `fakeAsync` that rely on specific timing of zone coalescing and scheduling when a change happens outside the Angular zone (hybrid mode scheduling) as these timers are now affected by `tick` and `flush`.',
+      '更新使用 `fakeAsync` 的测试：当变更发生在 Angular Zone 外部时（混合模式调度），原测试依赖的 Zone 合并和调度的特定时序可能受到影响，因为现在这些计时器会受 `tick` 和 `flush` 影响。',
     level: ApplicationComplexity.Advanced,
     necessaryAsOf: 1900,
     possibleIn: 1900,
@@ -2492,7 +2398,7 @@ export const RECOMMENDATIONS: Step[] = [
   },
   {
     action:
-      "When using `createComponent` API and not passing content for the first `ng-content`, provide `document.createTextNode('')` as a `projectableNode` to prevent rendering the default fallback content.",
+      "使用 `createComponent` API且未传递第一个 `ng-content` 的内容时，需提供 `document.createTextNode('')` 作为 `projectableNode` 以防止渲染默认回退内容。",
     level: ApplicationComplexity.Medium,
     necessaryAsOf: 1900,
     possibleIn: 1900,
@@ -2500,7 +2406,7 @@ export const RECOMMENDATIONS: Step[] = [
   },
   {
     action:
-      'Update tests that rely on specific timing or ordering of change detection around custom elements, as the timing may have changed due to the switch to the hybrid scheduler.',
+      '更新依赖自定义元素周边变更检测特定时序或顺序的测试，由于切换至混合调度器，时序可能已发生变化。',
     level: ApplicationComplexity.Advanced,
     necessaryAsOf: 1900,
     possibleIn: 1900,
@@ -2508,7 +2414,7 @@ export const RECOMMENDATIONS: Step[] = [
   },
   {
     action:
-      'Migrate from using `Router.errorHandler` to `withNavigationErrorHandler` from `provideRouter` or `errorHandler` from `RouterModule.forRoot`.',
+      '从使用 `Router.errorHandler` 迁移到 `provideRouter` 的 `withNavigationErrorHandler` 或 `RouterModule.forRoot` 的 `errorHandler`。',
     level: ApplicationComplexity.Basic,
     necessaryAsOf: 1900,
     possibleIn: 1900,
@@ -2516,14 +2422,14 @@ export const RECOMMENDATIONS: Step[] = [
   },
   {
     action:
-      'Update tests to handle errors thrown during `ApplicationRef.tick` by either triggering change detection synchronously or rejecting outstanding `ComponentFixture.whenStable` promises.',
+      '更新测试以处理 `ApplicationRef.tick` 期间抛出的错误：可通过同步触发变更检测或拒绝未完成的 `ComponentFixture.whenStable` Promise来实现。',
     level: ApplicationComplexity.Advanced,
     necessaryAsOf: 1900,
     possibleIn: 1900,
     step: '19.0.0-testbed-error-handling',
   },
   {
-    action: 'Update usages of `Resolve` interface to include `RedirectCommand` in its return type.',
+    action: '更新 `Resolve` 接口的用法，在其返回类型中包含 `RedirectCommand`。',
     level: ApplicationComplexity.Medium,
     necessaryAsOf: 1900,
     possibleIn: 1900,
@@ -2531,7 +2437,7 @@ export const RECOMMENDATIONS: Step[] = [
   },
   {
     action:
-      '`fakeAsync` will flush pending timers by default. For tests that require the previous behavior, explicitly pass `{flush: false}` in the options parameter.',
+      '`fakeAsync` 现在默认会清空待处理计时器。若测试需要原有行为，需在选项参数中显式传递 `{flush: false}`。',
     level: ApplicationComplexity.Advanced,
     necessaryAsOf: 1900,
     possibleIn: 1900,
diff --git a/adev/src/app/features/update/update.component.html b/adev/src/app/features/update/update.component.html
index 8635134a7a2a..943d305c2a59 100644
--- a/adev/src/app/features/update/update.component.html
+++ b/adev/src/app/features/update/update.component.html
@@ -1,14 +1,14 @@
 <div class="page docs-viewer">
-  <h1 tabindex="-1">Update Guide</h1>
+  <h1 tabindex="-1">更新指南</h1>
   <div class="wizard">
     <div>
-      <h2>Select the options that match your update</h2>
+      <h2>选择与你的更新相匹配的选项</h2>
 
-      <h3>Angular versions</h3>
+      <h3>Angular 版本</h3>
 
       <div class="adev-version-selector">
         <span class="adev-template-select">
-          From v.
+          从 v.
 
           <button [cdkMenuTriggerFor]="templatesMenuFrom">
             <span>{{ from.name }}</span>
@@ -30,7 +30,7 @@ <h3>Angular versions</h3>
 
         <span>
           <span class="adev-template-select">
-            To v.
+            到 v.
             <button [cdkMenuTriggerFor]="templatesMenuTo">
               <span>{{ to.name }}</span>
               <docs-icon>expand_more</docs-icon>
@@ -54,9 +54,8 @@ <h3>Angular versions</h3>
       @if (from.number >= futureVersion || to.number >= futureVersion) {
         <div class="docs-alert docs-alert-critical">
           <p>
-            <strong>Warning:</strong>
-            Plans for releases after the current major release are not finalized and may change.
-            These recommendations are based on scheduled deprecations.
+            <strong>警告：</strong>
+            当前主要版本之后的发布计划尚未最终确定，可能会有变化。这些建议是基于计划中的弃用情况。
           </p>
         </div>
       }
@@ -64,8 +63,8 @@ <h3>Angular versions</h3>
       @if (from.number > to.number) {
         <div class="docs-alert docs-alert-critical">
           <p>
-            <strong>Warning:</strong>
-            We do not support downgrading versions of Angular.
+            <strong>警告：</strong>
+            我们不支持降级 Angular 版本。
           </p>
         </div>
       }
@@ -73,31 +72,28 @@ <h3>Angular versions</h3>
       @if ((to.number - from.number > 150) && from.number > 240) {
         <div class="docs-alert docs-alert-critical">
           <p>
-            <strong>Warning:</strong>
-            Be sure to follow the guide below to migrate your application to the new version. You
-            can't run
-            <code>ng update</code>
-            to update Angular applications more than one major version at a time.
+            <strong>警告：</strong>
+            确保按照以下指南把你的应用程序迁移到新版本。你每次运行 <code>ng update</code> 时不应该跳过任何主要版本来更新 Angular 应用程序。
           </p>
         </div>
       }
 
-      <h3>Application complexity</h3>
+      <h3>应用程序复杂性</h3>
       <mat-button-toggle-group
         (change)="level = $event.value;"
         [value]="level"
         style="margin-bottom:16px;"
       >
-        <mat-button-toggle [value]="1">Basic</mat-button-toggle>
-        <mat-button-toggle [value]="2">Medium</mat-button-toggle>
-        <mat-button-toggle [value]="3">Advanced</mat-button-toggle>
+        <mat-button-toggle [value]="1">基础</mat-button-toggle>
+        <mat-button-toggle [value]="2">中等</mat-button-toggle>
+        <mat-button-toggle [value]="3">高级</mat-button-toggle>
       </mat-button-toggle-group>
       @if (level === 1) {
-        <p>Shows information for all Angular developers.</p>
+        <p>展示所有 Angular 开发者都感兴趣的信息。</p>
       } @else if (level === 2) {
-        <p>Shows information that's of interest to more advanced Angular developers.</p>
+        <p>展示更高级 Angular 开发者会感兴趣的信息。</p>
       } @else if (level === 3) {
-        <p>Shows all the information we have about this update.</p>
+        <p>展示关于这个更新的所有信息。</p>
       }
 
       <h3>Other dependencies</h3>
@@ -112,7 +108,7 @@ <h3>Other dependencies</h3>
       }
 
       @if (from.number < 600) {
-        <h4>Package Manager</h4>
+        <h4>包管理器</h4>
         <mat-button-toggle-group
           (change)="packageManager = $event.value; showUpdatePath()"
           [value]="packageManager"
@@ -126,9 +122,9 @@ <h4>Package Manager</h4>
         type="button"
         (click)="showUpdatePath()"
         class="docs-primary-btn show-button"
-        [attr.text]="'Show me how to update!'"
+        [attr.text]="'告诉我如何更新！'"
       >
-        Show me how to update!
+        告诉我如何更新
       </button>
     </div>
   </div>
@@ -142,7 +138,7 @@ <h4>Package Manager</h4>
     <div class="recommendations">
       <h2>{{title}}</h2>
 
-      <h3>Before you update</h3>
+      <h3>在更新之前</h3>
       @for (r  of beforeRecommendations; track $index) {
         <div class="adev-recommentation-item">
           <mat-checkbox></mat-checkbox>
@@ -151,14 +147,14 @@ <h3>Before you update</h3>
       }
       @if (beforeRecommendations.length <= 0) {
         <div>
-          <em>You don't need to do anything before moving between these versions.</em>
+          <em>在这些版本之间切换之前，你无需进行任何操作。</em>
         </div>
       }
 
-      <h3>Update to the new version</h3>
+      <h3>更新到新版本</h3>
       @if (duringRecommendations.length > 0) {
         <div>
-          <em>Review these changes and perform the actions to update your application.</em>
+          <em>请审核这些更改并执行这些操作来更新应用程序。</em>
         </div>
       }
 
@@ -170,11 +166,11 @@ <h3>Update to the new version</h3>
       }
       @if (duringRecommendations.length <= 0) {
         <div>
-          <em>There aren't any recommendations for moving between these versions.</em>
+          <em>对这些版本之间的移动，没有任何建议。</em>
         </div>
       }
 
-      <h3>After you update</h3>
+      <h3>更新之后</h3>
       @for (r of afterRecommendations; track $index) {
         <div class="adev-recommentation-item">
           <mat-checkbox></mat-checkbox>
@@ -183,7 +179,7 @@ <h3>After you update</h3>
       }
       @if (afterRecommendations.length <= 0) {
         <div>
-          <em>You don't need to do anything after moving between these versions.</em>
+          <em>在切换这些版本之后，你无需进行任何操作。</em>
         </div>
       }
     </div>
diff --git a/adev/src/app/features/update/update.component.ts b/adev/src/app/features/update/update.component.ts
index 4adb7ea39fc8..71792b0ddf8d 100644
--- a/adev/src/app/features/update/update.component.ts
+++ b/adev/src/app/features/update/update.component.ts
@@ -51,7 +51,7 @@ export default class AppComponent {
   };
 
   protected readonly optionList: Option[] = [
-    {id: 'ngUpgrade', name: 'ngUpgrade', description: 'to combine AngularJS & Angular'},
+    {id: 'ngUpgrade', name: 'ngUpgrade', description: '合并 AngularJS 与 Angular'},
     {id: 'material', name: 'Angular Material', description: ''},
     {id: 'windows', name: 'Windows', description: ''},
   ];
@@ -139,14 +139,14 @@ export default class AppComponent {
 
     // Refuse to generate recommendations for downgrades
     if (this.to.number < this.from.number) {
-      alert('We do not support downgrading versions of Angular.');
+      alert('我们不支持降级 Angular 版本。');
       return;
     }
 
-    const labelTitle = 'Guide to update your Angular application';
-    const labelBasic = 'basic applications';
-    const labelMedium = 'medium applications';
-    const labelAdvanced = 'advanced applications';
+    const labelTitle = 'Angular 应用程序更新指南';
+    const labelBasic = '基础应用';
+    const labelMedium = '中等应用';
+    const labelAdvanced = '高级应用';
 
     this.title = `${labelTitle} v${this.from.name} -> v${this.to.name}
     for
@@ -241,7 +241,7 @@ export default class AppComponent {
 
     // Provide npm/yarn instructions for versions before 6
     if (this.to.number < 600) {
-      const actionMessage = `Update all of your dependencies to the latest Angular and the right version of TypeScript.`;
+      const actionMessage = `将所有依赖项更新到最新的 Angular 和正确版本的 TypeScript。`;
 
       if (isWindows()) {
         const packages =
@@ -252,18 +252,18 @@ export default class AppComponent {
           additionalDeps;
 
         upgradeStep = {
-          step: 'General Update',
+          step: '一般更新',
           action: `${actionMessage}
-          If you are using Windows, you can use:
+          如果你正在使用 Windows，则可以用：
 
 \`${this.packageManager} ${packages}\``,
         } as Step;
       } else {
         const packages = `@angular/{${angularPackages.join(',')}}@${angularVersion} ${additionalDeps}`;
         upgradeStep = {
-          step: 'General update',
+          step: '一般更新',
           action: `${actionMessage}
-          If you are using Linux/Mac, you can use:
+          如果你正在使用 Linux/Mac，则可以用：
 
 \`${this.packageManager} ${packages}\``,
         } as Step;
diff --git a/adev/src/app/sub-navigation-data.ts b/adev/src/app/sub-navigation-data.ts
index 4077a8ce777f..edc8df8db1bf 100644
--- a/adev/src/app/sub-navigation-data.ts
+++ b/adev/src/app/sub-navigation-data.ts
@@ -27,554 +27,554 @@ interface SubNavigationData {
 
 const DOCS_SUB_NAVIGATION_DATA: NavigationItem[] = [
   {
-    label: 'Introduction',
+    label: '简介',
     children: [
       {
-        label: 'What is Angular?',
+        label: '什么是 Angular？',
         path: 'overview',
         contentPath: 'introduction/what-is-angular',
       },
       {
-        label: 'Installation',
+        label: '安装',
         path: 'installation',
         contentPath: 'introduction/installation',
       },
       {
-        label: 'Essentials',
+        label: '基本要点',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'essentials',
             contentPath: 'introduction/essentials/overview',
           },
           {
-            label: 'Composition with components',
+            label: '用组件搭建应用',
             path: 'essentials/components',
             contentPath: 'introduction/essentials/components',
           },
           {
-            label: 'Reactivity with signals',
+            label: '使用 Signals 进行响应式编程',
             path: 'essentials/signals',
             contentPath: 'introduction/essentials/signals',
           },
           {
-            label: 'Dynamic interfaces with templates',
+            label: '使用模板编写动态界面',
             path: 'essentials/templates',
             contentPath: 'introduction/essentials/templates',
           },
           {
-            label: 'Modular design with dependency injection',
+            label: '使用依赖注入进行模块化设计',
             path: 'essentials/dependency-injection',
             contentPath: 'introduction/essentials/dependency-injection',
           },
           {
-            label: 'Next Steps',
+            label: '后续步骤',
             path: 'essentials/next-steps',
             contentPath: 'introduction/essentials/next-steps',
           },
         ],
       },
       {
-        label: 'Start coding! 🚀',
+        label: '开始编码！🚀',
         path: 'tutorials/learn-angular',
       },
     ],
   },
   {
-    label: 'In-depth Guides',
+    label: '深度指南',
     children: [
       {
-        label: 'Signals',
+        label: '信号',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'guide/signals',
             contentPath: 'guide/signals/overview',
           },
           {
-            label: 'Dependent state with linkedSignal',
+            label: '使用 linkedSignal 管理状态依赖',
             path: 'guide/signals/linked-signal',
             contentPath: 'guide/signals/linked-signal',
           },
           {
-            label: 'Async reactivity with resources',
+            label: '用 resources 处理异步响应',
             path: 'guide/signals/resource',
             contentPath: 'guide/signals/resource',
           },
         ],
       },
       {
-        label: 'Components',
+        label: '组件',
         children: [
           {
-            label: 'Anatomy of components',
+            label: '组件的剖析',
             path: 'guide/components',
             contentPath: 'guide/components/anatomy-of-components',
           },
           {
-            label: 'Selectors',
+            label: '选择器',
             path: 'guide/components/selectors',
             contentPath: 'guide/components/selectors',
           },
           {
-            label: 'Styling',
+            label: '指定样式',
             path: 'guide/components/styling',
             contentPath: 'guide/components/styling',
           },
           {
-            label: 'Accepting data with input properties',
+            label: '通过输入属性接收数据',
             path: 'guide/components/inputs',
             contentPath: 'guide/components/inputs',
           },
           {
-            label: 'Custom events with outputs',
+            label: '使用输出属性自定义事件',
             path: 'guide/components/outputs',
             contentPath: 'guide/components/outputs',
           },
           {
-            label: 'Content projection with ng-content',
+            label: '使用 ng-content 进行内容投影',
             path: 'guide/components/content-projection',
             contentPath: 'guide/components/content-projection',
           },
           {
-            label: 'Host elements',
+            label: '宿主元素',
             path: 'guide/components/host-elements',
             contentPath: 'guide/components/host-elements',
           },
           {
-            label: 'Lifecycle',
+            label: '生命周期',
             path: 'guide/components/lifecycle',
             contentPath: 'guide/components/lifecycle',
           },
           {
-            label: 'Referencing component children with queries',
+            label: '使用查询引用组件的子元素',
             path: 'guide/components/queries',
             contentPath: 'guide/components/queries',
           },
           {
-            label: 'Using DOM APIs',
+            label: '使用 DOM API',
             path: 'guide/components/dom-apis',
             contentPath: 'guide/components/dom-apis',
           },
           {
-            label: 'Inheritance',
+            label: '继承',
             path: 'guide/components/inheritance',
             contentPath: 'guide/components/inheritance',
           },
           {
-            label: 'Programmatically rendering components',
+            label: '以编程方式渲染组件',
             path: 'guide/components/programmatic-rendering',
             contentPath: 'guide/components/programmatic-rendering',
           },
           {
-            label: 'Advanced configuration',
+            label: '高级配置',
             path: 'guide/components/advanced-configuration',
             contentPath: 'guide/components/advanced-configuration',
           },
           {
-            label: 'Custom Elements',
+            label: '自定义元素',
             path: 'guide/elements',
             contentPath: 'guide/elements',
           },
         ],
       },
       {
-        label: 'Templates',
+        label: '模板',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'guide/templates',
             contentPath: 'guide/templates/overview',
           },
           {
-            label: 'Binding dynamic text, properties and attributes',
+            label: '绑定动态文本、属性、Attribute',
             path: 'guide/templates/binding',
             contentPath: 'guide/templates/binding',
           },
           {
-            label: 'Adding event listeners',
+            label: '添加事件监听器',
             path: 'guide/templates/event-listeners',
             contentPath: 'guide/templates/event-listeners',
           },
           {
-            label: 'Two-way binding',
+            label: '双向绑定',
             path: 'guide/templates/two-way-binding',
             contentPath: 'guide/templates/two-way-binding',
           },
           {
-            label: 'Control flow',
+            label: '控制流',
             path: 'guide/templates/control-flow',
             contentPath: 'guide/templates/control-flow',
           },
           {
-            label: 'Pipes',
+            label: '管道',
             path: 'guide/templates/pipes',
             contentPath: 'guide/templates/pipes',
           },
           {
-            label: 'Slotting child content with ng-content',
+            label: '使用 ng-content 实现子内容插槽（slot）',
             path: 'guide/templates/ng-content',
             contentPath: 'guide/templates/ng-content',
           },
           {
-            label: 'Create template fragments with ng-template',
+            label: '使用 ng-template 创建模板碎片',
             path: 'guide/templates/ng-template',
             contentPath: 'guide/templates/ng-template',
           },
           {
-            label: 'Grouping elements with ng-container',
+            label: '使用 ng-container 对元素进行分组',
             path: 'guide/templates/ng-container',
             contentPath: 'guide/templates/ng-container',
           },
           {
-            label: 'Variables in templates',
+            label: '模板中的变量',
             path: 'guide/templates/variables',
             contentPath: 'guide/templates/variables',
           },
           {
-            label: 'Deferred loading with @defer',
+            label: '使用 @defer 进行延迟加载',
             path: 'guide/templates/defer',
             contentPath: 'guide/templates/defer',
           },
           {
-            label: 'Expression syntax',
+            label: '表达式语法',
             path: 'guide/templates/expression-syntax',
             contentPath: 'guide/templates/expression-syntax',
           },
           {
-            label: 'Whitespace in templates',
+            label: '模板中的空白字符',
             path: 'guide/templates/whitespace',
             contentPath: 'guide/templates/whitespace',
           },
         ],
       },
       {
-        label: 'Directives',
+        label: '指令',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'guide/directives',
             contentPath: 'guide/directives/overview',
           },
           {
-            label: 'Attribute directives',
+            label: '属性型指令',
             path: 'guide/directives/attribute-directives',
             contentPath: 'guide/directives/attribute-directives',
           },
           {
-            label: 'Structural directives',
+            label: '结构型指令',
             path: 'guide/directives/structural-directives',
             contentPath: 'guide/directives/structural-directives',
           },
           {
-            label: 'Directive composition API',
+            label: '指令组合 API',
             path: 'guide/directives/directive-composition-api',
             contentPath: 'guide/directives/directive-composition-api',
           },
           {
-            label: 'Optimizing images with NgOptimizedImage',
+            label: '用 NgOptimizedImage 优化图片加载',
             path: 'guide/image-optimization',
             contentPath: 'guide/image-optimization',
           },
         ],
       },
       {
-        label: 'Dependency Injection',
+        label: '依赖注入',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'guide/di',
             contentPath: 'guide/di/overview',
           },
           {
-            label: 'Understanding dependency injection',
+            label: '理解依赖注入',
             path: 'guide/di/dependency-injection',
             contentPath: 'guide/di/dependency-injection',
           },
           {
-            label: 'Creating an injectable service',
+            label: '创建可注入服务',
             path: 'guide/di/creating-injectable-service',
             contentPath: 'guide/di/creating-injectable-service',
           },
           {
-            label: 'Defining dependency providers',
+            label: '定义依赖提供者',
             path: 'guide/di/dependency-injection-providers',
             contentPath: 'guide/di/dependency-injection-providers',
           },
           {
-            label: 'Injection context',
+            label: '注入上下文',
             path: 'guide/di/dependency-injection-context',
             contentPath: 'guide/di/dependency-injection-context',
           },
           {
-            label: 'Hierarchical injectors',
+            label: '分层注入器',
             path: 'guide/di/hierarchical-dependency-injection',
             contentPath: 'guide/di/hierarchical-dependency-injection',
           },
           {
-            label: 'Optimizing injection tokens',
+            label: '优化注入令牌',
             path: 'guide/di/lightweight-injection-tokens',
             contentPath: 'guide/di/lightweight-injection-tokens',
           },
           {
-            label: 'DI in action',
+            label: 'DI 的实际应用',
             path: 'guide/di/di-in-action',
             contentPath: 'guide/di/di-in-action',
           },
         ],
       },
       {
-        label: 'Routing',
+        label: '路由',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'guide/routing',
             contentPath: 'guide/routing/overview',
           },
           {
-            label: 'Common routing tasks',
+            label: '常见的路由任务',
             path: 'guide/routing/common-router-tasks',
             contentPath: 'guide/routing/common-router-tasks',
           },
           {
-            label: 'Routing in single-page applications',
+            label: '单页面应用中的路由',
             path: 'guide/routing/router-tutorial',
             contentPath: 'guide/routing/router-tutorial',
           },
           {
-            label: 'Creating custom route matches',
+            label: '创建自定义路由匹配规则',
             path: 'guide/routing/routing-with-urlmatcher',
             contentPath: 'guide/routing/routing-with-urlmatcher',
           },
           {
-            label: 'Router reference',
+            label: '路由器参考手册',
             path: 'guide/routing/router-reference',
             contentPath: 'guide/routing/router-reference',
           },
         ],
       },
       {
-        label: 'Forms',
+        label: '表单',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'guide/forms',
             contentPath: 'guide/forms/overview',
           },
           {
-            label: 'Reactive forms',
+            label: '响应式表单',
             path: 'guide/forms/reactive-forms',
             contentPath: 'guide/forms/reactive-forms',
           },
           {
-            label: 'Strictly typed reactive forms',
+            label: '严格类型化的响应式表单',
             path: 'guide/forms/typed-forms',
             contentPath: 'guide/forms/typed-forms',
           },
           {
-            label: 'Template-driven forms',
+            label: '模板驱动表单',
             path: 'guide/forms/template-driven-forms',
             contentPath: 'guide/forms/template-driven-forms',
           },
           {
-            label: 'Validate form input',
+            label: '验证表单输入',
             path: 'guide/forms/form-validation',
             contentPath: 'guide/forms/form-validation',
           },
           {
-            label: 'Building dynamic forms',
+            label: '绑定动态表单',
             path: 'guide/forms/dynamic-forms',
             contentPath: 'guide/forms/dynamic-forms',
           },
         ],
       },
       {
-        label: 'HTTP Client',
+        label: 'HTTP 客户端',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'guide/http',
             contentPath: 'guide/http/overview',
           },
           {
-            label: 'Setting up HttpClient',
+            label: '设置 HttpClient',
             path: 'guide/http/setup',
             contentPath: 'guide/http/setup',
           },
           {
-            label: 'Making requests',
+            label: '发起请求',
             path: 'guide/http/making-requests',
             contentPath: 'guide/http/making-requests',
           },
           {
-            label: 'Intercepting requests and responses',
+            label: '拦截请求与响应',
             path: 'guide/http/interceptors',
             contentPath: 'guide/http/interceptors',
           },
           {
-            label: 'Testing',
+            label: '测试',
             path: 'guide/http/testing',
             contentPath: 'guide/http/testing',
           },
         ],
       },
       {
-        label: 'Server-side & hybrid-rendering',
+        label: '服务端渲染与混合渲染',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'guide/performance',
             contentPath: 'guide/performance/overview',
           },
           {
-            label: 'Server-side and hybrid-rendering',
+            label: '服务端渲染与混合渲染',
             path: 'guide/ssr',
             contentPath: 'guide/ssr',
           },
           {
-            label: 'Hydration',
+            label: '水合',
             path: 'guide/hydration',
             contentPath: 'guide/hydration',
           },
           {
-            label: 'Incremental Hydration',
+            label: '增量水合',
             path: 'guide/incremental-hydration',
             contentPath: 'guide/incremental-hydration',
           },
         ],
       },
       {
-        label: 'Testing',
+        label: '测试',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'guide/testing',
             contentPath: 'guide/testing/overview',
           },
           {
-            label: 'Code coverage',
+            label: '测试覆盖率',
             path: 'guide/testing/code-coverage',
             contentPath: 'guide/testing/code-coverage',
           },
           {
-            label: 'Testing services',
+            label: '测试服务',
             path: 'guide/testing/services',
             contentPath: 'guide/testing/services',
           },
           {
-            label: 'Basics of testing components',
+            label: '组件测试基础',
             path: 'guide/testing/components-basics',
             contentPath: 'guide/testing/components-basics',
           },
           {
-            label: 'Component testing scenarios',
+            label: '组件测试场景',
             path: 'guide/testing/components-scenarios',
             contentPath: 'guide/testing/components-scenarios',
           },
           {
-            label: 'Testing attribute directives',
+            label: '测试属性型指令',
             path: 'guide/testing/attribute-directives',
             contentPath: 'guide/testing/attribute-directives',
           },
           {
-            label: 'Testing pipes',
+            label: '测试管道',
             path: 'guide/testing/pipes',
             contentPath: 'guide/testing/pipes',
           },
           {
-            label: 'Debugging tests',
+            label: '调试测试代码',
             path: 'guide/testing/debugging',
             contentPath: 'guide/testing/debugging',
           },
           {
-            label: 'Testing utility APIs',
+            label: '测试实用工具 API',
             path: 'guide/testing/utility-apis',
             contentPath: 'guide/testing/utility-apis',
           },
           {
-            label: 'Component harnesses overview',
+            label: '组件测试工具概览',
             path: 'guide/testing/component-harnesses-overview',
             contentPath: 'guide/testing/component-harnesses-overview',
           },
           {
-            label: 'Using component harnesses in tests',
+            label: '在测试中使用组件测试工具',
             path: 'guide/testing/using-component-harnesses',
             contentPath: 'guide/testing/using-component-harnesses',
           },
           {
-            label: 'Creating harnesses for your components',
+            label: '为你的组件创建组件测试工具',
             path: 'guide/testing/creating-component-harnesses',
             contentPath: 'guide/testing/creating-component-harnesses',
           },
           {
-            label: 'Adding harness support for additional testing environments',
+            label: '为其他测试环境添加组件测试工具的支持',
             path: 'guide/testing/component-harnesses-testing-environments',
             contentPath: 'guide/testing/component-harnesses-testing-environments',
           },
         ],
       },
       {
-        label: 'Internationalization',
+        label: '国际化',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'guide/i18n',
             contentPath: 'guide/i18n/overview',
           },
           {
-            label: 'Add the localize package',
+            label: '添加 localize 包',
             path: 'guide/i18n/add-package',
             contentPath: 'guide/i18n/add-package',
           },
           {
-            label: 'Refer to locales by ID',
+            label: '通过 ID 引用语言环境',
             path: 'guide/i18n/locale-id',
             contentPath: 'guide/i18n/locale-id',
           },
           {
-            label: 'Format data based on locale',
+            label: '基于语言环境格式化数据',
             path: 'guide/i18n/format-data-locale',
             contentPath: 'guide/i18n/format-data-locale',
           },
           {
-            label: 'Prepare component for translation',
+            label: '为翻译准备组件',
             path: 'guide/i18n/prepare',
             contentPath: 'guide/i18n/prepare',
           },
           {
-            label: 'Work with translation files',
+            label: '使用翻译结果文件',
             path: 'guide/i18n/translation-files',
             contentPath: 'guide/i18n/translation-files',
           },
           {
-            label: 'Merge translations into the app',
+            label: '把翻译结果并入应用',
             path: 'guide/i18n/merge',
             contentPath: 'guide/i18n/merge',
           },
           {
-            label: 'Deploy multiple locales',
+            label: '部署多个语言环境',
             path: 'guide/i18n/deploy',
             contentPath: 'guide/i18n/deploy',
           },
           {
-            label: 'Import global variants of the locale data',
+            label: '导入语言环境数据的全局变体',
             path: 'guide/i18n/import-global-variants',
             contentPath: 'guide/i18n/import-global-variants',
           },
           {
-            label: 'Manage marked text with custom IDs',
+            label: '使用自定义 ID 管理已标记的文本',
             path: 'guide/i18n/manage-marked-text',
             contentPath: 'guide/i18n/manage-marked-text',
           },
           {
-            label: 'Example Angular application',
+            label: '范例 Angular 应用',
             path: 'guide/i18n/example',
             contentPath: 'guide/i18n/example',
           },
         ],
       },
       {
-        label: 'Experimental features',
+        label: '试验特性',
         children: [
           {label: 'Zoneless', path: 'guide/experimental/zoneless', contentPath: 'guide/zoneless'},
         ],
@@ -582,177 +582,177 @@ const DOCS_SUB_NAVIGATION_DATA: NavigationItem[] = [
     ],
   },
   {
-    label: 'Developer Tools',
+    label: '开发者工具',
     children: [
       {
         label: 'Angular CLI',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'tools/cli',
             contentPath: 'tools/cli/overview',
           },
           {
-            label: 'Local set-up',
+            label: '本地安装',
             path: 'tools/cli/setup-local',
             contentPath: 'tools/cli/setup-local',
           },
           {
-            label: 'Building Angular apps',
+            label: '构建 Angular 应用',
             path: 'tools/cli/build',
             contentPath: 'tools/cli/build',
           },
           {
-            label: 'Serving Angular apps for development',
+            label: '为 Angular 应用启动开发服务器',
             path: 'tools/cli/serve',
             contentPath: 'tools/cli/serve',
           },
           {
-            label: 'Deployment',
+            label: '部署',
             path: 'tools/cli/deployment',
             contentPath: 'tools/cli/deployment',
           },
           {
-            label: 'End-to-End Testing',
+            label: '端到端测试',
             path: 'tools/cli/end-to-end',
             contentPath: 'tools/cli/end-to-end',
           },
           {
-            label: 'Migrating to new build system',
+            label: '迁移到新的构建体系',
             path: 'tools/cli/build-system-migration',
             contentPath: 'tools/cli/build-system-migration',
           },
           {
-            label: 'Build environments',
+            label: '构建环境',
             path: 'tools/cli/environments',
             contentPath: 'tools/cli/environments',
           },
           {
-            label: 'Angular CLI builders',
+            label: 'Angular CLI 构建器',
             path: 'tools/cli/cli-builder',
             contentPath: 'tools/cli/cli-builder',
           },
           {
-            label: 'Generating code using schematics',
+            label: '使用原理图生成代码',
             path: 'tools/cli/schematics',
             contentPath: 'tools/cli/schematics',
           },
           {
-            label: 'Authoring schematics',
+            label: '制作原理图',
             path: 'tools/cli/schematics-authoring',
             contentPath: 'tools/cli/schematics-authoring',
           },
           {
-            label: 'Schematics for libraries',
+            label: '各种库的原理图',
             path: 'tools/cli/schematics-for-libraries',
             contentPath: 'tools/cli/schematics-for-libraries',
           },
           {
-            label: 'Template type checking',
+            label: '模板类型检查',
             path: 'tools/cli/template-typecheck',
             contentPath: 'tools/cli/template-typecheck',
           },
           {
-            label: 'Ahead-of-time (AOT) compilation',
+            label: '预先编译（AOT）',
             path: 'tools/cli/aot-compiler',
             contentPath: 'tools/cli/aot-compiler',
           },
           {
-            label: 'AOT metadata errors',
+            label: 'AOT 元数据错误',
             path: 'tools/cli/aot-metadata-errors',
             contentPath: 'tools/cli/aot-metadata-errors',
           },
         ],
       },
       {
-        label: 'Libraries',
+        label: '库',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'tools/libraries',
             contentPath: 'tools/libraries/overview',
           },
           {
-            label: 'Creating Libraries',
+            label: '创建库',
             path: 'tools/libraries/creating-libraries',
             contentPath: 'tools/libraries/creating-libraries',
           },
           {
-            label: 'Using Libraries',
+            label: '使用库',
             path: 'tools/libraries/using-libraries',
             contentPath: 'tools/libraries/using-libraries',
           },
           {
-            label: 'Angular Package Format',
+            label: 'Angular 包格式',
             path: 'tools/libraries/angular-package-format',
             contentPath: 'tools/libraries/angular-package-format',
           },
         ],
       },
       {
-        label: 'DevTools',
+        label: '开发工具',
         path: 'tools/devtools',
         contentPath: 'tools/devtools',
       },
       {
-        label: 'Language Service',
+        label: '语言服务',
         path: 'tools/language-service',
         contentPath: 'tools/language-service',
       },
     ],
   },
   {
-    label: 'Best Practices',
+    label: '最佳实践',
     children: [
       {
-        label: 'Style Guide',
+        label: '风格指南',
         path: 'style-guide',
         contentPath: 'best-practices/style-guide',
       },
       {
-        label: 'Security',
+        label: '安全性',
         path: 'best-practices/security',
         contentPath: 'guide/security', // Have not refactored due to build issues
       },
       {
-        label: 'Accessibility',
+        label: '无障碍性',
         path: 'best-practices/a11y',
         contentPath: 'best-practices/a11y',
       },
       {
-        label: 'Performance',
+        label: '性能',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'best-practices/runtime-performance',
             contentPath: 'best-practices/runtime-performance/overview',
           },
           {
-            label: 'Zone pollution',
+            label: 'Zone 污染',
             path: 'best-practices/zone-pollution',
             contentPath: 'best-practices/runtime-performance/zone-pollution',
           },
           {
-            label: 'Slow computations',
+            label: '慢速计算',
             path: 'best-practices/slow-computations',
             contentPath: 'best-practices/runtime-performance/slow-computations',
           },
           {
-            label: 'Skipping component subtrees',
+            label: '跳过组件的子树',
             path: 'best-practices/skipping-subtrees',
             contentPath: 'best-practices/runtime-performance/skipping-subtrees',
           },
         ],
       },
       {
-        label: 'Keeping up-to-date',
+        label: '保持更新',
         path: 'update',
         contentPath: 'best-practices/update',
       },
     ],
   },
   {
-    label: 'Extended Ecosystem',
+    label: '扩展生态系统',
     children: [
       {
         label: 'NgModules',
@@ -760,97 +760,97 @@ const DOCS_SUB_NAVIGATION_DATA: NavigationItem[] = [
         contentPath: 'guide/ngmodules/overview',
       },
       {
-        label: 'Animations',
+        label: '动画',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'guide/animations',
             contentPath: 'guide/animations/overview',
           },
           {
-            label: 'Transition and Triggers',
+            label: '过渡动画与触发器',
             path: 'guide/animations/transition-and-triggers',
             contentPath: 'guide/animations/transition-and-triggers',
           },
           {
-            label: 'Complex Sequences',
+            label: '复杂序列',
             path: 'guide/animations/complex-sequences',
             contentPath: 'guide/animations/complex-sequences',
           },
           {
-            label: 'Reusable Animations',
+            label: '可复用动画',
             path: 'guide/animations/reusable-animations',
             contentPath: 'guide/animations/reusable-animations',
           },
           {
-            label: 'Route transition animations',
+            label: '路由过渡动画',
             path: 'guide/animations/route-animations',
             contentPath: 'guide/animations/route-animations',
           },
         ],
       },
       {
-        label: 'Using RxJS with Angular',
+        label: '在 Angular 中使用 RxJS',
         children: [
           {
-            label: 'Signals interop',
+            label: '与信号互操作',
             path: 'ecosystem/rxjs-interop',
             contentPath: 'ecosystem/rxjs-interop/signals-interop',
           },
           {
-            label: 'Component output interop',
+            label: '与组件的输出属性互操作',
             path: 'ecosystem/rxjs-interop/output-interop',
             contentPath: 'ecosystem/rxjs-interop/output-interop',
           },
         ],
       },
       {
-        label: 'Service Workers & PWAs',
+        label: 'Service Worker 与 PWA',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'ecosystem/service-workers',
             contentPath: 'ecosystem/service-workers/overview',
           },
           {
-            label: 'Getting started',
+            label: '快速上手',
             path: 'ecosystem/service-workers/getting-started',
             contentPath: 'ecosystem/service-workers/getting-started',
           },
           {
-            label: 'Configuration file',
+            label: '配置文件',
             path: 'ecosystem/service-workers/config',
             contentPath: 'ecosystem/service-workers/config',
           },
           {
-            label: 'Communicating with the service worker',
+            label: '与 Service Worker 通讯',
             path: 'ecosystem/service-workers/communications',
             contentPath: 'ecosystem/service-workers/communications',
           },
           {
-            label: 'Push notifications',
+            label: '推送通知',
             path: 'ecosystem/service-workers/push-notifications',
             contentPath: 'ecosystem/service-workers/push-notifications',
           },
           {
-            label: 'Service worker devops',
+            label: 'Service Worker 的 DevOps',
             path: 'ecosystem/service-workers/devops',
             contentPath: 'ecosystem/service-workers/devops',
           },
           {
-            label: 'App shell pattern',
+            label: 'App 外壳模式',
             path: 'ecosystem/service-workers/app-shell',
             contentPath: 'ecosystem/service-workers/app-shell',
           },
         ],
       },
       {
-        label: 'Web workers',
+        label: 'Web worker',
         path: 'ecosystem/web-workers',
         contentPath: 'ecosystem/web-workers',
       },
       {
-        label: 'Custom build pipeline',
+        label: '自定义构建流水线',
         path: 'ecosystem/custom-build-pipeline',
         contentPath: 'ecosystem/custom-build-pipeline',
       },
@@ -859,15 +859,15 @@ const DOCS_SUB_NAVIGATION_DATA: NavigationItem[] = [
         path: 'https://github.com/angular/angularfire#readme',
       },
       {
-        label: 'Google Maps',
+        label: 'Google 地图',
         path: 'https://github.com/angular/components/tree/main/src/google-maps#readme',
       },
       {
-        label: 'Google Pay',
+        label: 'Google 支付',
         path: 'https://github.com/google-pay/google-pay-button#angular',
       },
       {
-        label: 'YouTube player',
+        label: 'YouTube 播放器',
         path: 'https://github.com/angular/components/blob/main/src/youtube-player/README.md',
       },
       {
@@ -889,35 +889,35 @@ export const TUTORIALS_SUB_NAVIGATION_DATA: NavigationItem[] = [
   {
     path: DefaultPage.TUTORIALS,
     contentPath: 'tutorials/home',
-    label: 'Tutorials',
+    label: '教程',
   },
 ];
 
 const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [
   {
-    label: 'Roadmap',
+    label: '路线图',
     path: 'roadmap',
     contentPath: 'reference/roadmap',
   },
   {
-    label: 'Get involved',
+    label: '参与开发',
     path: 'https://github.com/angular/angular/blob/main/CONTRIBUTING.md',
   },
   {
-    label: 'API Reference',
+    label: 'API 参考手册',
     children: [
       {
-        label: 'Overview',
+        label: '概览',
         path: 'api',
       },
       ...getApiNavigationItems(),
     ],
   },
   {
-    label: 'CLI Reference',
+    label: 'CLI 参考手册',
     children: [
       {
-        label: 'Overview',
+        label: '概览',
         path: 'cli',
         contentPath: 'reference/cli',
       },
@@ -929,7 +929,7 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [
         label: 'ng analytics',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'cli/analytics',
           },
           {
@@ -958,7 +958,7 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [
         label: 'ng cache',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'cli/cache',
           },
           {
@@ -983,7 +983,7 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [
         label: 'ng completion',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'cli/completion',
           },
           {
@@ -1012,7 +1012,7 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [
         label: 'ng generate',
         children: [
           {
-            label: 'Overview',
+            label: '概览',
             path: 'cli/generate',
           },
           {
@@ -1120,10 +1120,10 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [
     ],
   },
   {
-    label: 'Error Encyclopedia',
+    label: '错误百科',
     children: [
       {
-        label: 'Overview',
+        label: '概览',
         path: 'errors',
         contentPath: 'reference/errors/overview',
       },
@@ -1131,10 +1131,10 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [
     ],
   },
   {
-    label: 'Extended Diagnostics',
+    label: '扩展诊断',
     children: [
       {
-        label: 'Overview',
+        label: '概览',
         path: 'extended-diagnostics',
         contentPath: 'reference/extended-diagnostics/overview',
       },
@@ -1142,94 +1142,94 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [
     ],
   },
   {
-    label: 'Versioning and releases',
+    label: '版本与发布',
     path: 'reference/releases',
     contentPath: 'reference/releases',
   },
   {
-    label: 'Version compatibility',
+    label: '版本兼容性',
     path: 'reference/versions',
     contentPath: 'reference/versions',
   },
   {
-    label: 'Update guide',
+    label: '更新指南',
     path: 'update-guide',
   },
   {
-    label: 'Configurations',
+    label: '配置',
     children: [
       {
-        label: 'File structure',
+        label: '文件结构',
         path: 'reference/configs/file-structure',
         contentPath: 'reference/configs/file-structure',
       },
       {
-        label: 'Workspace configuration',
+        label: '工作区配置',
         path: 'reference/configs/workspace-config',
         contentPath: 'reference/configs/workspace-config',
       },
       {
-        label: 'Angular compiler options',
+        label: 'Angular 编译器选项',
         path: 'reference/configs/angular-compiler-options',
         contentPath: 'reference/configs/angular-compiler-options',
       },
       {
-        label: 'npm dependencies',
+        label: 'npm 依赖',
         path: 'reference/configs/npm-packages',
         contentPath: 'reference/configs/npm-packages',
       },
     ],
   },
   {
-    label: 'Migrations',
+    label: '迁移',
     children: [
       {
-        label: 'Overview',
+        label: '概览',
         path: 'reference/migrations',
         contentPath: 'reference/migrations/overview',
       },
       {
-        label: 'Standalone',
+        label: '独立版',
         path: 'reference/migrations/standalone',
         contentPath: 'reference/migrations/standalone',
       },
       {
-        label: 'Control Flow Syntax',
+        label: '控制流语法',
         path: 'reference/migrations/control-flow',
         contentPath: 'reference/migrations/control-flow',
       },
       {
-        label: 'inject() Function',
+        label: 'inject() 函数',
         path: 'reference/migrations/inject-function',
         contentPath: 'reference/migrations/inject-function',
       },
       {
-        label: 'Lazy-loaded routes',
+        label: '惰性加载路由',
         path: 'reference/migrations/route-lazy-loading',
         contentPath: 'reference/migrations/route-lazy-loading',
       },
       {
-        label: 'Signal inputs',
+        label: '信号型输入属性',
         path: 'reference/migrations/signal-inputs',
         contentPath: 'reference/migrations/signal-inputs',
       },
       {
-        label: 'Outputs',
+        label: '输出属性',
         path: 'reference/migrations/outputs',
         contentPath: 'reference/migrations/outputs',
       },
       {
-        label: 'Signal queries',
+        label: '信号型查询',
         path: 'reference/migrations/signal-queries',
         contentPath: 'reference/migrations/signal-queries',
       },
       {
-        label: 'Clean up unused imports',
+        label: '清理未用导入',
         path: 'reference/migrations/cleanup-unused-imports',
         contentPath: 'reference/migrations/cleanup-unused-imports',
       },
       {
-        label: 'Self-closing tags',
+        label: '自闭合标签',
         path: 'reference/migrations/self-closing-tags',
         contentPath: 'reference/migrations/self-closing-tags',
       },
@@ -1239,12 +1239,12 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [
 
 const FOOTER_NAVIGATION_DATA: NavigationItem[] = [
   {
-    label: 'Press Kit',
+    label: '宣传资料',
     path: 'press-kit',
     contentPath: 'reference/press-kit',
   },
   {
-    label: 'License',
+    label: '授权方式',
     path: 'license',
     contentPath: 'reference/license',
   },
diff --git a/adev/src/assets/css/BUILD.bazel b/adev/src/assets/css/BUILD.bazel
new file mode 100644
index 000000000000..cf99460840db
--- /dev/null
+++ b/adev/src/assets/css/BUILD.bazel
@@ -0,0 +1,13 @@
+load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin")
+
+exports_files(
+    glob(["*"]),
+)
+
+copy_to_bin(
+    name = "css",
+    srcs = glob(["*"]),
+    visibility = [
+        "//visibility:public",
+    ],
+)
diff --git a/adev/src/assets/css/be-vietnam-pro.css b/adev/src/assets/css/be-vietnam-pro.css
new file mode 100644
index 000000000000..f55c776207d9
--- /dev/null
+++ b/adev/src/assets/css/be-vietnam-pro.css
@@ -0,0 +1,28 @@
+@font-face {
+  font-family: 'Be Vietnam Pro';
+  font-style: italic;
+  font-weight: 400;
+  font-display: swap;
+  src: url(../fonts/QdVNSTAyLFyeg_IDWvOJmVES_HwyBX8.ttf) format('truetype');
+}
+@font-face {
+  font-family: 'Be Vietnam Pro';
+  font-style: italic;
+  font-weight: 700;
+  font-display: swap;
+  src: url(../fonts/QdVKSTAyLFyeg_IDWvOJmVES_HwyPcM3Rbg.ttf) format('truetype');
+}
+@font-face {
+  font-family: 'Be Vietnam Pro';
+  font-style: normal;
+  font-weight: 400;
+  font-display: swap;
+  src: url(../fonts/QdVPSTAyLFyeg_IDWvOJmVES_Eww.ttf) format('truetype');
+}
+@font-face {
+  font-family: 'Be Vietnam Pro';
+  font-style: normal;
+  font-weight: 700;
+  font-display: swap;
+  src: url(../fonts/QdVMSTAyLFyeg_IDWvOJmVES_HSMIF8y.ttf) format('truetype');
+}
diff --git a/adev/src/assets/css/material-symbols.css b/adev/src/assets/css/material-symbols.css
new file mode 100644
index 000000000000..26686f5696ac
--- /dev/null
+++ b/adev/src/assets/css/material-symbols.css
@@ -0,0 +1,20 @@
+@font-face {
+  font-family: 'Material Symbols Outlined';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fonts/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOem.ttf) format('truetype');
+}
+
+.material-symbols-outlined {
+  font-family: 'Material Symbols Outlined';
+  font-weight: normal;
+  font-style: normal;
+  font-size: 24px;
+  line-height: 1;
+  letter-spacing: normal;
+  text-transform: none;
+  display: inline-block;
+  white-space: nowrap;
+  word-wrap: normal;
+  direction: ltr;
+}
diff --git a/adev/src/assets/css/mono.css b/adev/src/assets/css/mono.css
new file mode 100644
index 000000000000..db745cacf297
--- /dev/null
+++ b/adev/src/assets/css/mono.css
@@ -0,0 +1,49 @@
+@font-face {
+  font-family: 'DM Mono';
+  font-style: italic;
+  font-weight: 400;
+  font-display: swap;
+  src: url(../fonts/aFTW7PB1QTsUX8KYth-QAQ.ttf) format('truetype');
+}
+@font-face {
+  font-family: 'DM Mono';
+  font-style: normal;
+  font-weight: 400;
+  font-display: swap;
+  src: url(../fonts/aFTU7PB1QTsUX8KYhh0.ttf) format('truetype');
+}
+@font-face {
+  font-family: 'Inter';
+  font-style: normal;
+  font-weight: 400;
+  font-display: swap;
+  src: url(../fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZg.ttf) format('truetype');
+}
+@font-face {
+  font-family: 'Inter';
+  font-style: normal;
+  font-weight: 500;
+  font-display: swap;
+  src: url(../fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZg.ttf) format('truetype');
+}
+@font-face {
+  font-family: 'Inter';
+  font-style: normal;
+  font-weight: 600;
+  font-display: swap;
+  src: url(../fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuGKYMZg.ttf) format('truetype');
+}
+@font-face {
+  font-family: 'Inter Tight';
+  font-style: normal;
+  font-weight: 500;
+  font-display: swap;
+  src: url(../fonts/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjPQ-qXA.ttf) format('truetype');
+}
+@font-face {
+  font-family: 'Inter Tight';
+  font-style: normal;
+  font-weight: 600;
+  font-display: swap;
+  src: url(../fonts/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mj0QiqXA.ttf) format('truetype');
+}
diff --git a/adev/src/assets/fonts/BUILD.bazel b/adev/src/assets/fonts/BUILD.bazel
new file mode 100644
index 000000000000..3e84cf39c483
--- /dev/null
+++ b/adev/src/assets/fonts/BUILD.bazel
@@ -0,0 +1,13 @@
+load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin")
+
+exports_files(
+    glob(["*"]),
+)
+
+copy_to_bin(
+    name = "fonts",
+    srcs = glob(["*"]),
+    visibility = [
+        "//visibility:public",
+    ],
+)
diff --git a/adev/src/assets/fonts/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mj0QiqXA.ttf b/adev/src/assets/fonts/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mj0QiqXA.ttf
new file mode 100644
index 000000000000..508ac1ddea62
Binary files /dev/null and b/adev/src/assets/fonts/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mj0QiqXA.ttf differ
diff --git a/adev/src/assets/fonts/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjPQ-qXA.ttf b/adev/src/assets/fonts/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjPQ-qXA.ttf
new file mode 100644
index 000000000000..169af650eeaa
Binary files /dev/null and b/adev/src/assets/fonts/NGSnv5HMAFg6IuGlBNMjxJEL2VmU3NS7Z2mjPQ-qXA.ttf differ
diff --git a/adev/src/assets/fonts/QdVKSTAyLFyeg_IDWvOJmVES_HwyPcM3Rbg.ttf b/adev/src/assets/fonts/QdVKSTAyLFyeg_IDWvOJmVES_HwyPcM3Rbg.ttf
new file mode 100644
index 000000000000..7a0deea3d7a5
Binary files /dev/null and b/adev/src/assets/fonts/QdVKSTAyLFyeg_IDWvOJmVES_HwyPcM3Rbg.ttf differ
diff --git a/adev/src/assets/fonts/QdVMSTAyLFyeg_IDWvOJmVES_HSMIF8y.ttf b/adev/src/assets/fonts/QdVMSTAyLFyeg_IDWvOJmVES_HSMIF8y.ttf
new file mode 100644
index 000000000000..f339cbf536f1
Binary files /dev/null and b/adev/src/assets/fonts/QdVMSTAyLFyeg_IDWvOJmVES_HSMIF8y.ttf differ
diff --git a/adev/src/assets/fonts/QdVNSTAyLFyeg_IDWvOJmVES_HwyBX8.ttf b/adev/src/assets/fonts/QdVNSTAyLFyeg_IDWvOJmVES_HwyBX8.ttf
new file mode 100644
index 000000000000..217b8bce1f8b
Binary files /dev/null and b/adev/src/assets/fonts/QdVNSTAyLFyeg_IDWvOJmVES_HwyBX8.ttf differ
diff --git a/adev/src/assets/fonts/QdVPSTAyLFyeg_IDWvOJmVES_Eww.ttf b/adev/src/assets/fonts/QdVPSTAyLFyeg_IDWvOJmVES_Eww.ttf
new file mode 100644
index 000000000000..9938869329dd
Binary files /dev/null and b/adev/src/assets/fonts/QdVPSTAyLFyeg_IDWvOJmVES_Eww.ttf differ
diff --git a/adev/src/assets/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuGKYMZg.ttf b/adev/src/assets/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuGKYMZg.ttf
new file mode 100644
index 000000000000..1afb7e7e39cb
Binary files /dev/null and b/adev/src/assets/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuGKYMZg.ttf differ
diff --git a/adev/src/assets/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZg.ttf b/adev/src/assets/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZg.ttf
new file mode 100644
index 000000000000..b742021a5bb6
Binary files /dev/null and b/adev/src/assets/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZg.ttf differ
diff --git a/adev/src/assets/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZg.ttf b/adev/src/assets/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZg.ttf
new file mode 100644
index 000000000000..311776c5b6c1
Binary files /dev/null and b/adev/src/assets/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZg.ttf differ
diff --git a/adev/src/assets/fonts/aFTU7PB1QTsUX8KYhh0.ttf b/adev/src/assets/fonts/aFTU7PB1QTsUX8KYhh0.ttf
new file mode 100644
index 000000000000..3285a14bd59a
Binary files /dev/null and b/adev/src/assets/fonts/aFTU7PB1QTsUX8KYhh0.ttf differ
diff --git a/adev/src/assets/fonts/aFTW7PB1QTsUX8KYth-QAQ.ttf b/adev/src/assets/fonts/aFTW7PB1QTsUX8KYth-QAQ.ttf
new file mode 100644
index 000000000000..fef3a0dae419
Binary files /dev/null and b/adev/src/assets/fonts/aFTW7PB1QTsUX8KYth-QAQ.ttf differ
diff --git a/adev/src/assets/fonts/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOem.ttf b/adev/src/assets/fonts/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOem.ttf
new file mode 100644
index 000000000000..25ae9c46d812
Binary files /dev/null and b/adev/src/assets/fonts/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOem.ttf differ
diff --git a/adev/src/content/examples/accessibility/src/app/app.component.html b/adev/src/content/examples/accessibility/src/app/app.component.html
index 69984ba3d0bf..3253857478ef 100755
--- a/adev/src/content/examples/accessibility/src/app/app.component.html
+++ b/adev/src/content/examples/accessibility/src/app/app.component.html
@@ -7,7 +7,7 @@ <h1>Accessibility Example</h1>
 </label>
 
 <!-- The user of the progressbar sets an aria-label to communicate what the progress means. -->
-<app-example-progressbar [value]="progress" aria-label="Example of a progress bar">
+<app-example-progressbar [value]="progress" aria-label="进度条范例">
 </app-example-progressbar>
 <!-- #enddocregion template -->
 
diff --git a/adev/src/content/tutorials/first-app/steps/01-hello-world/src/index.html b/adev/src/content/tutorials/first-app/steps/01-hello-world/src/index.html
index fb82dcc0fd8f..e5814c1f4bdb 100644
--- a/adev/src/content/tutorials/first-app/steps/01-hello-world/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/01-hello-world/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/02-HomeComponent/src/index.html b/adev/src/content/tutorials/first-app/steps/02-HomeComponent/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/02-HomeComponent/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/02-HomeComponent/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/03-HousingLocation/src/index.html b/adev/src/content/tutorials/first-app/steps/03-HousingLocation/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/03-HousingLocation/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/03-HousingLocation/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/04-interfaces/src/index.html b/adev/src/content/tutorials/first-app/steps/04-interfaces/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/04-interfaces/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/04-interfaces/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/05-inputs/src/index.html b/adev/src/content/tutorials/first-app/steps/05-inputs/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/05-inputs/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/05-inputs/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/06-property-binding/src/index.html b/adev/src/content/tutorials/first-app/steps/06-property-binding/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/06-property-binding/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/06-property-binding/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/07-dynamic-template-values/src/index.html b/adev/src/content/tutorials/first-app/steps/07-dynamic-template-values/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/07-dynamic-template-values/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/07-dynamic-template-values/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/08-ngFor/src/index.html b/adev/src/content/tutorials/first-app/steps/08-ngFor/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/08-ngFor/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/08-ngFor/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/09-services/src/index.html b/adev/src/content/tutorials/first-app/steps/09-services/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/09-services/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/09-services/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/10-routing/src/index.html b/adev/src/content/tutorials/first-app/steps/10-routing/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/10-routing/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/10-routing/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/11-details-page/src/index.html b/adev/src/content/tutorials/first-app/steps/11-details-page/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/11-details-page/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/11-details-page/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/12-forms/src/index.html b/adev/src/content/tutorials/first-app/steps/12-forms/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/12-forms/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/12-forms/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/13-search/src/index.html b/adev/src/content/tutorials/first-app/steps/13-search/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/13-search/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/13-search/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/14-http/src-final/index.html b/adev/src/content/tutorials/first-app/steps/14-http/src-final/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/14-http/src-final/index.html
+++ b/adev/src/content/tutorials/first-app/steps/14-http/src-final/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/first-app/steps/14-http/src/index.html b/adev/src/content/tutorials/first-app/steps/14-http/src/index.html
index b8658772264e..7ce4f6eb0a15 100644
--- a/adev/src/content/tutorials/first-app/steps/14-http/src/index.html
+++ b/adev/src/content/tutorials/first-app/steps/14-http/src/index.html
@@ -6,7 +6,7 @@
   <base href="/">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link href="/assets/css/be-vietnam-pro.css" rel="stylesheet">
 </head>
 <body>
   <app-root></app-root>
diff --git a/adev/src/content/tutorials/learn-angular/intro/config.json b/adev/src/content/tutorials/learn-angular/intro/config.json
index 42787daaadd4..ecf0b2481ff7 100644
--- a/adev/src/content/tutorials/learn-angular/intro/config.json
+++ b/adev/src/content/tutorials/learn-angular/intro/config.json
@@ -1,5 +1,5 @@
 {
-  "title": "Learn Angular",
+  "title": "学习 Angular",
   "type": "editor",
   "nextTutorial": "first-app",
   "openFiles": ["src/app/app.component.ts"]
diff --git a/adev/src/content/tutorials/learn-angular/steps/1-components-in-angular/config.json b/adev/src/content/tutorials/learn-angular/steps/1-components-in-angular/config.json
index aef1553bcd9c..ec8a6d2c3851 100644
--- a/adev/src/content/tutorials/learn-angular/steps/1-components-in-angular/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/1-components-in-angular/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
   "type": "editor",
-  "title": "Anatomy of a Component"
+  "title": "组件的结构"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/10-deferrable-views/config.json b/adev/src/content/tutorials/learn-angular/steps/10-deferrable-views/config.json
index be9a50210d61..61f7053dea75 100644
--- a/adev/src/content/tutorials/learn-angular/steps/10-deferrable-views/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/10-deferrable-views/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts", "src/app/comments.component.ts"],
-  "title": "Deferrable views",
+  "title": "可延迟视图",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/11-optimizing-images/config.json b/adev/src/content/tutorials/learn-angular/steps/11-optimizing-images/config.json
index b80a4e9621b8..6641ebf9f3d0 100644
--- a/adev/src/content/tutorials/learn-angular/steps/11-optimizing-images/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/11-optimizing-images/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/user.component.ts"],
-  "title": "Optimizing images",
+  "title": "优化图片",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/config.json b/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/config.json
index 71d839e38069..a35071f8fff4 100644
--- a/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.routes.ts", "src/app/app.component.ts", "src/app/app.config.ts"],
-  "title": "Enabling routing",
+  "title": "启用路由",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/13-define-a-route/config.json b/adev/src/content/tutorials/learn-angular/steps/13-define-a-route/config.json
index 431e738a8ba2..e37b8d12480d 100644
--- a/adev/src/content/tutorials/learn-angular/steps/13-define-a-route/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/13-define-a-route/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.routes.ts", "src/app/home/home.component.ts"],
-  "title": "Define a route",
+  "title": "定义路由",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/14-routerLink/config.json b/adev/src/content/tutorials/learn-angular/steps/14-routerLink/config.json
index da11eb0913b2..1bfe084851bc 100644
--- a/adev/src/content/tutorials/learn-angular/steps/14-routerLink/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/14-routerLink/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
-  "title": "Link to a route with RouterLink",
+  "title": "使用 RouterLink 链接到路由",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/15-forms/config.json b/adev/src/content/tutorials/learn-angular/steps/15-forms/config.json
index 60b676958c1c..6d21f455a53b 100644
--- a/adev/src/content/tutorials/learn-angular/steps/15-forms/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/15-forms/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/user.component.ts"],
-  "title": "Forms",
+  "title": "表单",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/config.json b/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/config.json
index 3e44ff94bd16..9dd13881287e 100644
--- a/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/user.component.ts"],
-  "title": "Getting form control values",
+  "title": "获取表单控件值",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/config.json b/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/config.json
index 094eae8233c9..48db890bc7f9 100644
--- a/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
-  "title": "Reactive forms",
+  "title": "响应式表单",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/18-forms-validation/config.json b/adev/src/content/tutorials/learn-angular/steps/18-forms-validation/config.json
index 5b6bd3f9499b..60f9117aa3a2 100644
--- a/adev/src/content/tutorials/learn-angular/steps/18-forms-validation/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/18-forms-validation/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
-  "title": "Validating forms",
+  "title": "表单验证",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/19-creating-an-injectable-service/config.json b/adev/src/content/tutorials/learn-angular/steps/19-creating-an-injectable-service/config.json
index 39c0797d029b..ce3da9bfcb11 100644
--- a/adev/src/content/tutorials/learn-angular/steps/19-creating-an-injectable-service/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/19-creating-an-injectable-service/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/car.service.ts", "src/app/app.component.ts"],
-  "title": "Creating an injectable service",
+  "title": "创建可注入服务",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/2-updating-the-component-class/config.json b/adev/src/content/tutorials/learn-angular/steps/2-updating-the-component-class/config.json
index 0b57a203f6ce..e825a004712d 100644
--- a/adev/src/content/tutorials/learn-angular/steps/2-updating-the-component-class/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/2-updating-the-component-class/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
   "type": "editor",
-  "title": "Updating the component"
+  "title": "更新组件"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/20-inject-based-di/config.json b/adev/src/content/tutorials/learn-angular/steps/20-inject-based-di/config.json
index dbd92d54adc0..76798cd648f0 100644
--- a/adev/src/content/tutorials/learn-angular/steps/20-inject-based-di/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/20-inject-based-di/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/car.service.ts", "src/app/app.component.ts"],
-  "title": "Inject-based dependency injection",
+  "title": "基于 Inject 的依赖注入",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/21-constructor-based-di/config.json b/adev/src/content/tutorials/learn-angular/steps/21-constructor-based-di/config.json
index 04758f70a91c..9bb647e79a80 100644
--- a/adev/src/content/tutorials/learn-angular/steps/21-constructor-based-di/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/21-constructor-based-di/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/car.service.ts", "src/app/app.component.ts"],
-  "title": "Constructor-based dependency injection",
+  "title": "基于构造函数的依赖注入",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/22-pipes/config.json b/adev/src/content/tutorials/learn-angular/steps/22-pipes/config.json
index 132b2ea912a2..dc963b1f1c6f 100644
--- a/adev/src/content/tutorials/learn-angular/steps/22-pipes/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/22-pipes/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
-  "title": "Pipes",
+  "title": "管道",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/23-pipes-format-data/config.json b/adev/src/content/tutorials/learn-angular/steps/23-pipes-format-data/config.json
index b6240ea04e51..691d5e62572a 100644
--- a/adev/src/content/tutorials/learn-angular/steps/23-pipes-format-data/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/23-pipes-format-data/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
-  "title": "Formatting data with pipes",
+  "title": "使用管道格式化数据",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/24-create-a-pipe/config.json b/adev/src/content/tutorials/learn-angular/steps/24-create-a-pipe/config.json
index eaa7f52ccabc..524a0c2739c8 100644
--- a/adev/src/content/tutorials/learn-angular/steps/24-create-a-pipe/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/24-create-a-pipe/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts", "src/app/reverse.pipe.ts"],
-  "title": "Create a pipe",
+  "title": "创建管道",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/25-next-steps/config.json b/adev/src/content/tutorials/learn-angular/steps/25-next-steps/config.json
index e579515e0392..e654cb770f66 100644
--- a/adev/src/content/tutorials/learn-angular/steps/25-next-steps/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/25-next-steps/config.json
@@ -1,3 +1,3 @@
 {
-  "title": "Next steps"
+  "title": "下一步"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/3-composing-components/config.json b/adev/src/content/tutorials/learn-angular/steps/3-composing-components/config.json
index 07b0847fc2e1..0dbe332b456a 100644
--- a/adev/src/content/tutorials/learn-angular/steps/3-composing-components/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/3-composing-components/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
   "type": "editor",
-  "title": "Component composition"
+  "title": "组件组合"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/4-control-flow-if/config.json b/adev/src/content/tutorials/learn-angular/steps/4-control-flow-if/config.json
index e92cca6e35e3..e7ffbcc18ddc 100644
--- a/adev/src/content/tutorials/learn-angular/steps/4-control-flow-if/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/4-control-flow-if/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
-  "title": "Control flow in components - @if",
+  "title": "组件中的控制流 - @if",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/5-control-flow-for/config.json b/adev/src/content/tutorials/learn-angular/steps/5-control-flow-for/config.json
index 4ada9755c37f..fa3e636d5ef3 100644
--- a/adev/src/content/tutorials/learn-angular/steps/5-control-flow-for/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/5-control-flow-for/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
-  "title": "Control flow - @for",
+  "title": "控制流 - @for",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/6-property-binding/config.json b/adev/src/content/tutorials/learn-angular/steps/6-property-binding/config.json
index 41d1bb84625d..da9a4d8af90b 100644
--- a/adev/src/content/tutorials/learn-angular/steps/6-property-binding/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/6-property-binding/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
-  "title": "Property Binding",
+  "title": "属性绑定",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/7-event-handling/config.json b/adev/src/content/tutorials/learn-angular/steps/7-event-handling/config.json
index 758f57c7babc..d4c617609f26 100644
--- a/adev/src/content/tutorials/learn-angular/steps/7-event-handling/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/7-event-handling/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/app.component.ts"],
-  "title": "Event handling",
+  "title": "事件处理",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/8-input/config.json b/adev/src/content/tutorials/learn-angular/steps/8-input/config.json
index 4f30e801ecb4..a0c069fbdddf 100644
--- a/adev/src/content/tutorials/learn-angular/steps/8-input/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/8-input/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/user.component.ts", "src/app/app.component.ts"],
-  "title": "Communicating with @Input",
+  "title": "使用 @Input 进行通信",
   "type": "editor"
 }
diff --git a/adev/src/content/tutorials/learn-angular/steps/9-output/config.json b/adev/src/content/tutorials/learn-angular/steps/9-output/config.json
index 5f0713577714..4330c856cbfd 100644
--- a/adev/src/content/tutorials/learn-angular/steps/9-output/config.json
+++ b/adev/src/content/tutorials/learn-angular/steps/9-output/config.json
@@ -1,5 +1,5 @@
 {
   "openFiles": ["src/app/child.component.ts", "src/app/app.component.ts"],
-  "title": "Communicating with @Output",
+  "title": "使用 @Output 进行通信",
   "type": "editor"
 }
diff --git a/adev/src/index.html b/adev/src/index.html
index 4b15ccb87c80..fd6cecfc5e6b 100644
--- a/adev/src/index.html
+++ b/adev/src/index.html
@@ -68,33 +68,27 @@
 
     <!-- Open Graph / Facebook -->
     <meta property="og:type" content="website" />
-    <meta property="og:url" content="https://angular.dev/" />
+    <meta property="og:url" content="https://angular.cn/" />
     <meta property="og:title" content="Angular" />
     <meta
       property="og:description"
       content="The web development framework for building modern apps."
     />
-    <meta property="og:image" content="https://angular.dev/assets/images/ng-image.jpg" />
+    <meta property="og:image" content="https://angular.cn/assets/images/ng-image.jpg" />
 
     <!-- Twitter -->
     <meta property="twitter:card" content="summary_large_image" />
-    <meta property="twitter:url" content="https://angular.dev/" />
+    <meta property="twitter:url" content="https://angular.cn/" />
     <meta property="twitter:title" content="Angular" />
     <meta
       property="twitter:description"
       content="The web development framework for building modern apps."
     />
-    <meta property="twitter:image" content="https://angular.dev/assets/images/ng-image.jpg" />
+    <meta property="twitter:image" content="https://angular.cn/assets/images/ng-image.jpg" />
 
     <!-- Fonts -->
-    <link
-      href="https://fonts.googleapis.com/css2?family=Inter+Tight:wght@500;600&family=Inter:wght@400;500;600&family=DM+Mono:ital@0;1&display=swap"
-      rel="stylesheet"
-    />
-    <link
-      href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0"
-      rel="stylesheet"
-    />
+    <link href="/assets/css/mono.css" rel="stylesheet" />
+    <link href="/assets/css/material-symbols.css" rel="stylesheet" />
   </head>
   <body class="mat-typography docs-scroll-track-transparent-large">
     <adev-root></adev-root>
diff --git a/package.json b/package.json
index e78db4bfe233..0cae2a5f81f7 100644
--- a/package.json
+++ b/package.json
@@ -43,6 +43,11 @@
     "devtools:test": "bazelisk test --//devtools/projects/shell-browser/src:flag_browser=chrome -- //devtools/...",
     "docs": "[[ -n $CI ]] && echo 'Cannot run this yarn script on CI' && exit 1 || yarn ibazel run //adev:serve",
     "docs:build": "[[ -n $CI ]] && echo 'Cannot run this yarn script on CI' && exit 1 || yarn bazel build //adev:build",
+    "docs:build-release": "yarn bazel build //adev:build --full_build_adev --config=release",
+    "docs:writable": "sudo chmod +w -R dist/bin/adev/build/browser",
+    "docs:remove-prerender": "cd dist/bin/adev/build/browser && find . -type f -name \"index.html\" | grep -v \"/assets/\" | xargs rm -f && mv index.csr.html index.html",
+    "docs:copy-to-host": " rsync -avmr dist/bin/adev/build/browser/ /mnt/f/work/translation/v19.angular.cn-csr",
+    "docs:build-local": "npm run docs:build-release && npm run docs:writable && npm run docs:remove-prerender && npm run docs:copy-to-host",
     "benchmarks": "tsx --tsconfig=scripts/tsconfig.json scripts/benchmarks/index.mts"
   },
   "// 1": "dependencies are used locally and by bazel",
diff --git a/packages/core/src/linker/component_factory.ts b/packages/core/src/linker/component_factory.ts
index 9b4acb02971d..1f19bb55857e 100644
--- a/packages/core/src/linker/component_factory.ts
+++ b/packages/core/src/linker/component_factory.ts
@@ -99,7 +99,7 @@ export abstract class ComponentFactory<C> {
    */
   abstract get componentType(): Type<any>;
   /**
-   * Selector for all <ng-content> elements in the component.
+   * Selector for all &lt;ng-content&gt; elements in the component.
    */
   abstract get ngContentSelectors(): string[];
   /**
diff --git a/packages/core/src/render3/component.ts b/packages/core/src/render3/component.ts
index 7d884988fc5b..042107107010 100644
--- a/packages/core/src/render3/component.ts
+++ b/packages/core/src/render3/component.ts
@@ -134,7 +134,7 @@ export interface ComponentMirror<C> {
    */
   get outputs(): ReadonlyArray<{readonly propName: string; readonly templateName: string}>;
   /**
-   * Selector for all <ng-content> elements in the component.
+   * Selector for all &lt;ng-content&gt; elements in the component.
    */
   get ngContentSelectors(): ReadonlyArray<string>;
   /**
