1
0
Эх сурвалжийг харах

polish translations and fix some bugs introduced

Jason Song 5 жил өмнө
parent
commit
59d92f6b62
43 өөрчлөгдсөн 650 нэмэгдсэн , 635 устгасан
  1. 1 0
      apollo-common/src/main/java/com/ctrip/framework/apollo/common/controller/WebMvcConfig.java
  2. 1 1
      apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/AppDTO.java
  3. 1 1
      apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ClusterDTO.java
  4. 1 1
      apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/NamespaceDTO.java
  5. 1 1
      apollo-common/src/main/java/com/ctrip/framework/apollo/common/entity/AppNamespace.java
  6. 2 2
      apollo-common/src/main/java/com/ctrip/framework/apollo/common/utils/InputValidator.java
  7. 1 1
      apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/v1/controller/ClusterController.java
  8. 1 1
      apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/v1/controller/NamespaceController.java
  9. 1 1
      apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/NamespaceController.java
  10. 3 3
      apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/PermissionController.java
  11. 1 1
      apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/model/AppModel.java
  12. 7 7
      apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/util/RelativeDateFormat.java
  13. 1 1
      apollo-portal/src/main/resources/static/app.html
  14. 1 1
      apollo-portal/src/main/resources/static/app/setting.html
  15. 1 1
      apollo-portal/src/main/resources/static/cluster.html
  16. 1 1
      apollo-portal/src/main/resources/static/config.html
  17. 6 6
      apollo-portal/src/main/resources/static/config/history.html
  18. 407 402
      apollo-portal/src/main/resources/static/i18n/en.json
  19. 65 60
      apollo-portal/src/main/resources/static/i18n/zh-CN.json
  20. 3 7
      apollo-portal/src/main/resources/static/index.html
  21. 5 5
      apollo-portal/src/main/resources/static/namespace.html
  22. 3 3
      apollo-portal/src/main/resources/static/namespace/role.html
  23. 2 2
      apollo-portal/src/main/resources/static/scripts/AppUtils.js
  24. 8 4
      apollo-portal/src/main/resources/static/scripts/app.js
  25. 3 3
      apollo-portal/src/main/resources/static/scripts/controller/AppController.js
  26. 3 3
      apollo-portal/src/main/resources/static/scripts/controller/DeleteAppClusterNamespaceController.js
  27. 4 2
      apollo-portal/src/main/resources/static/scripts/controller/LoginController.js
  28. 1 1
      apollo-portal/src/main/resources/static/scripts/controller/NamespaceController.js
  29. 5 5
      apollo-portal/src/main/resources/static/scripts/controller/ServerConfigController.js
  30. 4 4
      apollo-portal/src/main/resources/static/scripts/controller/SettingController.js
  31. 2 2
      apollo-portal/src/main/resources/static/scripts/controller/config/ConfigBaseInfoController.js
  32. 3 3
      apollo-portal/src/main/resources/static/scripts/controller/open/OpenManageController.js
  33. 39 37
      apollo-portal/src/main/resources/static/scripts/directive/directive.js
  34. 1 1
      apollo-portal/src/main/resources/static/scripts/directive/item-modal-directive.js
  35. 2 2
      apollo-portal/src/main/resources/static/scripts/directive/namespace-panel-directive.js
  36. 7 7
      apollo-portal/src/main/resources/static/server_config.html
  37. 2 2
      apollo-portal/src/main/resources/static/styles/common-style.css
  38. 1 1
      apollo-portal/src/main/resources/static/views/common/nav.html
  39. 1 1
      apollo-portal/src/main/resources/static/views/component/env-selector.html
  40. 15 15
      apollo-portal/src/main/resources/static/views/component/namespace-panel-branch-tab.html
  41. 29 29
      apollo-portal/src/main/resources/static/views/component/namespace-panel-master-tab.html
  42. 1 1
      apollo-portal/src/main/resources/static/views/component/release-modal.html
  43. 3 3
      apollo-portal/src/main/resources/static/views/component/rollback-modal.html

+ 1 - 0
apollo-common/src/main/java/com/ctrip/framework/apollo/common/controller/WebMvcConfig.java

@@ -45,6 +45,7 @@ public class WebMvcConfig implements WebMvcConfigurer, WebServerFactoryCustomize
     addCacheControl(registry, "scripts", 86400);
     addCacheControl(registry, "styles", 86400);
     addCacheControl(registry, "views", 86400);
+    addCacheControl(registry, "i18n", 86400);
   }
 
   private void addCacheControl(ResourceHandlerRegistry registry, String folder, int cachePeriod) {

+ 1 - 1
apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/AppDTO.java

@@ -11,7 +11,7 @@ public class AppDTO extends BaseDTO{
 
   @Pattern(
       regexp = InputValidator.CLUSTER_NAMESPACE_VALIDATOR,
-      message = "AppId格式错误: " + InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE
+      message = "Invalid AppId format: " + InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE
   )
   private String appId;
 

+ 1 - 1
apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/ClusterDTO.java

@@ -11,7 +11,7 @@ public class ClusterDTO extends BaseDTO{
   @NotBlank(message = "cluster name cannot be blank")
   @Pattern(
       regexp = InputValidator.CLUSTER_NAMESPACE_VALIDATOR,
-      message = "Cluster格式错误: " + InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE
+      message = "Invalid Cluster format: " + InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE
   )
   private String name;
 

+ 1 - 1
apollo-common/src/main/java/com/ctrip/framework/apollo/common/dto/NamespaceDTO.java

@@ -12,7 +12,7 @@ public class NamespaceDTO extends BaseDTO{
 
   @Pattern(
       regexp = InputValidator.CLUSTER_NAMESPACE_VALIDATOR,
-      message = "Namespace格式错误: " + InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE
+      message = "Invalid Namespace format: " + InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE
   )
   private String namespaceName;
 

+ 1 - 1
apollo-common/src/main/java/com/ctrip/framework/apollo/common/entity/AppNamespace.java

@@ -22,7 +22,7 @@ public class AppNamespace extends BaseEntity {
   @NotBlank(message = "AppNamespace Name cannot be blank")
   @Pattern(
       regexp = InputValidator.CLUSTER_NAMESPACE_VALIDATOR,
-      message = "Namespace格式错误: " + InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE + " & " + InputValidator.INVALID_NAMESPACE_NAMESPACE_MESSAGE
+      message = "Invalid Namespace format: " + InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE + " & " + InputValidator.INVALID_NAMESPACE_NAMESPACE_MESSAGE
   )
   @Column(name = "Name", nullable = false)
   private String name;

+ 2 - 2
apollo-common/src/main/java/com/ctrip/framework/apollo/common/utils/InputValidator.java

@@ -8,8 +8,8 @@ import java.util.regex.Pattern;
  * @author Jason Song(song_s@ctrip.com)
  */
 public class InputValidator {
-  public static final String INVALID_CLUSTER_NAMESPACE_MESSAGE = "只允许输入数字,字母和符号 - _ .";
-  public static final String INVALID_NAMESPACE_NAMESPACE_MESSAGE = "不允许以.json, .yml, .yaml, .xml, .properties结尾";
+  public static final String INVALID_CLUSTER_NAMESPACE_MESSAGE = "Only digits, alphabets and symbol - _ . are allowed";
+  public static final String INVALID_NAMESPACE_NAMESPACE_MESSAGE = "not allowed to end with .json, .yml, .yaml, .xml, .properties";
   public static final String CLUSTER_NAMESPACE_VALIDATOR = "[0-9a-zA-Z_.-]+";
   private static final String APP_NAMESPACE_VALIDATOR = "[a-zA-Z0-9._-]+(?<!\\.(json|yml|yaml|xml|properties))$";
   private static final Pattern CLUSTER_NAMESPACE_PATTERN = Pattern.compile(CLUSTER_NAMESPACE_VALIDATOR);

+ 1 - 1
apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/v1/controller/ClusterController.java

@@ -59,7 +59,7 @@ public class ClusterController {
 
     if (!InputValidator.isValidClusterNamespace(clusterName)) {
       throw new BadRequestException(
-          String.format("Cluster Name 格式错误: %s", InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE));
+          String.format("Invalid ClusterName format: %s", InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE));
     }
 
     if (userService.findByUserId(operator) == null) {

+ 1 - 1
apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/v1/controller/NamespaceController.java

@@ -68,7 +68,7 @@ public class NamespaceController {
                                                appNamespaceDTO.getFormat(), appNamespaceDTO.getDataChangeCreatedBy());
 
     if (!InputValidator.isValidAppNamespace(appNamespaceDTO.getName())) {
-      throw new BadRequestException(String.format("Namespace格式错误: %s",
+      throw new BadRequestException(String.format("Invalid Namespace format: %s",
                                                   InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE + " & "
                                                   + InputValidator.INVALID_NAMESPACE_NAMESPACE_MESSAGE));
     }

+ 1 - 1
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/NamespaceController.java

@@ -193,7 +193,7 @@ public class NamespaceController {
       @RequestParam(defaultValue = "true") boolean appendNamespacePrefix,
       @Valid @RequestBody AppNamespace appNamespace) {
     if (!InputValidator.isValidAppNamespace(appNamespace.getName())) {
-      throw new BadRequestException(String.format("Namespace格式错误: %s",
+      throw new BadRequestException(String.format("Invalid Namespace format: %s",
           InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE + " & " + InputValidator.INVALID_NAMESPACE_NAMESPACE_MESSAGE));
     }
 

+ 3 - 3
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/PermissionController.java

@@ -154,7 +154,7 @@ public class PermissionController {
     Set<String> assignedUser = rolePermissionService.assignRoleToUsers(RoleUtils.buildNamespaceRoleName(appId, namespaceName, roleType, env),
         Sets.newHashSet(user), userInfoHolder.getUser().getUserId());
     if (CollectionUtils.isEmpty(assignedUser)) {
-      throw new BadRequestException(user + "已授权");
+      throw new BadRequestException(user + " already authorized");
     }
 
     return ResponseEntity.ok().build();
@@ -209,7 +209,7 @@ public class PermissionController {
     Set<String> assignedUser = rolePermissionService.assignRoleToUsers(RoleUtils.buildNamespaceRoleName(appId, namespaceName, roleType),
         Sets.newHashSet(user), userInfoHolder.getUser().getUserId());
     if (CollectionUtils.isEmpty(assignedUser)) {
-      throw new BadRequestException(user + "已授权");
+      throw new BadRequestException(user + " already authorized");
     }
 
     return ResponseEntity.ok().build();
@@ -253,7 +253,7 @@ public class PermissionController {
     Set<String> assignedUsers = rolePermissionService.assignRoleToUsers(RoleUtils.buildAppRoleName(appId, roleType),
         Sets.newHashSet(user), userInfoHolder.getUser().getUserId());
     if (CollectionUtils.isEmpty(assignedUsers)) {
-      throw new BadRequestException(user + "已授权");
+      throw new BadRequestException(user + " already authorized");
     }
 
     return ResponseEntity.ok().build();

+ 1 - 1
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/entity/model/AppModel.java

@@ -14,7 +14,7 @@ public class AppModel {
   @NotBlank(message = "appId cannot be blank")
   @Pattern(
       regexp = InputValidator.CLUSTER_NAMESPACE_VALIDATOR,
-      message = "AppId格式错误: " + InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE
+      message = "Invalid AppId format: " + InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE
   )
   private String appId;
 

+ 7 - 7
apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/util/RelativeDateFormat.java

@@ -12,11 +12,11 @@ public class RelativeDateFormat {
   private static final long ONE_HOUR = 3600000L;
   private static final long ONE_DAY = 86400000L;
 
-  private static final String ONE_SECOND_AGO = "秒前";
-  private static final String ONE_MINUTE_AGO = "分钟前";
-  private static final String ONE_HOUR_AGO = "小时前";
-  private static final String ONE_DAY_AGO = "天前";
-  private static final String ONE_MONTH_AGO = "月前";
+  private static final String ONE_SECOND_AGO = " seconds ago";
+  private static final String ONE_MINUTE_AGO = " minutes ago";
+  private static final String ONE_HOUR_AGO = " hours ago";
+  private static final String ONE_DAY_AGO = " days ago";
+  private static final String ONE_MONTH_AGO = " months ago";
 
   public static String format(Date date) {
     if (date.after(new Date())) {
@@ -39,11 +39,11 @@ public class RelativeDateFormat {
 
     Date lastDayBeginTime = getDateOffset(-1);
     if (date.after(lastDayBeginTime)) {
-      return "昨天";
+      return "yesterday";
     }
     Date lastTwoDaysBeginTime = getDateOffset(-2);
     if (date.after(lastTwoDaysBeginTime)) {
-      return "前天";
+      return "the day before yesterday";
     }
     if (delta < 30L * ONE_DAY) {
       long days = toDays(delta);

+ 1 - 1
apollo-portal/src/main/resources/static/app.html

@@ -61,7 +61,7 @@
                     <div class="form-group">
                         <label class="col-sm-3 control-label">
                             <apollorequiredfield></apollorequiredfield>
-                            {{'Common.AppOwner' | translate }}</label>
+                            {{'Common.AppOwnerLong' | translate }}</label>
                         <div class="col-sm-6 J_ownerSelectorPanel">
                             <apollouserselector apollo-id="'ownerSelector'"  disabled="isOpenManageAppMasterRoleLimit"></apollouserselector>
                             <small style="color: maroon" ng-if="isOpenManageAppMasterRoleLimit">{{'App.AppOwnerTips' | translate }}</small>

+ 1 - 1
apollo-portal/src/main/resources/static/app/setting.html

@@ -147,7 +147,7 @@
 
                 <section class="context" ng-show="!hasAssignUserPermission">
                     <div class="panel-body text-center">
-                        <h4 translate="App.Setting.NoPermissonTips" translate-value-users="{{admins.join(',')}}"></h4>
+                        <h4 translate="App.Setting.NoPermissionTips" translate-value-users="{{admins.join(',')}}"></h4>
                     </div>
                 </section>
             </div>

+ 1 - 1
apollo-portal/src/main/resources/static/cluster.html

@@ -61,7 +61,7 @@
                                 {{'Common.ClusterName' | translate }}</label>
                             <div class="col-sm-6">
                                 <input type="text" class="form-control" name="clusterName" ng-model="clusterName">
-                                <small>{{'Cluster.CreaterNameTips' | translate }}</small>
+                                <small>{{'Cluster.CreateNameTips' | translate }}</small>
                             </div>
                         </div>
                         <div class="form-group">

+ 1 - 1
apollo-portal/src/main/resources/static/config.html

@@ -181,7 +181,7 @@
                 <!--default cluster tip -->
                 <div ng-show="pageContext.clusterName == 'default'">
                     <strong>{{'Config.Note' | translate }}:</strong>
-                    <span translate="Config.ClusterIsDefualtTipContent"
+                    <span translate="Config.ClusterIsDefaultTipContent"
                         translate-value-name="{{envMapClusters[pageContext.env]}}"></span>
                 </div>
 

+ 6 - 6
apollo-portal/src/main/resources/static/config/history.html

@@ -25,10 +25,10 @@
                     <div class="operation-caption release-operation-normal text-center" style="left:0;">
                         <small>{{'Config.History.MasterVersionPublish' | translate }}</small>
                     </div>
-                    <div class="operation-caption release-operation-rollback text-center" style="left: 80px;">
+                    <div class="operation-caption release-operation-rollback text-center" style="left: 110px;">
                         <small>{{'Config.History.MasterVersionRollback' | translate }}</small>
                     </div>
-                    <div class="operation-caption release-operation-gray text-center" style="left: 160px;">
+                    <div class="operation-caption release-operation-gray text-center" style="left: 220px;">
                         <small>{{'Config.History.GrayscaleOperator' | translate }}</small>
                     </div>
                 </div>
@@ -94,7 +94,7 @@
 
                     <div class="load-more media panel-heading text-center hover" ng-show="!hasLoadAll"
                         ng-click="findReleaseHistory()">
-                        {{'Config.History.LoadingMore' | translate }}
+                        {{'Config.History.LoadMore' | translate }}
                     </div>
 
                 </div>
@@ -114,12 +114,12 @@
                                 <div class="btn-group">
                                     <button type="button" class="btn btn-default btn-sm"
                                         ng-class="{'active':history.viewType == 'diff'}" data-tooltip="tooltip"
-                                        data-placement="bottom" title="查看此次发布与上次版本的变更"
+                                        data-placement="bottom" title="{{'Config.History.ChangedItemTips' | translate }}"
                                         ng-click="switchConfigViewType(history, 'diff')">{{'Config.History.ChangedItem' | translate }}
                                     </button>
                                     <button type="button" class="btn btn-default btn-sm"
                                         ng-class="{'active':history.viewType == 'all'}" data-tooltip="tooltip"
-                                        data-placement="bottom" title="查看此次发布的所有配置信息"
+                                        data-placement="bottom" title="{{'Config.History.AllItemTips' | translate }}"
                                         ng-click="switchConfigViewType(history, 'all')">{{'Config.History.AllItem' | translate }}
                                     </button>
                                 </div>
@@ -249,7 +249,7 @@
 
             <div class="panel-body" ng-show="isConfigHidden || !releaseHistories || releaseHistories.length == 0">
                 <h4 class="text-center empty-container" ng-show="isConfigHidden">
-                    {{'Config.History.NoPermissonTips' | translate }}</h4>
+                    {{'Config.History.NoPermissionTips' | translate }}</h4>
                 <h4 class="text-center empty-container" ng-show="!isConfigHidden">
                     {{'Config.History.NoPublishHistory' | translate }}</h4>
             </div>

+ 407 - 402
apollo-portal/src/main/resources/static/i18n/en.json

@@ -3,105 +3,106 @@
   "Common.Ctrip": "Ctrip",
   "Common.CtripDepartment": "Framework R&D Department",
   "Common.Nav.ShowNavBar": "Display navigation bar",
-  "Common.Nav.HideNavBar": "Hidden navigation bar",
+  "Common.Nav.HideNavBar": "Hide navigation bar",
   "Common.Nav.Help": "Help",
   "Common.Nav.AdminTools": "Admin Tools",
   "Common.Nav.UserManage": "User Management",
   "Common.Nav.SystemRoleManage": "System Permission Management",
-  "Common.Nav.OpenMange": "Open Platform Authorized Management",
-  "Common.Nav.SystemConfig": "System Parameter",
+  "Common.Nav.OpenMange": "Open Platform Authorization Management",
+  "Common.Nav.SystemConfig": "System Configuration",
   "Common.Nav.DeleteApp-Cluster-Namespace": "Delete Apps, Clusters, AppNamespace",
   "Common.Nav.SystemInfo": "System Information",
-  "Common.Nav.Logout": "Exit",
+  "Common.Nav.Logout": "Logout",
   "Common.Department": "Department",
   "Common.Cluster": "Cluster",
   "Common.Environment": "Environment",
-  "Common.Email": "Mail",
-  "Common.AppId": "AppId",
+  "Common.Email": "Email",
+  "Common.AppId": "App Id",
   "Common.Namespace": "Namespace",
-  "Common.AppName": "AppName",
-  "Common.AppOwner": "App Leader",
-  "Common.AppAdmin": "App Owner",
+  "Common.AppName": "App Name",
+  "Common.AppOwner": "App Owner",
+  "Common.AppOwnerLong": "App Owner",
+  "Common.AppAdmin": "App Administrators",
   "Common.ClusterName": "Cluster Name",
   "Common.Submit": "Submit",
   "Common.Save": "Save",
-  "Common.Created": "Created",
-  "Common.CreateFailed": "Create failed",
-  "Common.Deleted": "Deleted",
-  "Common.DeleteFailed": "Delete failed",
-  "Common.ReturnToIndex": "Return",
+  "Common.Created": "Create Successfully",
+  "Common.CreateFailed": "Fail to Create",
+  "Common.Deleted": "Delete Successfully",
+  "Common.DeleteFailed": "Fail to Delete",
+  "Common.ReturnToIndex": "Return to project page",
   "Common.Cancel": "Cancel",
   "Common.Ok": "OK",
   "Common.Search": "Query",
-  "Common.IsRootUser": "The current page is only available for Apollo administrator.",
-  "Common.PelaseChooseDepartment": "Please select department.",
-  "Common.PelaseChooseOwner": "Please select App leader.",
-  "Common.LoginExprieTips": "Your login has expired. Please refresh the page and try again.",
+  "Common.IsRootUser": "Current page is only accessible to Apollo administrator.",
+  "Common.PleaseChooseDepartment": "Please select department",
+  "Common.PleaseChooseOwner": "Please select app owner",
+  "Common.LoginExpiredTips": "Your login is expired. Please refresh the page and try again.",
   "Component.DeleteNamespace.Title": "Delete Namespace",
-  "Component.DeleteNamespace.PublicContent": "Deleting Namespace will cause the instance can't get the configuration of this Namespace. Are you sure you want to delete it?",
-  "Component.DeleteNamespace.PrivateContent": "Deleting a private Namespace will cause the instance can’t get the configuration of this Namespace, and the page will prompt the missing Namespace (unless the AppNamespace is deleted by Admin tool). Are you sure you want to delete it?",
+  "Component.DeleteNamespace.PublicContent": "Deleting namespace will cause the instances unable to get the configuration of this namespace. Are you sure to delete it?",
+  "Component.DeleteNamespace.PrivateContent": "Deleting a private Namespace will cause the instances unable to get the configuration of this namespace, and the page will prompt 'missing namespace' (unless the AppNamespace is deleted by admin tool). Are you sure to delete it?",
   "Component.GrayscalePublishRule.Title": "Edit Grayscale Rule",
   "Component.GrayscalePublishRule.AppId": "Grayscale AppId",
   "Component.GrayscalePublishRule.AcceptRule": "Grayscale Application Rule",
-  "Component.GrayscalePublishRule.AcceptPartInstance": "Applied to some instances",
-  "Component.GrayscalePublishRule.AcceptAllInstance": "Applied to all instances",
+  "Component.GrayscalePublishRule.AcceptPartInstance": "Apply to some instances",
+  "Component.GrayscalePublishRule.AcceptAllInstance": "Apply to all instances",
   "Component.GrayscalePublishRule.IP": "Grayscale IP",
-  "Component.GrayscalePublishRule.AppIdFilterTips": "(The list of instances is filtered by the typed AppId automatically)",
-  "Component.GrayscalePublishRule.IpTips": "Can't find the IP you wanted? OK",
-  "Component.GrayscalePublishRule.EnterIp": "Enter IP manually",
-  "Component.GrayscalePublishRule.EnterIpTips": "Enter the list of IP, use ',' to separate the IP, and then click the Add button.",
+  "Component.GrayscalePublishRule.AppIdFilterTips": "(The list of instances are filtered by the typed AppId automatically)",
+  "Component.GrayscalePublishRule.IpTips": "Can't find the IP you want? You may ",
+  "Component.GrayscalePublishRule.EnterIp": "enter IP manually",
+  "Component.GrayscalePublishRule.EnterIpTips": "Enter the list of IP, using ',' as the separator, and then click the Add button.",
   "Component.GrayscalePublishRule.Add": "Add",
   "Component.ConfigItem.Title": "Add Configuration",
-  "Component.ConfigItem.TitleTips": "(Kindly reminder: Configuration can be added in batches through text mode)",
+  "Component.ConfigItem.TitleTips": "(Reminder: Configuration can be added in batch via text mode)",
   "Component.ConfigItem.AddGrayscaleItem": "Add Grayscale Configuration",
   "Component.ConfigItem.ModifyItem": "Modify Configuration",
   "Component.ConfigItem.ItemKey": "Key",
   "Component.ConfigItem.ItemValue": "Value",
-  "Component.ConfigItem.ItemValueTips": "Note: Hidden characters (Spaces, Newline, Tab) easily cause configuration errors. If you need to check hidden characters in Value, Click here",
+  "Component.ConfigItem.ItemValueTips": "Note: Hidden characters (Spaces, Newline, Tab) easily cause configuration errors. If you want to check hidden characters in Value, please click",
   "Component.ConfigItem.ItemValueShowDetection": "Check Hidden Characters",
   "Component.ConfigItem.ItemValueNotHiddenChars": "No Hidden Characters",
   "Component.ConfigItem.ItemComment": "Comment",
   "Component.ConfigItem.ChooseCluster": "Select Cluster",
   "Component.MergePublish.Title": "Full Release",
-  "Component.MergePublish.Tips": "Full release will merge the configuration of grayscale version into the main branch and release it.",
-  "Component.MergePublish.NextStep": "After full release, you hope",
-  "Component.MergePublish.DeleteGrayscale": "Delete Grayscale Version",
-  "Component.MergePublish.ReservedGrayscale": "Keep Grayscale Version",
+  "Component.MergePublish.Tips": "Full release will merge the configurations of grayscale version into the main version and release them.",
+  "Component.MergePublish.NextStep": "After full release, choose which behavior you want",
+  "Component.MergePublish.DeleteGrayscale": "Delete grayscale version",
+  "Component.MergePublish.ReservedGrayscale": "Keep grayscale version",
   "Component.Namespace.Branch.IsChanged": "Modified",
   "Component.Namespace.Branch.ChangeUser": "Current Modifier",
-  "Component.Namespace.Branch.ContinueGrayscalePublish": "Continue to Release Grayscale",
+  "Component.Namespace.Branch.ContinueGrayscalePublish": "Continue to Grayscale Release",
   "Component.Namespace.Branch.GrayscalePublish": "Grayscale Release",
-  "Component.Namespace.Branch.MergeToMasterAndPublish": "Merge to the main version and release the main version configuration",
+  "Component.Namespace.Branch.MergeToMasterAndPublish": "Merge to the main version and release the main version's configurations ",
   "Component.Namespace.Branch.AllPublish": "Full Release",
-  "Component.Namespace.Branch.DiscardGrayscaleVesion": "Drop Grayscale Version",
-  "Component.Namespace.Branch.DiscardGrayscale": "Drop Grayscale",
-  "Component.Namespace.Branch.NoPermissionTips": "You are not the administrator of the project, and you do not have editing or releasing right for the Namespace. You cannot check the configuration.",
+  "Component.Namespace.Branch.DiscardGrayscaleVesion": "Abandon Grayscale Version",
+  "Component.Namespace.Branch.DiscardGrayscale": "Abandon Grayscale",
+  "Component.Namespace.Branch.NoPermissionTips": "You are not this project's administrator, nor you have edit or release permission for the namespace. Thus you cannot view the configuration.",
   "Component.Namespace.Branch.Tab.Configuration": "Configuration",
   "Component.Namespace.Branch.Tab.GrayscaleRule": "Grayscale Rule",
   "Component.Namespace.Branch.Tab.GrayscaleInstance": "Grayscale Instance List",
-  "Component.Namespace.Branch.Tab.ChangeHistory": "Modify History",
+  "Component.Namespace.Branch.Tab.ChangeHistory": "Change History",
   "Component.Namespace.Branch.Body.Item": "Grayscale Configuration",
-  "Component.Namespace.Branch.Body.AddedItem": "New Grayscale Configuration",
+  "Component.Namespace.Branch.Body.AddedItem": "Add Grayscale Configuration",
   "Component.Namespace.Branch.Body.PublishState": "Release Status",
   "Component.Namespace.Branch.Body.ItemSort": "Sort",
   "Component.Namespace.Branch.Body.ItemKey": "Key",
   "Component.Namespace.Branch.Body.ItemMasterValue": "Value of Main Version",
   "Component.Namespace.Branch.Body.ItemGrayscaleValue": "Grayscale value",
-  "Component.Namespace.Branch.Body.ItemComment": "Comments",
-  "Component.Namespace.Branch.Body.ItemLastModify": "Final Modifier",
-  "Component.Namespace.Branch.Body.ItemLastModifyTime": "Final Modified Time",
+  "Component.Namespace.Branch.Body.ItemComment": "Comment",
+  "Component.Namespace.Branch.Body.ItemLastModify": "Last Modifier",
+  "Component.Namespace.Branch.Body.ItemLastModifyTime": "Last Modified Time",
   "Component.Namespace.Branch.Body.ItemOperator": "Operation",
-  "Component.Namespace.Branch.Body.ClickToSeeItemValue": "Click to check released values",
+  "Component.Namespace.Branch.Body.ClickToSeeItemValue": "Click to view released values",
   "Component.Namespace.Branch.Body.ItemNoPublish": "Unreleased",
   "Component.Namespace.Branch.Body.ItemPublished": "Released",
-  "Component.Namespace.Branch.Body.ItemEffective": "Effective Configuration",
-  "Component.Namespace.Branch.Body.ClickToSee": "Click to View",
-  "Component.Namespace.Branch.Body.DeletedItem": "Deleted Configuration",
-  "Component.Namespace.Branch.Body.Delete": "Delete",
-  "Component.Namespace.Branch.Body.ChangedFormMaster": "Modify the configuration of the main version",
-  "Component.Namespace.Branch.Body.ModifedItem": "Modified Configuration",
-  "Component.Namespace.Branch.Body.Modify": "Modify",
-  "Component.Namespace.Branch.Body.AddedByGrayscale": "Specific Configuration for Grayscale Version",
+  "Component.Namespace.Branch.Body.ItemEffective": "Effective configuration",
+  "Component.Namespace.Branch.Body.ClickToSee": "Click to view",
+  "Component.Namespace.Branch.Body.DeletedItem": "Deleted configuration",
+  "Component.Namespace.Branch.Body.Delete": "Deleted",
+  "Component.Namespace.Branch.Body.ChangedFromMaster": "Configuration modified from the main version",
+  "Component.Namespace.Branch.Body.ModifiedItem": "Modified configuration",
+  "Component.Namespace.Branch.Body.Modify": "Modified",
+  "Component.Namespace.Branch.Body.AddedByGrayscale": "Specific configuration for grayscale version",
   "Component.Namespace.Branch.Body.Added": "New",
   "Component.Namespace.Branch.Body.Op.Modify": "Modify",
   "Component.Namespace.Branch.Body.Op.Delete": "Delete",
@@ -109,32 +110,32 @@
   "Component.Namespace.MasterBranch.Body.PublishState": "Release Status",
   "Component.Namespace.MasterBranch.Body.ItemKey": "Key",
   "Component.Namespace.MasterBranch.Body.ItemValue": "Value",
-  "Component.Namespace.MasterBranch.Body.ItemComment": "Comments",
-  "Component.Namespace.MasterBranch.Body.ItemLastModify": "Final Modifier",
-  "Component.Namespace.MasterBranch.Body.ItemLastModifyTime": "Final Modified Time",
+  "Component.Namespace.MasterBranch.Body.ItemComment": "Comment",
+  "Component.Namespace.MasterBranch.Body.ItemLastModify": "Last Modifier",
+  "Component.Namespace.MasterBranch.Body.ItemLastModifyTime": "Last Modified Time",
   "Component.Namespace.MasterBranch.Body.ItemOperator": "Operation",
   "Component.Namespace.MasterBranch.Body.ClickToSeeItemValue": "Click to check released values",
   "Component.Namespace.MasterBranch.Body.ItemNoPublish": "Unreleased",
-  "Component.Namespace.MasterBranch.Body.ItemEffective": "Effective Configuration",
+  "Component.Namespace.MasterBranch.Body.ItemEffective": "Effective configuration",
   "Component.Namespace.MasterBranch.Body.ItemPublished": "Released",
-  "Component.Namespace.MasterBranch.Body.AddedItem": "New Configuration",
-  "Component.Namespace.MasterBranch.Body.ModifyItem": "Modify the Grayscale Configuration",
-  "Component.Namespace.Branch.GrayScaleRule.NoPermissonTips": "You do not have the right to edit grayscale rule. Only those who have the right to modify or release namespace can edit grayscale rule. If you need to edit grayscale rule, please contact the project administrator to apply for the permission.",
+  "Component.Namespace.MasterBranch.Body.AddedItem": "New configuration",
+  "Component.Namespace.MasterBranch.Body.ModifyItem": "Modify the grayscale configuration",
+  "Component.Namespace.Branch.GrayScaleRule.NoPermissionTips": "You do not have the permission to edit grayscale rule. Only those who have the permission to edit or release the namespace can edit grayscale rule. If you need to edit grayscale rule, please contact the project administrator to apply for the permission.",
   "Component.Namespace.Branch.GrayScaleRule.AppId": "Grayscale AppId",
   "Component.Namespace.Branch.GrayScaleRule.IpList": "Grayscale IP List",
   "Component.Namespace.Branch.GrayScaleRule.Operator": "Operation",
   "Component.Namespace.Branch.GrayScaleRule.ApplyToAllInstances": "ALL",
   "Component.Namespace.Branch.GrayScaleRule.Modify": "Modify",
   "Component.Namespace.Branch.GrayScaleRule.Delete": "Delete",
-  "Component.Namespace.Branch.GrayScaleRule.AddNewRule": "New Rules",
+  "Component.Namespace.Branch.GrayScaleRule.AddNewRule": "Create Rule",
   "Component.Namespace.Branch.Instance.RefreshList": "Refresh List",
-  "Component.Namespace.Branch.Instance.ItemToSee": "View Configuration",
+  "Component.Namespace.Branch.Instance.ItemToSee": "View configuration",
   "Component.Namespace.Branch.Instance.InstanceAppId": "App ID",
   "Component.Namespace.Branch.Instance.InstanceClusterName": "Cluster Name",
   "Component.Namespace.Branch.Instance.InstanceDataCenter": "Data Center",
   "Component.Namespace.Branch.Instance.InstanceIp": "IP",
-  "Component.Namespace.Branch.Instance.InstanceGetItemTime": "Configure Getting Time",
-  "Component.Namespace.Branch.Instance.LoadingMore": "Refresh List",
+  "Component.Namespace.Branch.Instance.InstanceGetItemTime": "Configuration Fetched Time",
+  "Component.Namespace.Branch.Instance.LoadMore": "Refresh list",
   "Component.Namespace.Branch.Instance.NoInstance": "No instance information",
   "Component.Namespace.Branch.History.ItemType": "Type",
   "Component.Namespace.Branch.History.ItemKey": "Key",
@@ -142,88 +143,88 @@
   "Component.Namespace.Branch.History.ItemNewValue": "New Value",
   "Component.Namespace.Branch.History.ItemComment": "Comment",
   "Component.Namespace.Branch.History.NewAdded": "Add",
-  "Component.Namespace.Branch.History.Modifed": "Update",
+  "Component.Namespace.Branch.History.Modified": "Update",
   "Component.Namespace.Branch.History.Deleted": "Delete",
-  "Component.Namespace.Branch.History.LoadingMore": "Loading more",
+  "Component.Namespace.Branch.History.LoadMore": "Load more",
   "Component.Namespace.Branch.History.NoHistory": "No Change History",
   "Component.Namespace.Header.Title.Private": "Private",
-  "Component.Namespace.Header.Title.PrivateTips": "The configuration of private namespace ({{namespace.baseInfo.namespaceName}}) can be only read by clients whose AppId is {{appId}}",
+  "Component.Namespace.Header.Title.PrivateTips": "The configuration of private namespace ({{namespace.baseInfo.namespaceName}}) can be only fetched by clients whose AppId is {{appId}}",
   "Component.Namespace.Header.Title.Public": "Public",
-  "Component.Namespace.Header.Title.PublicTips": "The configuration of namespace ({{namespace. baseInfo. namespaceName}}) can be read by any client.",
-  "Component.Namespace.Header.Title.Extend": "Relation",
-  "Component.Namespace.Header.Title.ExtendTips": "The configuration of namespace ({{namespace.baseInfo.namespaceName}}) will override the configuration of the public namespace, and the combined configuration can only be read by clients whose AppId is {{appId}}.",
-  "Component.Namespace.Header.Title.ExpandAndCollapse": "[Extension/Contraction]",
+  "Component.Namespace.Header.Title.PublicTips": "The configuration of namespace ({{namespace.baseInfo.namespaceName}}) can be fetched by any client.",
+  "Component.Namespace.Header.Title.Extend": "Association",
+  "Component.Namespace.Header.Title.ExtendTips": "The configuration of namespace ({{namespace.baseInfo.namespaceName}}) will override the configuration of the public namespace, and the combined configuration can only be fetched by clients whose AppId is {{appId}}.",
+  "Component.Namespace.Header.Title.ExpandAndCollapse": "[Expand/Collapse]",
   "Component.Namespace.Header.Title.Master": "Main Version",
   "Component.Namespace.Header.Title.Grayscale": "Grayscale Version",
   "Component.Namespace.Master.LoadNamespace": "Load Namespace",
   "Component.Namespace.Master.LoadNamespaceTips": "Load Namespace",
   "Component.Namespace.Master.Items.Changed": "Modified",
-  "Component.Namespace.Master.Items.ChangedUser": "Current Modifier",
-  "Component.Namespace.Master.Items.Pubish": "Release",
-  "Component.Namespace.Master.Items.PubishTips": "Release Configuration",
+  "Component.Namespace.Master.Items.ChangedUser": "Current modifier",
+  "Component.Namespace.Master.Items.Publish": "Release",
+  "Component.Namespace.Master.Items.PublishTips": "Release configuration",
   "Component.Namespace.Master.Items.Rollback": "Rollback",
   "Component.Namespace.Master.Items.RollbackTips": "Rollback released configuration",
-  "Component.Namespace.Master.Items.PubishHistory": "Release History",
-  "Component.Namespace.Master.Items.PubishHistoryTips": "View the release history",
+  "Component.Namespace.Master.Items.PublishHistory": "Release History",
+  "Component.Namespace.Master.Items.PublishHistoryTips": "View the release history",
   "Component.Namespace.Master.Items.Grant": "Authorize",
-  "Component.Namespace.Master.Items.GrantTips": "Configuration Change, Release Authority",
+  "Component.Namespace.Master.Items.GrantTips": "Manage the configuration edit and release permission",
   "Component.Namespace.Master.Items.Grayscale": "Grayscale",
   "Component.Namespace.Master.Items.GrayscaleTips": "Create a test version",
-  "Component.Namespace.Master.Items.RequestPermission": "Apply for Configuring Authority",
-  "Component.Namespace.Master.Items.RequestPermissionTips": "You do not have any configuring authority. Please apply.",
+  "Component.Namespace.Master.Items.RequestPermission": "Apply for configuration permission",
+  "Component.Namespace.Master.Items.RequestPermissionTips": "You do not have any configuration permission. Please apply.",
   "Component.Namespace.Master.Items.DeleteNamespace": "Delete Namespace",
-  "Component.Namespace.Master.Items.NoPermissionTips": "You are not the administrator of the project, and you do not have editing or releasing authority for the Namespace. You cannot check the configuration information.",
+  "Component.Namespace.Master.Items.NoPermissionTips": "You are not this project's administrator, nor you have edit or releas permission for the namespace. Thus you cannot view the configuration.",
   "Component.Namespace.Master.Items.ItemList": "Table",
   "Component.Namespace.Master.Items.ItemListByText": "Text",
   "Component.Namespace.Master.Items.ItemHistory": "Change History",
   "Component.Namespace.Master.Items.ItemInstance": "Instance List",
-  "Component.Namespace.Master.Items.CopyText": "Copy Text",
-  "Component.Namespace.Master.Items.GrammarCheck": "Grammar Checking",
-  "Component.Namespace.Master.Items.CancelChanged": "Cancel the Change",
-  "Component.Namespace.Master.Items.Change": "Modify Configuration",
-  "Component.Namespace.Master.Items.SummitChanged": "Submit the Change",
-  "Component.Namespace.Master.Items.SortByKey": "Filter the configuration by key",
-  "Component.Namespace.Master.Items.FilterItem": "Filter configuration",
-  "Component.Namespace.Master.Items.SyncItemTips": "Synchronize configuration among environments",
-  "Component.Namespace.Master.Items.SyncItem": "Synchronize Configuration",
-  "Component.Namespace.Master.Items.DiffItemTips": "Compare the configuration among environments",
-  "Component.Namespace.Master.Items.DiffItem": "Compare Configuration",
+  "Component.Namespace.Master.Items.CopyText": "Copy",
+  "Component.Namespace.Master.Items.GrammarCheck": "Syntax Check",
+  "Component.Namespace.Master.Items.CancelChanged": "Cancel",
+  "Component.Namespace.Master.Items.Change": "Modify",
+  "Component.Namespace.Master.Items.SummitChanged": "Submit",
+  "Component.Namespace.Master.Items.SortByKey": "Filter the configurations by key",
+  "Component.Namespace.Master.Items.FilterItem": "Filter",
+  "Component.Namespace.Master.Items.SyncItemTips": "Synchronize configurations among environments",
+  "Component.Namespace.Master.Items.SyncItem": "Synchronize",
+  "Component.Namespace.Master.Items.DiffItemTips": "Compare the configurations among environments",
+  "Component.Namespace.Master.Items.DiffItem": "Compare",
   "Component.Namespace.Master.Items.AddItem": "Add Configuration",
-  "Component.Namespace.Master.Items.Body.ItemsNoPublishedTips": "Tips: This namespace has never been released. Apollo client will not be able to get the configuration and record 404 log information. Please release it in time.",
-  "Component.Namespace.Master.Items.Body.FilterByKey": "Input key for filtering",
+  "Component.Namespace.Master.Items.Body.ItemsNoPublishedTips": "Tips: This namespace has never been released. Apollo client will not be able to fetch the configuration and will record 404 log information. Please release it in time.",
+  "Component.Namespace.Master.Items.Body.FilterByKey": "Input key to filter",
   "Component.Namespace.Master.Items.Body.PublishState": "Release Status",
   "Component.Namespace.Master.Items.Body.Sort": "Sort",
   "Component.Namespace.Master.Items.Body.ItemKey": "Key",
   "Component.Namespace.Master.Items.Body.ItemValue": "Value",
   "Component.Namespace.Master.Items.Body.ItemComment": "Comment",
-  "Component.Namespace.Master.Items.Body.ItemLastModify": "Final Modifier",
-  "Component.Namespace.Master.Items.Body.ItemLastModifyTime": "Final Modify Time",
+  "Component.Namespace.Master.Items.Body.ItemLastModify": "Last Modifier",
+  "Component.Namespace.Master.Items.Body.ItemLastModifyTime": "Last Modified Time",
   "Component.Namespace.Master.Items.Body.ItemOperator": "Operation",
   "Component.Namespace.Master.Items.Body.NoPublish": "Unreleased",
   "Component.Namespace.Master.Items.Body.NoPublishTitle": "Click to view released values",
   "Component.Namespace.Master.Items.Body.NoPublishTips": "New configuration, no released value",
   "Component.Namespace.Master.Items.Body.Published": "Released",
-  "Component.Namespace.Master.Items.Body.PublishedTitle": "Effective Configuration",
+  "Component.Namespace.Master.Items.Body.PublishedTitle": "Effective configuration",
   "Component.Namespace.Master.Items.Body.ClickToSee": "Click to view",
   "Component.Namespace.Master.Items.Body.Grayscale": "Gray",
   "Component.Namespace.Master.Items.Body.HaveGrayscale": "This configuration has grayscale configuration. Click to view the value of grayscale.",
   "Component.Namespace.Master.Items.Body.NewAdded": "New",
   "Component.Namespace.Master.Items.Body.NewAddedTips": "New Configuration",
-  "Component.Namespace.Master.Items.Body.Modifed": "Modify",
-  "Component.Namespace.Master.Items.Body.ModifedTips": "Modified Configuration",
-  "Component.Namespace.Master.Items.Body.Deleted": "Delete",
+  "Component.Namespace.Master.Items.Body.Modified": "Modified",
+  "Component.Namespace.Master.Items.Body.ModifiedTips": "Modified Configuration",
+  "Component.Namespace.Master.Items.Body.Deleted": "Deleted",
   "Component.Namespace.Master.Items.Body.DeletedTips": "Deleted Configuration",
   "Component.Namespace.Master.Items.Body.ModifyTips": "Modify",
   "Component.Namespace.Master.Items.Body.DeleteTips": "Delete",
-  "Component.Namespace.Master.Items.Body.Link.Title": "Included Configuration",
-  "Component.Namespace.Master.Items.Body.Link.NoCoverLinkItem": "Excluded Configuration",
+  "Component.Namespace.Master.Items.Body.Link.Title": "Overridden Configuration",
+  "Component.Namespace.Master.Items.Body.Link.NoCoverLinkItem": "No Overridden Configuration",
   "Component.Namespace.Master.Items.Body.Public.Title": "Public Configuration",
   "Component.Namespace.Master.Items.Body.Public.Published": "Released Configuration",
   "Component.Namespace.Master.Items.Body.Public.NoPublish": "Unreleased Configuration",
   "Component.Namespace.Master.Items.Body.Public.NoPublicNamespaceTips1": "Owner of the current public namespace",
-  "Component.Namespace.Master.Items.Body.Public.NoPublicNamespaceTips2": "No association with this namespace, please contact the owner of {{namespace. parentAppId}} to associate with this namespace in the {{namespace. parentAppId}} project.",
-  "Component.Namespace.Master.Items.Body.Public.NoPublished": "Unreleased Configuration",
-  "Component.Namespace.Master.Items.Body.Public.PubishedAndCover": "Override this configuration",
+  "Component.Namespace.Master.Items.Body.Public.NoPublicNamespaceTips2": "hasn't associated this namespace, please contact the owner of {{namespace.parentAppId}} to associate this namespace in the {{namespace.parentAppId}} project.",
+  "Component.Namespace.Master.Items.Body.Public.NoPublished": "No Released Configuration",
+  "Component.Namespace.Master.Items.Body.Public.PublishedAndCover": "Override this configuration",
   "Component.Namespace.Master.Items.Body.NoPublished.Title": "No public configuration",
   "Component.Namespace.Master.Items.Body.NoPublished.PublishedValue": "Released Value",
   "Component.Namespace.Master.Items.Body.NoPublished.NoPublishedValue": "Unreleased Value",
@@ -235,32 +236,32 @@
   "Component.Namespace.Master.Items.Body.HistoryView.NewAdded": "Add",
   "Component.Namespace.Master.Items.Body.HistoryView.Updated": "Update",
   "Component.Namespace.Master.Items.Body.HistoryView.Deleted": "Delete",
-  "Component.Namespace.Master.Items.Body.HistoryView.LoadingMore": "Loading more",
-  "Component.Namespace.Master.Items.Body.HistoryView.NoHistory": "Unchanged History",
-  "Component.Namespace.Master.Items.Body.Instance.Tips": "Instance Instruction: Only show the Apollo instance that is visited last day",
-  "Component.Namespace.Master.Items.Body.Instance.UsedNewItem": "Instance of using the latest configuration",
-  "Component.Namespace.Master.Items.Body.Instance.NoUsedNewItem": "Instance of using non-latest configuration",
+  "Component.Namespace.Master.Items.Body.HistoryView.LoadMore": "Load more",
+  "Component.Namespace.Master.Items.Body.HistoryView.NoHistory": "No Change History",
+  "Component.Namespace.Master.Items.Body.Instance.Tips": "Tips: Only show instances who have fetched configurations in the last 24 hrs ",
+  "Component.Namespace.Master.Items.Body.Instance.UsedNewItem": "Instances using the latest configuration",
+  "Component.Namespace.Master.Items.Body.Instance.NoUsedNewItem": "Instances using outdated configuration",
   "Component.Namespace.Master.Items.Body.Instance.AllInstance": "All Instances",
   "Component.Namespace.Master.Items.Body.Instance.RefreshList": "Refresh List",
   "Component.Namespace.Master.Items.Body.Instance.ToSeeItem": "View Configuration",
-  "Component.Namespace.Master.Items.Body.Instance.LoadingMore": "Loading more",
+  "Component.Namespace.Master.Items.Body.Instance.LoadMore": "Load more",
   "Component.Namespace.Master.Items.Body.Instance.ItemAppId": "App ID",
   "Component.Namespace.Master.Items.Body.Instance.ItemCluster": "Cluster Name",
   "Component.Namespace.Master.Items.Body.Instance.ItemDataCenter": "Data Center",
   "Component.Namespace.Master.Items.Body.Instance.ItemIp": "IP",
-  "Component.Namespace.Master.Items.Body.Instance.ItemGetTime": "Configure getting time",
+  "Component.Namespace.Master.Items.Body.Instance.ItemGetTime": "Configuration fetched time",
   "Component.Namespace.Master.Items.Body.Instance.NoInstanceTips": "No Instance Information",
   "Component.PublishDeny.Title": "Release Restriction",
-  "Component.PublishDeny.Tips1": "You can't release ~{{env}} Editing environment configuration and releasing must be for different people, please ask someone who has the releasing authority of this namespace to operate the release.~",
-  "Component.PublishDeny.Tips2": "(If it is non working time or special situations, you may release by clicking the <mark> Emergency Release </mark> button.)",
+  "Component.PublishDeny.Tips1": "You can't release! The operators to edit and release the configurations in {{env}} environment must be different, please find someone else who has the release permission of this namespace to do the release operation.",
+  "Component.PublishDeny.Tips2": "(If it is non working time or a special situation, you may release by clicking the 'Emergency Release' button.)",
   "Component.PublishDeny.EmergencyPublish": "Emergency Release",
   "Component.PublishDeny.Close": "Close",
   "Component.Publish.Title": "Release",
-  "Component.Publish.Tips": "(Only the released configuration will be accessed by the client, and this release will only work in the current environment: {{env}})",
+  "Component.Publish.Tips": "(Only the released configurations can be fetched by clients, and this release will only be applied to the current environment: {{env}})",
   "Component.Publish.Grayscale": "Grayscale Release",
-  "Component.Publish.GrayscaleTips": "(The configuration of grayscale releasing only works on the configuring instances in grayscale rules)",
+  "Component.Publish.GrayscaleTips": "(The grayscale configurations are only applied to the instances specified in grayscale rules)",
   "Component.Publish.AllPublish": "Full Release",
-  "Component.Publish.AllPublishTips": "(Full release configuration works on all instances)",
+  "Component.Publish.AllPublishTips": "(Full release configurations are applied to all instances)",
   "Component.Publish.ToSeeChange": "View changes",
   "Component.Publish.PublishedValue": "Released values",
   "Component.Publish.Changes": "Changes",
@@ -269,203 +270,205 @@
   "Component.Publish.ModifyUser": "Modifier",
   "Component.Publish.ModifyTime": "Modified Time",
   "Component.Publish.NewAdded": "New",
-  "Component.Publish.NewAddedTips": "New Added Configuration",
-  "Component.Publish.Modifed": "Modify",
-  "Component.Publish.ModifedTips": "Modified Configuration",
-  "Component.Publish.Deleted": "Delete",
+  "Component.Publish.NewAddedTips": "New Configuration",
+  "Component.Publish.Modified": "Modified",
+  "Component.Publish.ModifiedTips": "Modified Configuration",
+  "Component.Publish.Deleted": "Deleted",
   "Component.Publish.DeletedTips": "Deleted Configuration",
   "Component.Publish.MasterValue": "Main version value",
   "Component.Publish.GrayValue": "Grayscale version value",
   "Component.Publish.GrayPublishedValue": "Released grayscale version value",
   "Component.Publish.GrayNoPublishedValue": "Unreleased grayscale version value",
-  "Component.Publish.ItemNoChange": "No change on configuration",
-  "Component.Publish.GrayItemNoChange": "No change on grayscale configuration",
-  "Component.Publish.NoGrayItems": "Configuration Item without Grayscale",
+  "Component.Publish.ItemNoChange": "No configuration changes",
+  "Component.Publish.GrayItemNoChange": "No configuration changes",
+  "Component.Publish.NoGrayItems": "No grayscale changes",
   "Component.Publish.Release": "Release Name",
   "Component.Publish.ReleaseComment": "Comment",
   "Component.Publish.OpPublish": "Release",
-  "Component.Rollback.Goto": "Roll back to",
-  "Component.Rollback.Tips": "This operation will roll back to the previous released version, and the current version is invalid, but no impact on the modifying configuration. You can check the current version on the releasing history page",
+  "Component.Rollback.To": "roll back to",
+  "Component.Rollback.Tips": "This operation will roll back to the last released version, and the current version is abandoned, but there is no impact to the currently editing configurations. You may view the currently effective version in the release history page",
+  "Component.Rollback.ClickToView": "Click to view",
   "Component.Rollback.ItemType": "Type",
   "Component.Rollback.ItemKey": "Key",
-  "Component.Rollback.RollbackBeforeValue": "Before rollback",
-  "Component.Rollback.RollbackAfterValue": "After rollback",
+  "Component.Rollback.RollbackBeforeValue": "Before Rollback",
+  "Component.Rollback.RollbackAfterValue": "After Rollback",
   "Component.Rollback.Added": "Add",
-  "Component.Rollback.Modifed": "Update",
+  "Component.Rollback.Modified": "Update",
   "Component.Rollback.Deleted": "Delete",
-  "Component.Rollback.NoChange": "No change on configuration",
+  "Component.Rollback.NoChange": "No configuration changes",
   "Component.Rollback.OpRollback": "Rollback",
   "Component.ShowText.Title": "View",
   "Login.Login": "Login",
   "Login.UserNameOrPasswordIncorrect": "Incorrect username or password",
-  "Login.LogoutSuccessfully": "Logout successfully",
-  "Index.MyProject": "My project",
+  "Login.LogoutSuccessfully": "Logout Successfully",
+  "Index.MyProject": "My projects",
   "Index.CreateProject": "Create project",
-  "Index.LoadingMore": "Loading more",
-  "Index.FavoriteItems": "Collected items",
+  "Index.LoadMore": "Load more",
+  "Index.FavoriteItems": "Favorite projects",
   "Index.Topping": "Top",
-  "Index.FavoriteTip": "You haven't collected any items yet. You can collect items on the project homepage.~",
-  "Index.RecentyViewedItems": "Recently browsed items",
-  "Index.GetCreateAppRoleFailed": "Failed to get the information of creating application permission",
-  "Index.Topped": "Top successfully",
-  "Index.CancelledFavorite": "Cancel collection successfully",
+  "Index.FavoriteTip": "You haven't favorited any items yet. You can favorite items on the project homepage.",
+  "Index.RecentlyViewedItems": "Recent projects",
+  "Index.GetCreateAppRoleFailed": "Failed to get the information of create project permission",
+  "Index.Topped": "Top Successfully",
+  "Index.CancelledFavorite": "Remove favorite successfully",
+  "Cluster.CreateCluster": "Create Cluster",
   "Cluster.Tips.1": "By adding clusters, the same program can use different configuration in different clusters (such as different data centers)",
   "Cluster.Tips.2": "If the different clusters use the same configuration, there is no need to create clusters",
-  "Cluster.Tips.3": "By default, Apollo reads IDC attributes in /opt/settings/server. properties(Linux) or C:\\opt\\settings\\server.properties(Windows) files on the machine as cluster names, such as SHAJQ (Jinqiao Data Center), SHAOY (Ouyang Data Center)",
-  "Cluster.Tips.4": "The cluster name created at here needs to be consistent with the IDC attribute in server.properties on the machine",
-  "Cluster.CreaterNameTips": "(Deploy clusters such as SHAJQ, SHAOY or customized clusters such as SHAJQ-xx, SHAJQ-yy)",
-  "Cluster.ChooseEnvironment": "Select the environment",
+  "Cluster.Tips.3": "By default, Apollo reads IDC attributes in /opt/settings/server.properties(Linux) or C:\\opt\\settings\\server.properties(Windows) files on the machine as cluster names, such as SHAJQ (Jinqiao Data Center), SHAOY (Ouyang Data Center)",
+  "Cluster.Tips.4": "The cluster name created here should be consistent with the IDC attribute in server.properties on the machine",
+  "Cluster.CreateNameTips": "(Cluster names such as SHAJQ, SHAOY or customized clusters such as SHAJQ-xx, SHAJQ-yy)",
+  "Cluster.ChooseEnvironment": "Environment",
   "Cluster.LoadingEnvironmentError": "Error in loading environment information",
   "Cluster.ClusterCreated": "Create cluster successfully",
-  "Cluster.ClusterCreateFailed": "Fail to create cluster",
+  "Cluster.ClusterCreateFailed": "Failed to create cluster",
   "Cluster.PleaseChooseEnvironment": "Please select the environment",
   "Config.Title": "Apollo Configuration Center",
-  "Config.AppIdNotFound": "Nothingness",
-  "Config.ClickByCreate": "Click to create",
-  "Config.EnvList": "Environment List",
+  "Config.AppIdNotFound": "doesn't exist, ",
+  "Config.ClickByCreate": "click to create",
+  "Config.EnvList": "Environments",
   "Config.EnvListTips": "Manage the configuration of different environments and clusters by switching environments and clusters",
-  "Config.ProjectInfo": "Project Information",
-  "Config.ModifyBasicProjectInfo": "Modify the basic information of project",
-  "Config.Favorite": "Collection",
-  "Config.CancelFavorite": "Cancel Collection",
-  "Config.MissEnv": "Lack of environment",
-  "Config.MissNamespace": "Lack of Namespace",
+  "Config.ProjectInfo": "Project Info",
+  "Config.ModifyBasicProjectInfo": "Modify project's basic information",
+  "Config.Favorite": "Favorite",
+  "Config.CancelFavorite": "Cancel Favorite",
+  "Config.MissEnv": "Missing environment",
+  "Config.MissNamespace": "Missing Namespace",
   "Config.ProjectManage": "Manage Project",
-  "Config.CreateAppMissEnv": "Fill in environment",
-  "Config.CreateAppMissNamespace": "Fill in Namespace",
+  "Config.CreateAppMissEnv": "Recover Environments",
+  "Config.CreateAppMissNamespace": "Recover Namespaces",
   "Config.AddCluster": "Add Cluster",
   "Config.AddNamespace": "Add Namespace",
-  "Config.CurrentlyOperatorEnv": "Current operating environment",
+  "Config.CurrentlyOperatorEnv": "Current environment",
   "Config.DoNotRemindAgain": "No longer prompt",
   "Config.Note": "Note",
-  "Config.ClusterIsDefualtTipContent": "All instances that do not belong to the'{{name}}'cluster will use the default cluster (current page) configuration, and those that belong to the'{{name}}' cluster will use the corresponding cluster configuration!",
-  "Config.ClusterIsCustomTipContent": "Instances belonging to the'{{name}}'cluster only use the configuration of the'{{name}}' cluster (the current page), and the default cluster configuration is used only when the corresponding namespace has not been published in the current cluster.",
-  "Config.HasNotPublishNamespace": "The following environment/cluster has unpublished configuration, the client can not get unpublished configuration, please publish in time.",
+  "Config.ClusterIsDefaultTipContent": "All instances that do not belong to the '{{name}}' cluster will fetch the default cluster (current page) configuration, and those that belong to the '{{name}}' cluster will use the corresponding cluster configuration!",
+  "Config.ClusterIsCustomTipContent": "Instances belonging to the '{{name}}' cluster will only fetch the configuration of the '{{name}}' cluster (the current page), and the default cluster configuration will only be fetched when the corresponding namespace has not been released in the current cluster.",
+  "Config.HasNotPublishNamespace": "The following environment/cluster has unreleased configurations, the client will not fetch the unreleased configurations, please release them in time.",
   "Config.DeleteItem.DialogTitle": "Delete configuration",
-  "Config.DeleteItem.DialogContent": "You are deleting the configuration whose Key is <b>'{{config.key}} </b> Value is <b>'{{config.value}} </b>. <br> Are you sure you want to delete the configuration?",
+  "Config.DeleteItem.DialogContent": "You are deleting the configuration whose Key is <b>'{{config.key}}'</b> Value is <b>'{{config.value}}'</b>. <br> Are you sure to delete the configuration?",
   "Config.PublishNoPermission.DialogTitle": "Release",
-  "Config.PublishNoPermission.DialogContent": "You do not have publishing permissions. ~Ask the Project Administrator'{{masterUsers}}'to assign publishing permissions.",
-  "Config.ModifyNoPermission.DialogTitle": "Application for Configuration Permission",
-  "Config.ModifyNoPermission.DialogContent": "Assign editing or publishing permissions to project administrator'{{masterUsers}}'",
-  "Config.MasterNoPermission.DialogTitle": "Application for Configuration Permission",
-  "Config.MasterNoPermission.DialogContent": "You are not a project administrator. Only project administrators have the right to add clusters and namespaces. For administrator privileges, ask the project administrator'{{masterUsers}}'to assign administrator privileges",
-  "Config.NamespaceLocked.DialogTitle": "Editorial constraints",
-  "Config.NamespaceLocked.DialogContent": "Currently namespace is being edited by'{{lockOwner}}', and a publication can only be modified by one person.",
+  "Config.PublishNoPermission.DialogContent": "You do not have release permission. Please ask the project administrators '{{masterUsers}}' to authorize release permission.",
+  "Config.ModifyNoPermission.DialogTitle": "Apply for Configuration Permission",
+  "Config.ModifyNoPermission.DialogContent": "Please ask the project administrators '{{masterUsers}}' to authorize release or edit permission.",
+  "Config.MasterNoPermission.DialogTitle": "Apply for Configuration Permission",
+  "Config.MasterNoPermission.DialogContent": "You are not this project's administrator. Only project administrators have the permission to add clusters and namespaces. Please ask the project administrators '{{masterUsers}}' to assign administrator permission",
+  "Config.NamespaceLocked.DialogTitle": "Edit not allowed",
+  "Config.NamespaceLocked.DialogContent": "Current namespace is being edited by '{{lockOwner}}', and a release phase can only be edited by one person.",
   "Config.RollbackAlert.DialogTitle": "Rollback",
-  "Config.RollbackAlert.DialogContent": "Are you sure you want to roll back?",
+  "Config.RollbackAlert.DialogContent": "Are you sure to roll back?",
   "Config.EmergencyPublishAlert.DialogTitle": "Emergency release",
-  "Config.EmergencyPublishAlert.DialogContent": "Are you sure it needs to be released urgently?",
+  "Config.EmergencyPublishAlert.DialogContent": "Are you sure to perform the emergency release?",
   "Config.DeleteBranch.DialogTitle": "Delete grayscale",
-  "Config.DeleteBranch.DialogContent": "Deleting gray level will lose the configuration of gray level. Are you sure you want to delete it?",
+  "Config.DeleteBranch.DialogContent": "Deleting grayscale will lose the grayscale configurations. Are you sure to delete it?",
   "Config.UpdateRuleTips.DialogTitle": "Update gray rule prompt",
-  "Config.UpdateRuleTips.DialogContent": "Grayscale rules are in effect, but it is found that grayscale versions have unpublished configurations that require manual grayscale publishing to take effect.",
+  "Config.UpdateRuleTips.DialogContent": "Grayscale rules are in effect. However there are unreleased configurations in grayscale version, they won't be effective until a manual grayscale release is performed.",
   "Config.MergeAndReleaseDeny.DialogTitle": "Full release",
-  "Config.MergeAndReleaseDeny.DialogContent": "The main version of namespace has unpublished configuration. Please publish the main version configuration first.",
+  "Config.MergeAndReleaseDeny.DialogContent": "The main version has unreleased configuration. Please release the main version first.",
   "Config.GrayReleaseWithoutRulesTips.DialogTitle": "Missing gray rule prompt",
-  "Config.GrayReleaseWithoutRulesTips.DialogContent": "The grayscale version has not been configured with any grayscale rules. Please configure the grayscale rules.",
-  "Config.DeleteNamespaceDenyForMasterInstance.DialogTitle": "Delete Namespace warning information",
-  "Config.DeleteNamespaceDenyForMasterInstance.DialogContent": "It was found that <B>'{{delete Namespace Context. namespace. instancesCount}}'</b> instances were using Namespace ('{{delete Namespace Context. namespace. baseInfo. namespace Name}}'), and deleting Namespace would result in instances not getting configuration. <br> Please go to <ins> \"Instance List\"</ins> to confirm the instance information. If you confirm that the relevant instances are no longer using the Namespace configuration, you can contact the Apollo responsible person to delete the instance information (Instance Config) or wait for the instance to expire automatically 24 hours before deleting.",
-  "Config.DeleteNamespaceDenyForBranchInstance.DialogTitle": "Delete Namespace warning information",
-  "Config.DeleteNamespaceDenyForBranchInstance.DialogContent": "It was found that <B>'{{delete Namespace Context. namespace. branch. latest Release Instances. total}}'</b> instances were using the gray level version of Namespace ('{{delete Namespace Context. namespace. baseInfo. namespace Name}}') configuration, and deleting Namespace would result in instances not getting the configuration. <br> Please go to <ins> \"gray version\"=> \"instance list\"</ins> to confirm the instance information. If you confirm that the relevant instances are no longer using the Namespace configuration, you can contact the Apollo responsible person to delete the instance information (Instance Config) or wait for the instance to expire automatically 24 hours before deleting.",
+  "Config.GrayReleaseWithoutRulesTips.DialogContent": "The grayscale version has not configured any grayscale rule. Please configure the grayscale rules.",
+  "Config.DeleteNamespaceDenyForMasterInstance.DialogTitle": "Delete namespace warning",
+  "Config.DeleteNamespaceDenyForMasterInstance.DialogContent": "There are <b>'{{deleteNamespaceContext.namespace.instancesCount}}'</b> instances using namespace ('{{deleteNamespaceContext.namespace.baseInfo.namespaceName}}'), and deleting namespace would cause those instances failed to fetch configuration. <br> Please go to <ins> \"Instance List\"</ins> to confirm the instance information. If you confirm that the relevant instances are no longer using the namespace configuration, you can contact the Apollo administrators to delete the instance information (Instance Config) or wait for the instance to expire automatically 24 hours before deletion.",
+  "Config.DeleteNamespaceDenyForBranchInstance.DialogTitle": "Delete namespace warning information",
+  "Config.DeleteNamespaceDenyForBranchInstance.DialogContent": "There are <b>'{{deleteNamespaceContext.namespace.branch.latestReleaseInstances.total}}'</b> instances using the graysacle version of namespace ('{{deleteNamespaceContext.namespace.baseInfo.namespaceName}}') configuration, and deleting Namespace would cause those instances failed to fetch configuration. <br> Please go to <ins> \"Grayscale Version\"=> \"Instance List\"</ins> to confirm the instance information. If you confirm the relevant instances are no longer using the namespace configuration, you can contact the Apollo administrators to delete the instance information (Instance Config) or wait for the instance to expire automatically 24 hours before deletion.",
   "Config.DeleteNamespaceDenyForPublicNamespace.DialogTitle": "Delete Namespace Failure Tip",
   "Config.DeleteNamespaceDenyForPublicNamespace.DialogContent": "Delete Namespace Failure Tip",
   "Config.DeleteNamespaceDenyForPublicNamespace.PleaseEnterAppId": "Please enter appId",
-  "Config.SyntaxCheckFailed.DialogTitle": "Grammar Checking Error",
+  "Config.SyntaxCheckFailed.DialogTitle": "Syntax Check Error",
   "Config.SyntaxCheckFailed.DialogContent": "Delete Namespace Failure Tip",
-  "Config.CreateBranchTips.DialogTitle": "Creating Grayscale Notice",
-  "Config.CreateBranchTips.DialogContent": "By creating gray level version, you can do gray level test for some configurations <br> gray level process as follows: <br> &nbsp; &nbsp; (1) create gray level version <br> &nbsp; &nbsp; (2) configure gray level configuration items <br> &nbsp; &nbsp; (3) configure gray level rules. If it is private namespace, it can be gray level according to the IP of client, if it is public name. Gray level <br> &nbsp; &nbsp; &nbsp; 4. Gray level publishing <br> gray level version has two final results: <b> full publishing and abandoning gray level </b> <br> <b> full publishing </b>: gray level configuration is combined with the main version and distributed, all clients will use the combined configuration <br> <b> abandon gray level </b>: remove gray. In degree version, all clients will use the configuration <br> of the main version: <br> &nbsp; &nbsp; &nbsp; 1. If the gray level version has been published, then the gray level rules will be changed immediately without the need for gray level publication again.",
-  "Config.ProjectMissEnvInfos": "Current project has environment missing, please click on the left side of the page to fill in the missing environment to fill in the data.",
-  "Config.ProjectMissNamespaceInfos": "There is a missing Namespace in the current environment. Please click \"Fill in Namespace\" on the left side of the page to fill in the data.",
-  "Config.SystemError": "System error, please try again or contact the system manager",
-  "Config.FavoriteSuccessfully": "Successful collection",
-  "Config.FavoriteFailed": "Collection failure",
-  "Config.CancelledFavorite": "Successful Cancellation of Collection",
-  "Config.CanceFavoriteFailed": "Failure to Cancel Collection",
-  "Config.GetrUserInfoFailed": "Failed to obtain user login information",
-  "Config.LoadingAllNamespaceError": "Error loading configuration information",
-  "Config.CanceFavoriteError": "Failure to Cancel Collection",
-  "Config.Deleted": "Successful deletion",
-  "Config.DeleteFailed": "Delete failed",
-  "Config.GrayscaleCreated": "Creating Grayscale Successfully",
+  "Config.CreateBranchTips.DialogTitle": "Create Grayscale Notice",
+  "Config.CreateBranchTips.DialogContent": "By creating grayscale version, you can do grayscale test for some configurations. <br> Grayscale process is as follows: <br> &nbsp; &nbsp; 1. Create grayscale version <br> &nbsp; &nbsp; 2. Configure grayscale configuration items <br> &nbsp; &nbsp; 3. Configure grayscale rules. If it is a private namespace, it can be grayed according to the IP of client. If it is a public namespace, it can be grayed accodring to both appid and the IP. <br> &nbsp; &nbsp; 4. Grayscale release <br> Grayscale version has two final results: <b> Full release and Abandon grayscale</b> <br> <b>Full release</b>: grayscale configurations are merged with the main version and released, all clients will use the merged configurations <br> <b> Abandon grayscale</b>: Delete grayscale version. All clients will use the configurations of the main version<br> Notice: <br> &nbsp; &nbsp; 1. If the grayscale version has been released, then the grayscale rules will be effective immediately without the need to release grayscale configuration again.",
+  "Config.ProjectMissEnvInfos": "There are missing environments in the current project, please click \"Recover Environments\" on the left side of the page to do the recovery.",
+  "Config.ProjectMissNamespaceInfos": "There are missing namespaces in the current environment. Please click \"Recover Namespaces\" on the left side of the page to do the recovery.",
+  "Config.SystemError": "System error, please try again or contact the system administrator",
+  "Config.FavoriteSuccessfully": "Favorite Successfully",
+  "Config.FavoriteFailed": "Failed to favorite",
+  "Config.CancelledFavorite": "Cancel favorite successfully",
+  "Config.CancelFavoriteFailed": "Failed to cancel the favorite",
+  "Config.GetUserInfoFailed": "Failed to obtain user login information",
+  "Config.LoadingAllNamespaceError": "Failed to load configuration",
+  "Config.CancelFavoriteError": "Failure to Cancel Collection",
+  "Config.Deleted": "Delete Successfully",
+  "Config.DeleteFailed": "Failed to delete",
+  "Config.GrayscaleCreated": "Create Grayscale Successfully",
   "Config.GrayscaleCreateFailed": "Failed to create grayscale",
-  "Config.BranchDeleted": "Branch deletion succeeded",
-  "Config.BranchDeleteFailed": "Branch deletion failed",
-  "Config.DeleteNamespaceFailedTips": "The following applications are associated with this public Namespace and must delete all associated Namespace before deleting the public Namespace",
-  "Config.DeleteNamespaceNoPermissionFailedTitle": "Delete failed",
-  "Config.DeleteNamespaceNoPermissionFailedTips": "You do not have Project Administrator privileges. Only Administrators can delete Namespace. Please find Project Administrator [{{usres}}] to delete Namespace.",
+  "Config.BranchDeleted": "Delete branch successfully",
+  "Config.BranchDeleteFailed": "Failed to delete branch",
+  "Config.DeleteNamespaceFailedTips": "The following projects are associated with this public namespace and they must all be deleted deleting the public Namespace",
+  "Config.DeleteNamespaceNoPermissionFailedTitle": "Failed to delete",
+  "Config.DeleteNamespaceNoPermissionFailedTips": "You do not have Project Administrator permission. Only Administrators can delete namespace. Please ask Project Administrators [{{usres}}] to delete namespace.",
   "Delete.Title": "Delete applications, clusters, AppNamespace",
-  "Delete.DeleteApp": "Delete applications",
-  "Delete.DeleteAppTips": "(Because deleting applications has a large impact, system administrators are only allowed to delete them for the time being. Make sure that no client reads the configuration of the application before deleting it.)",
+  "Delete.DeleteApp": "Delete application",
+  "Delete.DeleteAppTips": "(Because deleting applications has very large impacts, only system administrators are allowed to delete them for the time being. Make sure that no client fetches the configuration of the application before deleting it.)",
   "Delete.AppIdTips": "(Please query application information before deleting)",
   "Delete.AppInfo": "Application information",
   "Delete.DeleteCluster": "Delete clusters",
-  "Delete.DeleteClusterTips": "(Because deleting the cluster has a large impact, only system administrators are allowed to delete it for the time being. Make sure that no client reads the configuration of the cluster before deleting it.)",
+  "Delete.DeleteClusterTips": "(Because deleting clusters has very large impacts, only system administrators are allowed to delete them for the time being. Make sure that no client fetches the configuration of the cluster before deleting it.)",
   "Delete.EnvName": "Environment Name",
-  "Delete.ClusterNameTips": "(Please query application cluster information before deleting)",
+  "Delete.ClusterNameTips": "(Please query cluster information before deletion)",
   "Delete.ClusterInfo": "Cluster information",
   "Delete.DeleteNamespace": "Delete AppNamespace",
-  "Delete.DeleteNamespaceTips": "(Note that Namespace and AppNamespace in all environments will be deleted! If you just want to delete the Namespace of an environment, let the user delete it on the project page!",
-  "Delete.DeleteNamespaceTips2": "At present, users can delete the associated Namespace and private Namespace by themselves, but they can not delete the meta-information of AppNamespace. Because deleting AppNamespace has a large impact, it is only allowed to be deleted by system administrators for the time being. For public Namespace, it is necessary to ensure that the associated AppNamespace is not applied.",
+  "Delete.DeleteNamespaceTips": "(Note that Namespace and AppNamespace in all environments will be deleted! If you just want to delete the namespace of some environment, let the user delete it on the project page!",
+  "Delete.DeleteNamespaceTips2": "Currently users can delete the associated namespace and private namespace by themselves, but they can not delete the AppNamespace. Because deleting AppNamespace has very large impacts, it is only allowed to be deleted by system administrators for the time being. For public Namespace, it is necessary to ensure that no application associates the AppNamespace",
   "Delete.AppNamespaceName": "AppNamespace name",
-  "Delete.AppNamespaceNameTips": "(For namespaces of non-property types, add type suffixes, such as apollo.xml)",
+  "Delete.AppNamespaceNameTips": "(For non-properties namespaces, please add the suffix, such as apollo.xml)",
   "Delete.AppNamespaceInfo": "AppNamespace Information",
-  "Delete.IsRootUserTips": "The current page is open only to Apollo administrators",
+  "Delete.IsRootUserTips": "The current page is only accessible to Apollo administrators",
   "Delete.PleaseEnterAppId": "Please enter appId",
-  "Delete.AppIdNotFound": "AppId:'{{appId}}'does not exist!",
-  "Delete.AppInfoContent": "Application name:'{{appName}}'department:'{{departmentName}} ({{departmentId}})'person in charge:'{{ownerName}}'",
-  "Delete.ConfirmDeleteAppId": "Confirm to delete AppId:'{{appId}}'?",
-  "Delete.Deleted": "Successful deletion",
-  "Delete.PleaseEnterAppIdAndEnvAndCluster": "Enter appId, environment, and cluster name",
-  "Delete.ClusterInfoContent": "AppId:'{{appId}}'environment:'{{env}}' cluster name:'{{cluster Name}}'",
-  "Delete.ConfirmDeleteCluster": "Confirm to delete the cluster? AppId:'{{appId}}'environment:'{{env}}' cluster name:'{{cluster Name}}'",
+  "Delete.AppIdNotFound": "AppId: '{{appId}}' does not exist!",
+  "Delete.AppInfoContent": "Application name: '{{appName}}' department: '{{departmentName}}({{departmentId}})' owner: '{{ownerName}}'",
+  "Delete.ConfirmDeleteAppId": "Are you sure to delete AppId: '{{appId}}'?",
+  "Delete.Deleted": "Delete Successfully",
+  "Delete.PleaseEnterAppIdAndEnvAndCluster": "Please enter appId, environment, and cluster name",
+  "Delete.ClusterInfoContent": "AppId: '{{appId}}' environment: '{{env}}' cluster name: '{{clusterName}}'",
+  "Delete.ConfirmDeleteCluster": "Are you sure to delete the cluster? AppId: '{{appId}}' environment: '{{env}}' cluster name:'{{clusterName}}'",
   "Delete.PleaseEnterAppIdAndNamespace": "Please enter appId and AppNamespace names",
-  "Delete.AppNamespaceInfoContent": "AppId:'{{appId}}'AppNamespace name:'{{namespace}}' isPublic:'{{isPublic}}'",
-  "Delete.ConfirmDeleteNamespace": "Confirm to delete AppNamespace and Namespace for all environments? AppId:'{{appId}}'environment:'All environments' AppNamespace name:'{{namespace}}'",
+  "Delete.AppNamespaceInfoContent": "AppId: '{{appId}}' AppNamespace name: '{{namespace}}' isPublic: '{{isPublic}}'",
+  "Delete.ConfirmDeleteNamespace": "Are you sure to delete AppNamespace and Namespace for all environments? AppId: '{{appId}}' environment: 'All environments' AppNamespace name: '{{namespace}}'",
   "Namespace.Title": "New Namespace",
   "Namespace.UnderstandMore": "(Click to learn more about Namespace)",
-  "Namespace.Link.Tips1": "Applications can override the configuration of a common Namespace by associating a common namespace",
-  "Namespace.Link.Tips2": "If the application does not need to override the configuration of the common Namespace, then there is no need to associate the common Namespace",
-  "Namespace.CreatePublic.Tips1": "The configuration of the public Namespace can be read by any project",
-  "Namespace.CreatePublic.Tips2": "Configuration of common components can be achieved by creating a common Namespace, and the need for multiple applications to share the same configuration can be achieved.",
-  "Namespace.CreatePublic.Tips3": "If other applications need to cover the configuration of the public part, you can associate the public Namespace with other applications, and then configure the configuration that needs to be covered in the associated Namespace.",
-  "Namespace.CreatePublic.Tips4": "If other applications do not need to cover the configuration of common parts, then there is no need to associate common Namespace with other applications.",
-  "Namespace.CreatePrivate.Tips1": "The configuration of private Namespace can only be obtained by the application to which it belongs.",
-  "Namespace.CreatePrivate.Tips2": "Group management configuration can be achieved by creating a private Namespace",
-  "Namespace.CreatePrivate.Tips3": "The format of private Namespace can be xml, yml, yaml, json, txt. You can get the content of Namespace in non-property format through the ConfigFile interface in apollo-client.",
-  "Namespace.CreatePrivate.Tips4": "The 1.3.0 and above versions of apollo-client provide better support for yaml/yml. Config objects can be obtained directly through ConfigService.getConfig (\"someNamespace.yml\"), or through @EnableApolloConfig (\"someNamespace.yml\") or apollo.bootstrap.namespaces=Namespace.yml to inject YML configuration into Spring/Spring Boot. Go in",
-  "Namespace.CreateNamespcae": "Create Namespace",
-  "Namespace.AssociationPublicNamespcae": "Associated Public Namespace",
+  "Namespace.Link.Tips1": "Applications can override the configuration of a public namespace by associating a public namespace",
+  "Namespace.Link.Tips2": "If the application does not need to override the configuration of the public namespace, then there is no need to associate the public namespace",
+  "Namespace.CreatePublic.Tips1": "The configuration of the public Namespace can be fetched by any application",
+  "Namespace.CreatePublic.Tips2": "Configuration of public components or the need for multiple applications to share the same configuration can be achieved by creating a public namespace.",
+  "Namespace.CreatePublic.Tips3": "If other applications need to override the configuration of the public namespace, you can associate the public namespace in other applications, and then configure the configuration that needs to be overridden in the associated namespace.",
+  "Namespace.CreatePublic.Tips4": "If other applications do not need to override the configuration of public namespace, then there is no need to associate public namespace in other applications.",
+  "Namespace.CreatePrivate.Tips1": "The configuration of a private Namespace can only be fetched by the application to which it belongs.",
+  "Namespace.CreatePrivate.Tips2": "Group management configuration can be achieved by creating a private namespace",
+  "Namespace.CreatePrivate.Tips3": "The format of private namespaces can be xml, yml, yaml, json, txt. You can get the content of namespace in non-property format through the ConfigFile interface in apollo-client.",
+  "Namespace.CreatePrivate.Tips4": "The 1.3.0 and above versions of apollo-client provide better support for yaml/yml. Config objects can be obtained directly through ConfigService.getConfig(\"someNamespace.yml\"), or through @EnableApolloConfig(\"someNamespace.yml\") or apollo.bootstrap.namespaces=someNamespace.yml to inject YML configuration into Spring/Spring Boot",
+  "Namespace.CreateNamespace": "Create Namespace",
+  "Namespace.AssociationPublicNamespace": "Associate Public Namespace",
   "Namespace.ChooseCluster": "Select Cluster",
   "Namespace.NamespaceName": "Name",
-  "Namespace.AutoAddDepartmentPrefix": "Automatically add Department prefix",
-  "Namespace.AutoAddDepartmentPrefixTips": "(The name of a public Namespace needs to be globally unique, and adding a department prefix helps ensure global uniqueness)",
-  "Namespace.NamespcaeType": "type",
-  "Namespace.NamespcaeType.Public": "Public",
-  "Namespace.NamespcaeType.Private": "Private",
+  "Namespace.AutoAddDepartmentPrefix": "Add department prefix",
+  "Namespace.AutoAddDepartmentPrefixTips": "(The name of a public namespace needs to be globally unique, and adding a department prefix helps ensure global uniqueness)",
+  "Namespace.NamespaceType": "Type",
+  "Namespace.NamespaceType.Public": "Public",
+  "Namespace.NamespaceType.Private": "Private",
   "Namespace.Remark": "Remarks",
   "Namespace.Namespace": "Namespace",
-  "Namespace.PleaseChooseNamespace": "Please select Namespace",
-  "Namespace.LoadingPublicNamespaceError": "Loading common namespace errors",
-  "Namespace.LoadingAppInfoError": "Error loading App information",
+  "Namespace.PleaseChooseNamespace": "Please select namespace",
+  "Namespace.LoadingPublicNamespaceError": "Failed to load public namespace",
+  "Namespace.LoadingAppInfoError": "Failed to load App information",
   "Namespace.PleaseChooseCluster": "Select Cluster",
-  "Namespace.ChecknamespaceNameLengthTip": "The namespace name should not be greater than 100 characters. Department prefix:'{{department Length}}'characters, name {{namespace Length}} characters",
-  "SericeConfig.Title": "Application Configuration",
-  "SericeConfig.Tips": "(Maintain Apollo PortalDB.ServerConfig table data, override configuration items if they already exist, or create configuration items. Configuration updates take effect automatically in a minute)",
-  "SericeConfig.Key": "Key",
-  "SericeConfig.KeyTips": "(Please query the configuration information before modifying the configuration)",
-  "SericeConfig.Value": "Value",
-  "SericeConfig.Comment": "Comment",
-  "SericeConfig.Saved": "Successful Preservation",
-  "SericeConfig.SaveFailed": "Save failed",
-  "SericeConfig.PleaseEnterKey": "Please enter key",
-  "SericeConfig.KeyNotExistsAndCreateTip": "Key:'{{key}}'does not exist. Click Save to create the configuration item.",
-  "SericeConfig.KeyExistsAndSaveTip": "Key:'{{key}}'already exists. Clicking Save will override the configuration item.",
-  "SystemInfo.Title": "system information",
+  "Namespace.CheckNamespaceNameLengthTip": "The namespace name should not be longer than 32 characters. Department prefix:'{{departmentLength}}' characters, name {{namespaceLength}} characters",
+  "ServiceConfig.Title": "System Configuration",
+  "ServiceConfig.Tips": "(Maintain Apollo PortalDB.ServerConfig table data, will override configuration items if they already exist, or create configuration items. Configuration updates take effect automatically in a minute)",
+  "ServiceConfig.Key": "Key",
+  "ServiceConfig.KeyTips": "(Please query the configuration information before modifying the configuration)",
+  "ServiceConfig.Value": "Value",
+  "ServiceConfig.Comment": "Comment",
+  "ServiceConfig.Saved": "Save Successfully",
+  "ServiceConfig.SaveFailed": "Failed to Save",
+  "ServiceConfig.PleaseEnterKey": "Please enter key",
+  "ServiceConfig.KeyNotExistsAndCreateTip": "Key: '{{key}}' does not exist. Click Save to create the configuration item.",
+  "ServiceConfig.KeyExistsAndSaveTip": "Key: '{{key}}' already exists. Click Save will override the configuration item.",
+  "SystemInfo.Title": "System Information",
   "SystemInfo.SystemVersion": "System version",
-  "SystemInfo.Tips1": "The environment list comes from the <strong>apollo.portal.envs</strong> configuration in Apollo PortalDB.ServerConfig, and can be accessed to <a href=\"{{serverConfigUrl}}\"> system parameters </a> page configuration. More information can be referred to <a href=\"{{wikiUrl}}\"> distributed deployment guide </a> in <strong>apollo.portal.envs-a supportable environment list.</ strong> chapters.",
-  "SystemInfo.Tips2": "The Meta server address shows the meta server information for this environment configuration. For more information, please refer to the <strong> meta service information for configuring apollo-portal </strong> section in <a href=\"{{wikiUrl}}\"> Distributed Deployment Guide </a>.",
+  "SystemInfo.Tips1": "The environment list comes from the <strong>apollo.portal.envs</strong> configuration in Apollo PortalDB.ServerConfig, and can be configured in <a href=\"{{serverConfigUrl}}\">System Configuration</a> page. For more information, please refer the <strong>apollo.portal.envs - supportable environment list</strong> section in <a href=\"{{wikiUrl}}\">Distributed Deployment Guide</a>.",
+  "SystemInfo.Tips2": "The meta server address shows the meta server information for this environment configuration. For more information, please refer the <strong>Configuring meta service information for apollo-portal</strong> section in <a href=\"{{wikiUrl}}\">Distributed Deployment Guide</a>.",
   "SystemInfo.Active": "Active",
-  "SystemInfo.ActiveTips": "(Current environment status is abnormal, please check with the system information below and Check Health results of AdminService)",
+  "SystemInfo.ActiveTips": "(Current environment status is abnormal, please diagnose with the system information below and Check Health results of AdminService)",
   "SystemInfo.MetaServerAddress": "Meta server address",
   "SystemInfo.ConfigServices": "Config Services",
   "SystemInfo.ConfigServices.Name": "Name",
@@ -480,97 +483,97 @@
   "SystemInfo.AdminServices.HomePageUrl": "Home Page Url",
   "SystemInfo.AdminServices.CheckHealth": "Check Health",
   "SystemInfo.NoAdminServiceTips": "No admin service found!",
-  "SystemInfo.IsRootUser": "The current page is open only to Apollo administrators",
-  "SystemRole.Title": "System privilege management",
-  "SystemRole.AddCreateAppRoleToUser": "Create application privileges for users",
-  "SystemRole.AddCreateAppRoleToUserTips": "(When role.create-application.enabled=true is set in system configurations, only super admin and those accounts with Create application privileges can create application)",
-  "SystemRole.ChooseUser": "User Selection",
-  "SystemRole.Add": "Add to",
-  "SystemRole.AuthorizedUser": "Users with privileges",
+  "SystemInfo.IsRootUser": "The current page is only accessible to Apollo administrators",
+  "SystemRole.Title": "System Permission Management",
+  "SystemRole.AddCreateAppRoleToUser": "Create application permission for users",
+  "SystemRole.AddCreateAppRoleToUserTips": "(When role.create-application.enabled=true is set in system configurations, only super admin and those accounts with Create application permission can create application)",
+  "SystemRole.ChooseUser": "Select User",
+  "SystemRole.Add": "Add",
+  "SystemRole.AuthorizedUser": "Users with permission",
   "SystemRole.ModifyAppAdminUser": "Modify Application Administrator Allocation Permissions",
   "SystemRole.ModifyAppAdminUserTips": "(When role.manage-app-master.enabled=true is set in system configurations, only super admin and those accounts with application administrator allocation permissions can modify the application's administrators)",
   "SystemRole.AppIdTips": "(Please query the application information first)",
   "SystemRole.AppInfo": "Application information",
   "SystemRole.AllowAppMasterAssignRole": "Allow this user to add Master as an administrator",
-  "SystemRole.DeleteAppMasterAssignRole": "Prohibit this user from adding Master as an administrator",
-  "SystemRole.IsRootUser": "The current page is open only to Apollo administrators",
-  "SystemRole.PleaseChooseUser": "Please select a user name",
-  "SystemRole.Added": "Added Successfully",
-  "SystemRole.AddFailed": "Failure to add",
-  "SystemRole.Deleted": "Successful deletion",
-  "SystemRole.DeleteFailed": "Delete failed",
-  "SystemRole.GetCanCreateProjectUsersError": "Error getting user list with creation project",
+  "SystemRole.DeleteAppMasterAssignRole": "Disallow this user to add Master as an administrator",
+  "SystemRole.IsRootUser": "The current page is only accessible to Apollo administrators",
+  "SystemRole.PleaseChooseUser": "Please select a user",
+  "SystemRole.Added": "Add Successfully",
+  "SystemRole.AddFailed": "Failed to add",
+  "SystemRole.Deleted": "Delete Successfully",
+  "SystemRole.DeleteFailed": "Failed to Delete",
+  "SystemRole.GetCanCreateProjectUsersError": "Error getting user list with create project permission",
   "SystemRole.PleaseEnterAppId": "Please enter appId",
-  "SystemRole.AppIdNotFound": "AppId:'{{appId}}'does not exist!",
-  "SystemRole.AppInfoContent": "Application name:'{{appName}}'department:'{{departmentName}} ({{departmentId}})'person in charge:'{{ownerName}}",
-  "SystemRole.DeleteMasterAssignRoleTips": "Verify that the user who deleted AppId:'{{appId}}':'{{userId}}'assigns permissions to the application administrator?",
-  "SystemRole.DeletedMasterAssignRoleTips": "Delete AppId:'{{appId}}'User:'{{userId}}' Allocate Application Administrator's Privileges Successfully",
-  "SystemRole.AllowAppMasterAssignRoleTips": "Verify that the user who added AppId:'{{appId}}':'{{userId}}'assigns the permissions of the application administrator?",
-  "SystemRole.AllowedAppMasterAssignRoleTips": "Users who add AppId:'{{appId}}':'{{userId}}'Allocate Application Administrator's Privileges Successfully",
-  "UserMange.Title": "user management",
-  "UserMange.TitleTips": "(Only valid for the default Spring Security simple authentication method: - Dapollo_profile = github, auth)",
-  "UserMange.UserName": "User name",
-  "UserMange.UserNameTips": "If the user name entered does not exist, create a new one. If it already exists, it is updated.",
+  "SystemRole.AppIdNotFound": "AppId: '{{appId}}' does not exist!",
+  "SystemRole.AppInfoContent": "Application name: '{{appName}}' department: '{{departmentName}}({{departmentId}})' owner: '{{ownerName}}'",
+  "SystemRole.DeleteMasterAssignRoleTips": "Are you sure to disallow the user '{{userId}}' to add Master as an administrator for AppId:'{{appId}}'?",
+  "SystemRole.DeletedMasterAssignRoleTips": "Disallow the user '{{userId}}' to add Master as an administrator for AppId:'{{appId}}' Successfully",
+  "SystemRole.AllowAppMasterAssignRoleTips": "Are you sure to allow the user '{{userId}}' to add Master as an administrator for AppId:'{{appId}}'?",
+  "SystemRole.AllowedAppMasterAssignRoleTips": "Allow the user '{{userId}}' to add Master as an administrator for AppId:'{{appId}}' Successfully",
+  "UserMange.Title": "User Management",
+  "UserMange.TitleTips": "(Only valid for the default Spring Security simple authentication method: - Dapollo_profile = github,auth)",
+  "UserMange.UserName": "User Name",
+  "UserMange.UserNameTips": "If the user name entered does not exist, will create a new one. If it already exists, then it will be updated.",
   "UserMange.Pwd": "Password",
-  "UserMange.Email": "mailbox",
-  "UserMange.Created": "Create User Success",
+  "UserMange.Email": "Email",
+  "UserMange.Created": "Create user successfully",
   "UserMange.CreateFailed": "Failed to create user",
   "Open.Manage.Title": "Open Platform",
-  "Open.Manage.CreateThirdApp": "Creating third-party applications",
+  "Open.Manage.CreateThirdApp": "Create third-party applications",
   "Open.Manage.CreateThirdAppTips": "(Note: Third-party applications can manage configuration through Apollo Open Platform)",
-  "Open.Manage.ThirdAppId": "Third party application ID",
-  "Open.Manage.ThirdAppIdTips": "(Before creating, please check if third-party applications have been applied for)",
+  "Open.Manage.ThirdAppId": "Third party appId",
+  "Open.Manage.ThirdAppIdTips": "(Please check if the third-party application has already exists first)",
   "Open.Manage.ThirdAppName": "Third party application name",
-  "Open.Manage.ThirdAppNameTips": "(Suggested format xx-yy-zz example: apollo-server)",
-  "Open.Manage.ProjectOwner": "Project Leader",
-  "Open.Manage.Create": "Establish",
-  "Open.Manage.GrantPermission": "Empowerment",
-  "Open.Manage.GrantPermissionTips": "Namespace level permissions include modifying and publishing Namespace. Application level permissions include creating Namespace, modifying or publishing any Namespace under an application.",
+  "Open.Manage.ThirdAppNameTips": "(Suggested format xx-yy-zz e.g. apollo-server)",
+  "Open.Manage.ProjectOwner": "Owner",
+  "Open.Manage.Create": "Create",
+  "Open.Manage.GrantPermission": "Authorization",
+  "Open.Manage.GrantPermissionTips": "(Namespace level permissions include edit and release namespace. Application level permissions include creating namespace, edit or release any namespace in the application.)",
   "Open.Manage.Token": "Token",
   "Open.Manage.ManagedAppId": "Managed AppId",
   "Open.Manage.ManagedNamespace": "Managed Namespace",
-  "Open.Manage.ManagedNamespaceTips": "(For namespaces of non-property types, add type suffixes, such as apollo.xml)",
+  "Open.Manage.ManagedNamespaceTips": "(For non-properties namespaces, please add the suffix, such as apollo.xml)",
   "Open.Manage.GrantType": "Authorization type",
   "Open.Manage.GrantType.Namespace": "Namespace",
   "Open.Manage.GrantType.App": "App",
-  "Open.Manage.GrantEnv": "Environmental Science",
-  "Open.Manage.GrantEnvTips": "(If you don't select, all environments have permissions. If you prompt Namespace's role does not exist, open the authorization page of the Namespace to trigger the privilege initialization action.)",
+  "Open.Manage.GrantEnv": "Environments",
+  "Open.Manage.GrantEnvTips": "(If you don't select any environment, then will have permissions to all environments.)",
   "Open.Manage.PleaseEnterAppId": "Please enter appId",
-  "Open.Manage.AppNotCreated": "App ('{{appId}}') was not created, please create it first",
-  "Open.Manage.GrantSuccessfully": "Empowerment Success",
-  "Open.Manage.GrantFailed": "Failure in empowerment",
-  "Namespace.Role.Title": "Authority Management",
-  "Namespace.Role.GrantModifyTo": "Right to amend",
-  "Namespace.Role.GrantModifyTo2": "(Configuration can be modified)",
+  "Open.Manage.AppNotCreated": "App('{{appId}}') does not exist, please create it first",
+  "Open.Manage.GrantSuccessfully": "Authorize Successfully",
+  "Open.Manage.GrantFailed": "Failed to authorize",
+  "Namespace.Role.Title": "Permission Management",
+  "Namespace.Role.GrantModifyTo": "Permission to edit",
+  "Namespace.Role.GrantModifyTo2": "(Can edit the configuration)",
   "Namespace.Role.AllEnv": "All environments",
-  "Namespace.Role.GrantPubishTo": "Right to issue",
-  "Namespace.Role.GrantPubishTo2": "(You can publish configurations)",
-  "Namespace.Role.Add": "Add to",
-  "Namespace.Role.NoPermisson": "You do not have permission yo!",
+  "Namespace.Role.GrantPublishTo": "Permission to release",
+  "Namespace.Role.GrantPublishTo2": "(Can release the configuration)",
+  "Namespace.Role.Add": "Add",
+  "Namespace.Role.NoPermission": "You do not have permission!",
   "Namespace.Role.InitNamespacePermissionError": "Error initializing authorization",
-  "Namespace.Role.GetEnvGrantUserError": "Authorized user error loading'{{env}}'",
-  "Namespace.Role.GetGrantUserError": "Error loading authorized user",
+  "Namespace.Role.GetEnvGrantUserError": "Failed to load authorized users for '{{env}}'",
+  "Namespace.Role.GetGrantUserError": "Failed to load authorized users",
   "Namespace.Role.PleaseChooseUser": "Please select the user",
-  "Namespace.Role.Added": "Added Successfully",
-  "Namespace.Role.AddFailed": "Failure to add",
-  "Namespace.Role.Deleted": "Successful deletion",
-  "Namespace.Role.DeleteFailed": "Delete failed",
-  "Config.Sync.Title": "Synchronization Configuration",
+  "Namespace.Role.Added": "Add Successfully",
+  "Namespace.Role.AddFailed": "Failed to add",
+  "Namespace.Role.Deleted": "Delete Successfully",
+  "Namespace.Role.DeleteFailed": "Failed to Delete",
+  "Config.Sync.Title": "Synchronize Configuration",
   "Config.Sync.FistStep": "(Step 1: Select Synchronization Information)",
   "Config.Sync.SecondStep": "(Step 2: Check Diff)",
-  "Config.Sync.PreviousStep": "The last step",
+  "Config.Sync.PreviousStep": "Previous step",
   "Config.Sync.NextStep": "Next step",
-  "Config.Sync.Sync": "synchronization",
+  "Config.Sync.Sync": "Synchronize",
   "Config.Sync.Tips": "Tips",
-  "Config.Sync.Tips1": "Configuration between multiple environments and clusters can be maintained by synchronous configuration function",
-  "Config.Sync.Tips2": "It should be noted that the application will not take effect until it is released after synchronization.",
+  "Config.Sync.Tips1": "Configurations between multiple environments and clusters can be maintained by synchronize configuration",
+  "Config.Sync.Tips2": "It should be noted that the configurations will not take effect until they are released after synchronization.",
   "Config.Sync.SyncNamespace": "Synchronized Namespace",
-  "Config.Sync.SyncToCluster": "Synchronize to that cluster",
-  "Config.Sync.NeedToSyncItem": "Configuration requiring synchronization",
+  "Config.Sync.SyncToCluster": "Synchronize to which cluster",
+  "Config.Sync.NeedToSyncItem": "Configuration to synchronize",
   "Config.Sync.SortByLastModifyTime": "Filter by last update time",
-  "Config.Sync.BeginTime": "start time",
-  "Config.Sync.EndTime": "Ending time",
-  "Config.Sync.Filter": "filter",
+  "Config.Sync.BeginTime": "Start time",
+  "Config.Sync.EndTime": "End time",
+  "Config.Sync.Filter": "Filter",
   "Config.Sync.Rest": "Reset",
   "Config.Sync.ItemKey": "Key",
   "Config.Sync.ItemValue": "Value",
@@ -580,135 +583,137 @@
   "Config.Sync.IgnoreSync": "Ignore synchronization",
   "Config.Sync.Step2Type": "Type",
   "Config.Sync.Step2Key": "Key",
-  "Config.Sync.Step2SyncBefore": "Synchronization front",
-  "Config.Sync.Step2SyncAfter": "After Synchronization",
+  "Config.Sync.Step2SyncBefore": "Before Sync",
+  "Config.Sync.Step2SyncAfter": "After Sync",
   "Config.Sync.Step2Comment": "Comment",
-  "Config.Sync.Step2Operator": "operation",
-  "Config.Sync.NewAdd": "Newly added",
-  "Config.Sync.NoSyncItem": "Asynchronize the configuration",
-  "Config.Sync.Delete": "delete",
-  "Config.Sync.Update": "To update",
-  "Config.Sync.SyncSuccessfully": "Synchronization success!",
-  "Config.Sync.SyncFailed": "Synchronization failed!",
+  "Config.Sync.Step2Operator": "Operation",
+  "Config.Sync.NewAdd": "Add",
+  "Config.Sync.NoSyncItem": "Do not synchronize the configuration",
+  "Config.Sync.Delete": "Delete",
+  "Config.Sync.Update": "Update",
+  "Config.Sync.SyncSuccessfully": "Synchronize Successfully!",
+  "Config.Sync.SyncFailed": "Failed to Synchronize!",
   "Config.Sync.LoadingItemsError": "Error loading configuration",
   "Config.Sync.PleaseChooseNeedSyncItems": "Please select the configuration that needs synchronization",
   "Config.Sync.PleaseChooseCluster": "Select Cluster",
-  "Config.History.Title": "Publish History",
+  "Config.History.Title": "Release History",
   "Config.History.MasterVersionPublish": "Main version release",
   "Config.History.MasterVersionRollback": "Main version rollback",
   "Config.History.GrayscaleOperator": "Grayscale operation",
-  "Config.History.PublishHistory": "Publish History",
-  "Config.History.OperationType0": "General release",
+  "Config.History.PublishHistory": "Release History",
+  "Config.History.OperationType0": "Normal release",
   "Config.History.OperationType1": "Rollback",
-  "Config.History.OperationType2": "Grayscale Publishing",
-  "Config.History.OperationType3": "Updating gray rules",
-  "Config.History.OperationType4": "Full gray level Publishing",
-  "Config.History.OperationType5": "Grayscale Publishing (Main Version Publishing)",
-  "Config.History.OperationType6": "Grayscale publishing (main version rollback)",
-  "Config.History.OperationType7": "Abandon grayscale",
-  "Config.History.OperationType8": "Delete grayscale (full release)",
-  "Config.History.UrgentPublish": "Emergency release",
-  "Config.History.LoadingMore": "Load more",
-  "Config.History.ChangedItem": "Changed configuration",
-  "Config.History.AllItem": "Full configuration",
+  "Config.History.OperationType2": "Grayscale Release",
+  "Config.History.OperationType3": "Update Gray Rules",
+  "Config.History.OperationType4": "Full Grayscale Release",
+  "Config.History.OperationType5": "Grayscale Release(Main Version Release)",
+  "Config.History.OperationType6": "Grayscale Release(Main Version Rollback)",
+  "Config.History.OperationType7": "Abandon Grayscale",
+  "Config.History.OperationType8": "Delete Grayscale(Full Release)",
+  "Config.History.UrgentPublish": "Emergency Release",
+  "Config.History.LoadMore": "Load more",
+  "Config.History.ChangedItem": "Changed Configuration",
+  "Config.History.ChangedItemTips": "View changes between this release and the previous release",
+  "Config.History.AllItem": "Full Configuration",
+  "Config.History.AllItemTips": "View all configurations for this release",
   "Config.History.ChangeType": "Type",
   "Config.History.ChangeKey": "Key",
   "Config.History.ChangeValue": "Value",
   "Config.History.ChangeOldValue": "Old Value",
   "Config.History.ChangeNewValue": "New Value",
-  "Config.History.ChangeTypeNew": "Newly added",
-  "Config.History.ChangeTypeModify": "modify",
-  "Config.History.ChangeTypeDelete": "delete",
+  "Config.History.ChangeTypeNew": "Add",
+  "Config.History.ChangeTypeModify": "Update",
+  "Config.History.ChangeTypeDelete": "Delete",
   "Config.History.NoChange": "No configuration changes",
   "Config.History.NoItem": "No configuration",
-  "Config.History.GrayscaleRule": "Grayscale rule",
+  "Config.History.GrayscaleRule": "Grayscale Rule",
   "Config.History.GrayscaleAppId": "Grayscale AppId",
   "Config.History.GrayscaleIp": "Grayscale IP",
-  "Config.History.NoGrayscaleRule": "Grayless rule",
-  "Config.History.NoPermissonTips": "You are not the administrator of the project, and you do not have editing or publishing rights for the Namespace. You cannot view the publishing history.",
-  "Config.History.NoPublishHistory": "No release of historical information",
-  "Config.History.LoadingHistoryError": "No release of historical information",
-  "Config.Diff.Title": "Comparative configuration",
-  "Config.Diff.FirstStep": "(Step 1: Select comparative information)",
-  "Config.Diff.SecondStep": "(Step 2: View the differential configuration)",
-  "Config.Diff.PreviousStep": "The last step",
+  "Config.History.NoGrayscaleRule": "No Grayscale Rule",
+  "Config.History.NoPermissionTips": "You are not this project's administrator, nor you have edit or release permission for the namespace. Thus you cannot view the release history.",
+  "Config.History.NoPublishHistory": "No release history",
+  "Config.History.LoadingHistoryError": "No release history",
+  "Config.Diff.Title": "Compare Configuration",
+  "Config.Diff.FirstStep": "(Step 1: Select what to compare)",
+  "Config.Diff.SecondStep": "(Step 2: View the differences)",
+  "Config.Diff.PreviousStep": "Previous step",
   "Config.Diff.NextStep": "Next step",
   "Config.Diff.TipsTitle": "Tips",
-  "Config.Diff.Tips": "By comparing configuration functions, you can see configuration differences between multiple environments and clusters",
+  "Config.Diff.Tips": "By comparing configuration, you can see configuration differences between multiple environments and clusters",
   "Config.Diff.DiffCluster": "Clusters to be compared",
-  "Config.Diff.HasDiffComment": "Compare notes or not",
+  "Config.Diff.HasDiffComment": "Whether to compare comments or not",
   "Config.Diff.PleaseChooseTwoCluster": "Please select at least two clusters",
-  "App.CreateProject": "Create a project",
-  "App.AppIdTips": "(Apply unique identifiers)",
-  "App.AppNameTips": "(建议格式 xx-yy-zz 例:apollo-server)",
-  "App.AppOwnerTips": "(After enabling the application administrator allocation restrictions, the application manager and project administrator default to this account, not optional)",
-  "App.AppAdminTips1": "(The application manager defaults to project administrator privileges.",
-  "App.AppAdminTips2": "Project administrators can create Namespace, cluster, and assign user privileges)",
-  "App.Setting.Title": "project management",
+  "App.CreateProject": "Create Project",
+  "App.AppIdTips": "(Application's unique identifiers)",
+  "App.AppNameTips": "(Suggested format xx-yy-zz e.g. apollo-server)",
+  "App.AppOwnerTips": "(After enabling the application administrator allocation restrictions, the application owner and project administrator are default to current account, not subject to change)",
+  "App.AppAdminTips1": "(The application owner has project administrator permission by default.",
+  "App.AppAdminTips2": "Project administrators can create namespace, cluster, and assign user permissions)",
+  "App.Setting.Title": "Manage Project",
   "App.Setting.Admin": "Administrators",
-  "App.Setting.AdminTips": "(Project administrators have the following permissions: 1. Create Namespace 2. Create clusters 3. Manage projects, Namespace permissions)",
-  "App.Setting.Add": "Add to",
-  "App.Setting.BasicInfo": "Essential information",
-  "App.Setting.ProjectName": "entry name",
-  "App.Setting.ProjectNameTips": "(Suggested format xx-yy-zz example: apollo-server)",
-  "App.Setting.ProjectOwner": "Project Leader",
+  "App.Setting.AdminTips": "(Project administrators have the following permissions: 1. Create namespace 2. Create clusters 3. Manage project and namespace permissions)",
+  "App.Setting.Add": "Add",
+  "App.Setting.BasicInfo": "Basic information",
+  "App.Setting.ProjectName": "App Name",
+  "App.Setting.ProjectNameTips": "(Suggested format xx-yy-zz e.g. apollo-server)",
+  "App.Setting.ProjectOwner": "Owner",
   "App.Setting.Modify": "Modify project information",
-  "App.Setting.Cancel": "Cancel modification",
-  "App.Setting.NoPermissonTips": "You do not have permission to operate, please find [{{users}}] open permission",
+  "App.Setting.Cancel": "Cancel",
+  "App.Setting.NoPermissionTips": "You do not have permission to operate, please ask [{{users}}] to authorize",
   "App.Setting.DeleteAdmin": "Delete Administrator",
   "App.Setting.CanNotDeleteAllAdmin": "Cannot delete all administrators",
-  "App.Setting.PleaseChooseUser": "Please select the user",
-  "App.Setting.Added": "Added Successfully",
-  "App.Setting.AddFailed": "添加失败",
-  "App.Setting.Deleted": "删除成功",
-  "App.Setting.DeleteFailed": "Delete failed",
-  "App.Setting.Modifed": "Successful revision",
+  "App.Setting.PleaseChooseUser": "Please select a user",
+  "App.Setting.Added": "Add Successfully",
+  "App.Setting.AddFailed": "Failed to Add",
+  "App.Setting.Deleted": "Delete Successfully",
+  "App.Setting.DeleteFailed": "Failed to Delete",
+  "App.Setting.Modified": "Update Successfully",
   "Valdr.App.AppId.Size": "AppId cannot be longer than 32 characters",
   "Valdr.App.AppId.Required": "AppId cannot be empty",
-  "Valdr.App.appName.Size": "The application name cannot be longer than 128 characters",
-  "Valdr.App.appName.Required": "Application name cannot be empty",
+  "Valdr.App.appName.Size": "The app name cannot be longer than 128 characters",
+  "Valdr.App.appName.Required": "App name cannot be empty",
   "Valdr.Cluster.ClusterName.Size": "Cluster names cannot be longer than 32 characters",
   "Valdr.Cluster.ClusterName.Required": "Cluster name cannot be empty",
-  "Valdr.AppNamespace.NamespaceName.Size": "Namespace name cannot be longer than 100 characters",
+  "Valdr.AppNamespace.NamespaceName.Size": "Namespace name cannot be longer than 32 characters",
   "Valdr.AppNamespace.NamespaceName.Required": "Namespace name cannot be empty",
-  "Valdr.AppNamespace.Comment.Size": "Note length should not exceed 64 characters",
+  "Valdr.AppNamespace.Comment.Size": "Comment length should not exceed 64 characters",
   "Valdr.Item.Key.Size": "Key cannot be longer than 128 characters",
   "Valdr.Item.Key.Required": "Key can't be empty",
-  "Valdr.Item.Comment.Size": "Note length should not exceed 64 characters",
+  "Valdr.Item.Comment.Size": "Comment length should not exceed 64 characters",
   "Valdr.Release.ReleaseName.Size": "Release Name cannot be longer than 64 characters",
   "Valdr.Release.ReleaseName.Required": "Release Name cannot be empty",
-  "Valdr.Release.Comment.Size": "Note length should not exceed 64 characters",
-  "ApolloConfirmDialog.DefaultConfirmBtnName": "confirm",
-  "ApolloConfirmDialog.SearchPlaceHolder": "Search items (AppId, project name)",
+  "Valdr.Release.Comment.Size": "Comment length should not exceed 64 characters",
+  "ApolloConfirmDialog.DefaultConfirmBtnName": "OK",
+  "ApolloConfirmDialog.SearchPlaceHolder": "Search items (App Id, App Name)",
   "RulesModal.ChooseInstances": "Select from the list of instances",
-  "RulesModal.InvalidIp": "Illegal IP Address:'{{ip}}'",
+  "RulesModal.InvalidIp": "Illegal IP Address: '{{ip}}'",
   "RulesModal.GrayscaleAppIdCanNotBeNull": "Grayscale AppId cannot be empty",
-  "RulesModal.AppIdExistsRule": "There are already rules for AppId='{{appId}}'",
+  "RulesModal.AppIdExistsRule": "Rules already exist for AppId='{{appId}}'",
   "RulesModal.IpListCanNotBeNull": "IP list cannot be empty",
   "ItemModal.KeyExists": "Key='{{key}}' already exists",
-  "ItemModal.AddedTips": "Successful addition. Publish if necessary",
-  "ItemModal.AddFailed": "Failure to add",
-  "ItemModal.PleaseChooseCluster": "Select Cluster",
-  "ItemModal.ModifedTips": "Successful update, if necessary, please publish",
-  "ItemModal.ModifyFailed": "Update failed",
+  "ItemModal.AddedTips": "Add Successfully. need to release configuration to take effect",
+  "ItemModal.AddFailed": "Failed to Add",
+  "ItemModal.PleaseChooseCluster": "Please Select Cluster",
+  "ItemModal.ModifiedTips": "Update Successfully. need to release configuration to take effect",
+  "ItemModal.ModifyFailed": "Failed to Update",
   "ItemModal.Tabs": "Tab character",
   "ItemModal.NewLine": "Newline character",
   "ItemModal.Space": "Blank space",
-  "ApolloNsPanel.LoadingHistoryError": "Error loading and modifying history",
-  "ApolloNsPanel.LoadingGrayscaleError": "Error loading and modifying history",
-  "ApolloNsPanel.Deleted": "Successful deletion",
-  "ApolloNsPanel.GrayscaleModifed": "Successful updating of gray rules",
-  "ApolloNsPanel.GrayscaleModifyFailed": "Failure to update gray rules",
-  "ApolloNsPanel.ModifedTips": "Updates are successful. Publish them to take effect",
-  "ApolloNsPanel.ModifyFailed": "Update failed",
-  "ApolloNsPanel.GrammarIsright": "Grammar is correct",
-  "ReleaseModal.Published": "Publish suceesssful",
-  "ReleaseModal.PublishFailed": "Publish failed",
-  "ReleaseModal.GrayscalePublished": "Successful Grayscale Release",
-  "ReleaseModal.GrayscalePublishFailed": "Grayscale publish failed",
-  "ReleaseModal.AllPublished": "Full publish successful",
-  "ReleaseModal.AllPublishFailed": "Full publish failed",
-  "Rollback.NoRollbackList": "No published history to rollback",
-  "Rollback.RollbackSuccessfully": "Rollback successful",
-  "Rollback.RollbackFailed": "Rollback failed"
+  "ApolloNsPanel.LoadingHistoryError": "Failed to load change history",
+  "ApolloNsPanel.LoadingGrayscaleError": "Failed to load change history",
+  "ApolloNsPanel.Deleted": "Delete Successfully",
+  "ApolloNsPanel.GrayscaleModified": "Update grayscale rules successfully",
+  "ApolloNsPanel.GrayscaleModifyFailed": "Failed to update grayscale rules",
+  "ApolloNsPanel.ModifiedTips": "Update Successfully. need to release configuration to take effect",
+  "ApolloNsPanel.ModifyFailed": "Failed to Update",
+  "ApolloNsPanel.GrammarIsright": "Syntax is correct",
+  "ReleaseModal.Published": "Release Successfully",
+  "ReleaseModal.PublishFailed": "Failed to Release",
+  "ReleaseModal.GrayscalePublished": "Grayscale Release Successfully",
+  "ReleaseModal.GrayscalePublishFailed": "Failed to Grayscale Release",
+  "ReleaseModal.AllPublished": "Full Release Successfully",
+  "ReleaseModal.AllPublishFailed": "Failed to Full Release",
+  "Rollback.NoRollbackList": "No released history to rollback",
+  "Rollback.RollbackSuccessfully": "Rollback Successfully",
+  "Rollback.RollbackFailed": "Failed to Rollback"
 }

+ 65 - 60
apollo-portal/src/main/resources/static/i18n/zh-cn.json → apollo-portal/src/main/resources/static/i18n/zh-CN.json

@@ -20,7 +20,8 @@
   "Common.AppId": "AppId",
   "Common.Namespace": "Namespace",
   "Common.AppName": "应用名称",
-  "Common.AppOwner": "应用负责人",
+  "Common.AppOwner": "负责人",
+  "Common.AppOwnerLong": "应用负责人",
   "Common.AppAdmin": "项目管理员",
   "Common.ClusterName": "集群名称",
   "Common.Submit": "提交",
@@ -34,9 +35,9 @@
   "Common.Ok": "确定",
   "Common.Search": "查询",
   "Common.IsRootUser": "当前页面只对Apollo管理员开放",
-  "Common.PelaseChooseDepartment": "请选择部门",
-  "Common.PelaseChooseOwner": "请选择应用负责人",
-  "Common.LoginExprieTips": "您的登录信息已过期,请刷新页面后重试",
+  "Common.PleaseChooseDepartment": "请选择部门",
+  "Common.PleaseChooseOwner": "请选择应用负责人",
+  "Common.LoginExpiredTips": "您的登录信息已过期,请刷新页面后重试",
   "Component.DeleteNamespace.Title": "删除Namespace",
   "Component.DeleteNamespace.PublicContent": "删除Namespace将导致实例获取不到此Namespace的配置,确定要删除吗?",
   "Component.DeleteNamespace.PrivateContent": "删除私有Namespace将导致实例获取不到此Namespace的配置,且页面会提示缺失Namespace(除非使用管理员工具删除AppNamespace),确定要删除吗?",
@@ -98,8 +99,8 @@
   "Component.Namespace.Branch.Body.ClickToSee": "点击查看",
   "Component.Namespace.Branch.Body.DeletedItem": "删除的配置",
   "Component.Namespace.Branch.Body.Delete": "删",
-  "Component.Namespace.Branch.Body.ChangedFormMaster": "修改主版本的配置",
-  "Component.Namespace.Branch.Body.ModifedItem": "修改的配置",
+  "Component.Namespace.Branch.Body.ChangedFromMaster": "修改主版本的配置",
+  "Component.Namespace.Branch.Body.ModifiedItem": "修改的配置",
   "Component.Namespace.Branch.Body.Modify": "改",
   "Component.Namespace.Branch.Body.AddedByGrayscale": "灰度版本特有的配置",
   "Component.Namespace.Branch.Body.Added": "新",
@@ -119,7 +120,7 @@
   "Component.Namespace.MasterBranch.Body.ItemPublished": "已发布",
   "Component.Namespace.MasterBranch.Body.AddedItem": "新增的配置",
   "Component.Namespace.MasterBranch.Body.ModifyItem": "修改此灰度配置",
-  "Component.Namespace.Branch.GrayScaleRule.NoPermissonTips": "您没有权限编辑灰度规则, 具有namespace修改权或者发布权的人员才可以编辑灰度规则. 如需要编辑灰度规则,请找项目管理员申请权限.",
+  "Component.Namespace.Branch.GrayScaleRule.NoPermissionTips": "您没有权限编辑灰度规则, 具有namespace修改权或者发布权的人员才可以编辑灰度规则. 如需要编辑灰度规则,请找项目管理员申请权限.",
   "Component.Namespace.Branch.GrayScaleRule.AppId": "灰度的AppId",
   "Component.Namespace.Branch.GrayScaleRule.IpList": "灰度的IP列表",
   "Component.Namespace.Branch.GrayScaleRule.Operator": "操作",
@@ -134,7 +135,7 @@
   "Component.Namespace.Branch.Instance.InstanceDataCenter": "Data Center",
   "Component.Namespace.Branch.Instance.InstanceIp": "IP",
   "Component.Namespace.Branch.Instance.InstanceGetItemTime": "配置获取时间",
-  "Component.Namespace.Branch.Instance.LoadingMore": "刷新列表",
+  "Component.Namespace.Branch.Instance.LoadMore": "刷新列表",
   "Component.Namespace.Branch.Instance.NoInstance": "无实例信息",
   "Component.Namespace.Branch.History.ItemType": "Type",
   "Component.Namespace.Branch.History.ItemKey": "Key",
@@ -142,9 +143,9 @@
   "Component.Namespace.Branch.History.ItemNewValue": "New Value",
   "Component.Namespace.Branch.History.ItemComment": "Comment",
   "Component.Namespace.Branch.History.NewAdded": "新增",
-  "Component.Namespace.Branch.History.Modifed": "更新",
+  "Component.Namespace.Branch.History.Modified": "更新",
   "Component.Namespace.Branch.History.Deleted": "删除",
-  "Component.Namespace.Branch.History.LoadingMore": "加载更多",
+  "Component.Namespace.Branch.History.LoadMore": "加载更多",
   "Component.Namespace.Branch.History.NoHistory": "无更改历史",
   "Component.Namespace.Header.Title.Private": "私有",
   "Component.Namespace.Header.Title.PrivateTips": "私有namespace({{namespace.baseInfo.namespaceName}})的配置只能被AppId为{{appId}}的客户端读取到",
@@ -159,12 +160,12 @@
   "Component.Namespace.Master.LoadNamespaceTips": "加载Namespace",
   "Component.Namespace.Master.Items.Changed": "有修改",
   "Component.Namespace.Master.Items.ChangedUser": "当前修改者",
-  "Component.Namespace.Master.Items.Pubish": "发布",
-  "Component.Namespace.Master.Items.PubishTips": "发布配置",
+  "Component.Namespace.Master.Items.Publish": "发布",
+  "Component.Namespace.Master.Items.PublishTips": "发布配置",
   "Component.Namespace.Master.Items.Rollback": "回滚",
   "Component.Namespace.Master.Items.RollbackTips": "回滚已发布配置",
-  "Component.Namespace.Master.Items.PubishHistory": "发布历史",
-  "Component.Namespace.Master.Items.PubishHistoryTips": "查看发布历史",
+  "Component.Namespace.Master.Items.PublishHistory": "发布历史",
+  "Component.Namespace.Master.Items.PublishHistoryTips": "查看发布历史",
   "Component.Namespace.Master.Items.Grant": "授权",
   "Component.Namespace.Master.Items.GrantTips": "配置修改、发布权限",
   "Component.Namespace.Master.Items.Grayscale": "灰度",
@@ -209,8 +210,8 @@
   "Component.Namespace.Master.Items.Body.HaveGrayscale": "该配置有灰度配置,点击查看灰度的值",
   "Component.Namespace.Master.Items.Body.NewAdded": "新",
   "Component.Namespace.Master.Items.Body.NewAddedTips": "新增的配置",
-  "Component.Namespace.Master.Items.Body.Modifed": "改",
-  "Component.Namespace.Master.Items.Body.ModifedTips": "修改的配置",
+  "Component.Namespace.Master.Items.Body.Modified": "改",
+  "Component.Namespace.Master.Items.Body.ModifiedTips": "修改的配置",
   "Component.Namespace.Master.Items.Body.Deleted": "删",
   "Component.Namespace.Master.Items.Body.DeletedTips": "删除的配置",
   "Component.Namespace.Master.Items.Body.ModifyTips": "修改",
@@ -223,7 +224,7 @@
   "Component.Namespace.Master.Items.Body.Public.NoPublicNamespaceTips1": "当前公共namespace的所有者",
   "Component.Namespace.Master.Items.Body.Public.NoPublicNamespaceTips2": "没有关联此namespace,请联系{{namespace.parentAppId}}的所有者在{{namespace.parentAppId}}项目里关联此namespace",
   "Component.Namespace.Master.Items.Body.Public.NoPublished": "无发布的配置",
-  "Component.Namespace.Master.Items.Body.Public.PubishedAndCover": "覆盖此配置",
+  "Component.Namespace.Master.Items.Body.Public.PublishedAndCover": "覆盖此配置",
   "Component.Namespace.Master.Items.Body.NoPublished.Title": "无公共的配置",
   "Component.Namespace.Master.Items.Body.NoPublished.PublishedValue": "已发布的值",
   "Component.Namespace.Master.Items.Body.NoPublished.NoPublishedValue": "未发布的值",
@@ -235,7 +236,7 @@
   "Component.Namespace.Master.Items.Body.HistoryView.NewAdded": "新增",
   "Component.Namespace.Master.Items.Body.HistoryView.Updated": "更新",
   "Component.Namespace.Master.Items.Body.HistoryView.Deleted": "删除",
-  "Component.Namespace.Master.Items.Body.HistoryView.LoadingMore": "加载更多",
+  "Component.Namespace.Master.Items.Body.HistoryView.LoadMore": "加载更多",
   "Component.Namespace.Master.Items.Body.HistoryView.NoHistory": "无更改历史",
   "Component.Namespace.Master.Items.Body.Instance.Tips": "实例说明:只展示最近一天访问过Apollo的实例",
   "Component.Namespace.Master.Items.Body.Instance.UsedNewItem": "使用最新配置的实例",
@@ -243,7 +244,7 @@
   "Component.Namespace.Master.Items.Body.Instance.AllInstance": "所有实例",
   "Component.Namespace.Master.Items.Body.Instance.RefreshList": "刷新列表",
   "Component.Namespace.Master.Items.Body.Instance.ToSeeItem": "查看配置",
-  "Component.Namespace.Master.Items.Body.Instance.LoadingMore": "加载更多",
+  "Component.Namespace.Master.Items.Body.Instance.LoadMore": "加载更多",
   "Component.Namespace.Master.Items.Body.Instance.ItemAppId": "App ID",
   "Component.Namespace.Master.Items.Body.Instance.ItemCluster": "Cluster Name",
   "Component.Namespace.Master.Items.Body.Instance.ItemDataCenter": "Data Center",
@@ -252,7 +253,7 @@
   "Component.Namespace.Master.Items.Body.Instance.NoInstanceTips": "无实例信息",
   "Component.PublishDeny.Title": "发布受限",
   "Component.PublishDeny.Tips1": "您不能发布哟~{{env}}环境配置的编辑和发布必须为不同的人,请找另一个具有当前namespace发布权的人操作发布~",
-  "Component.PublishDeny.Tips2": "(如果是非工作时间或者特殊情况,您可以通过点击<mark>紧急发布</mark>按钮进行发布)",
+  "Component.PublishDeny.Tips2": "(如果是非工作时间或者特殊情况,您可以通过点击'紧急发布'按钮进行发布)",
   "Component.PublishDeny.EmergencyPublish": "紧急发布",
   "Component.PublishDeny.Close": "关闭",
   "Component.Publish.Title": "发布",
@@ -270,8 +271,8 @@
   "Component.Publish.ModifyTime": "修改时间",
   "Component.Publish.NewAdded": "新",
   "Component.Publish.NewAddedTips": "新增的配置",
-  "Component.Publish.Modifed": "改",
-  "Component.Publish.ModifedTips": "修改的配置",
+  "Component.Publish.Modified": "改",
+  "Component.Publish.ModifiedTips": "修改的配置",
   "Component.Publish.Deleted": "删",
   "Component.Publish.DeletedTips": "删除的配置",
   "Component.Publish.MasterValue": "主版本值",
@@ -284,14 +285,15 @@
   "Component.Publish.Release": "Release Name",
   "Component.Publish.ReleaseComment": "Comment",
   "Component.Publish.OpPublish": "发布",
-  "Component.Rollback.Goto": "回滚到",
+  "Component.Rollback.To": "回滚到",
   "Component.Rollback.Tips": "此操作将会回滚到上一个发布版本,且当前版本作废,但不影响正在修改的配置。可在发布历史页面查看当前生效的版本",
+  "Component.Rollback.ClickToView": "点击查看",
   "Component.Rollback.ItemType": "Type",
   "Component.Rollback.ItemKey": "Key",
   "Component.Rollback.RollbackBeforeValue": "回滚前",
   "Component.Rollback.RollbackAfterValue": "回滚后",
   "Component.Rollback.Added": "新增",
-  "Component.Rollback.Modifed": "更新",
+  "Component.Rollback.Modified": "更新",
   "Component.Rollback.Deleted": "删除",
   "Component.Rollback.NoChange": "配置没有变化",
   "Component.Rollback.OpRollback": "回滚",
@@ -301,19 +303,20 @@
   "Login.LogoutSuccessfully": "登出成功",
   "Index.MyProject": "我的项目",
   "Index.CreateProject": "创建项目",
-  "Index.LoadingMore": "加载更多",
+  "Index.LoadMore": "加载更多",
   "Index.FavoriteItems": "收藏的项目",
   "Index.Topping": "置顶",
   "Index.FavoriteTip": "您还没有收藏过任何项目,在项目主页可以收藏项目哟~",
-  "Index.RecentyViewedItems": "最近浏览的项目",
+  "Index.RecentlyViewedItems": "最近浏览的项目",
   "Index.GetCreateAppRoleFailed": "获取创建应用权限信息失败",
   "Index.Topped": "置顶成功",
   "Index.CancelledFavorite": "取消收藏成功",
+  "Cluster.CreateCluster": "新建集群",
   "Cluster.Tips.1": "通过添加集群,可以使同一份程序在不同的集群(如不同的数据中心)使用不同的配置",
   "Cluster.Tips.2": "如果不同集群使用一样的配置,则没有必要创建集群",
   "Cluster.Tips.3": "Apollo默认会读取机器上/opt/settings/server.properties(linux)或C:\\opt\\settings\\server.properties(windows)文件中的idc属性作为集群名字,  如SHAJQ(金桥数据中心)、SHAOY(欧阳数据中心)",
   "Cluster.Tips.4": "在这里创建的集群名字需要和机器上server.properties中的idc属性一致",
-  "Cluster.CreaterNameTips": "(部署集群如:SHAJQ,SHAOY 或自定义集群如:SHAJQ-xx,SHAJQ-yy)",
+  "Cluster.CreateNameTips": "(部署集群如:SHAJQ,SHAOY 或自定义集群如:SHAJQ-xx,SHAJQ-yy)",
   "Cluster.ChooseEnvironment": "选择环境",
   "Cluster.LoadingEnvironmentError": "加载环境信息出错",
   "Cluster.ClusterCreated": "集群创建成功",
@@ -338,7 +341,7 @@
   "Config.CurrentlyOperatorEnv": "当前操作环境",
   "Config.DoNotRemindAgain": "不再提示",
   "Config.Note": "注意",
-  "Config.ClusterIsDefualtTipContent": "所有不属于 '{{name}}' 集群的实例会使用default集群(当前页面)的配置,属于 '{{name}}' 的实例会使用对应集群的配置!",
+  "Config.ClusterIsDefaultTipContent": "所有不属于 '{{name}}' 集群的实例会使用default集群(当前页面)的配置,属于 '{{name}}' 的实例会使用对应集群的配置!",
   "Config.ClusterIsCustomTipContent": "属于 '{{name}}' 集群的实例只会使用 '{{name}}' 集群(当前页面)的配置,只有当对应namespace在当前集群没有发布过配置时,才会使用default集群的配置。",
   "Config.HasNotPublishNamespace": "以下环境/集群有未发布的配置,客户端获取不到未发布的配置,请及时发布。",
   "Config.DeleteItem.DialogTitle": "删除配置",
@@ -380,10 +383,10 @@
   "Config.FavoriteSuccessfully": "收藏成功",
   "Config.FavoriteFailed": "收藏失败",
   "Config.CancelledFavorite": "取消收藏成功",
-  "Config.CanceFavoriteFailed": "取消收藏失败",
-  "Config.GetrUserInfoFailed": "获取用户登录信息失败",
+  "Config.CancelFavoriteFailed": "取消收藏失败",
+  "Config.GetUserInfoFailed": "获取用户登录信息失败",
   "Config.LoadingAllNamespaceError": "加载配置信息出错",
-  "Config.CanceFavoriteError": "取消收藏失败",
+  "Config.CancelFavoriteError": "取消收藏失败",
   "Config.Deleted": "删除成功",
   "Config.DeleteFailed": "删除失败",
   "Config.GrayscaleCreated": "创建灰度成功",
@@ -433,33 +436,33 @@
   "Namespace.CreatePrivate.Tips2": "通过创建一个私有的Namespace可以实现分组管理配置",
   "Namespace.CreatePrivate.Tips3": "私有Namespace的格式可以是xml、yml、yaml、json、txt.  您可以通过apollo-client中ConfigFile接口来获取非properties格式Namespace的内容",
   "Namespace.CreatePrivate.Tips4": "1.3.0及以上版本的apollo-client针对yaml/yml提供了更好的支持,可以通过ConfigService.getConfig(\"someNamespace.yml\")直接获取Config对象,也可以通过@EnableApolloConfig(\"someNamespace.yml\")或apollo.bootstrap.namespaces=someNamespace.yml注入yml配置到Spring/SpringBoot中去",
-  "Namespace.CreateNamespcae": "创建Namespace",
-  "Namespace.AssociationPublicNamespcae": "关联公共Namespace",
+  "Namespace.CreateNamespace": "创建Namespace",
+  "Namespace.AssociationPublicNamespace": "关联公共Namespace",
   "Namespace.ChooseCluster": "选择集群",
   "Namespace.NamespaceName": "名称",
   "Namespace.AutoAddDepartmentPrefix": "自动添加部门前缀",
   "Namespace.AutoAddDepartmentPrefixTips": "(公共Namespace的名称需要全局唯一,添加部门前缀有助于保证全局唯一性)",
-  "Namespace.NamespcaeType": "类型",
-  "Namespace.NamespcaeType.Public": "public",
-  "Namespace.NamespcaeType.Private": "private",
+  "Namespace.NamespaceType": "类型",
+  "Namespace.NamespaceType.Public": "public",
+  "Namespace.NamespaceType.Private": "private",
   "Namespace.Remark": "备注",
   "Namespace.Namespace": "namespace",
   "Namespace.PleaseChooseNamespace": "请选择Namespace",
   "Namespace.LoadingPublicNamespaceError": "加载公共namespace错误",
   "Namespace.LoadingAppInfoError": "加载App信息出错",
   "Namespace.PleaseChooseCluster": "请选择集群",
-  "Namespace.ChecknamespaceNameLengthTip": "namespace名称不能大于32个字符. 部门前缀:'{{departmentLength}}'个字符, 名称{{namespaceLength}}个字符",
-  "SericeConfig.Title": "应用配置",
-  "SericeConfig.Tips": "(维护ApolloPortalDB.ServerConfig表数据,如果已存在配置项则会覆盖,否则会创建配置项。配置更新后,一分钟后自动生效)",
-  "SericeConfig.Key": "key",
-  "SericeConfig.KeyTips": "(修改配置前请先查询该配置信息)",
-  "SericeConfig.Value": "value",
-  "SericeConfig.Comment": "comment",
-  "SericeConfig.Saved": "保存成功",
-  "SericeConfig.SaveFailed": "保存失败",
-  "SericeConfig.PleaseEnterKey": "请输入key",
-  "SericeConfig.KeyNotExistsAndCreateTip": "Key: '{{key}}' 不存在,点击保存后会创建该配置项",
-  "SericeConfig.KeyExistsAndSaveTip": "Key: '{{key}}' 已存在,点击保存后会覆盖该配置项",
+  "Namespace.CheckNamespaceNameLengthTip": "namespace名称不能大于32个字符. 部门前缀:'{{departmentLength}}'个字符, 名称{{namespaceLength}}个字符",
+  "ServiceConfig.Title": "应用配置",
+  "ServiceConfig.Tips": "(维护ApolloPortalDB.ServerConfig表数据,如果已存在配置项则会覆盖,否则会创建配置项。配置更新后,一分钟后自动生效)",
+  "ServiceConfig.Key": "key",
+  "ServiceConfig.KeyTips": "(修改配置前请先查询该配置信息)",
+  "ServiceConfig.Value": "value",
+  "ServiceConfig.Comment": "comment",
+  "ServiceConfig.Saved": "保存成功",
+  "ServiceConfig.SaveFailed": "保存失败",
+  "ServiceConfig.PleaseEnterKey": "请输入key",
+  "ServiceConfig.KeyNotExistsAndCreateTip": "Key: '{{key}}' 不存在,点击保存后会创建该配置项",
+  "ServiceConfig.KeyExistsAndSaveTip": "Key: '{{key}}' 已存在,点击保存后会覆盖该配置项",
   "SystemInfo.Title": "系统信息",
   "SystemInfo.SystemVersion": "系统版本",
   "SystemInfo.Tips1": "环境列表来自于ApolloPortalDB.ServerConfig中的<strong>apollo.portal.envs</strong>配置,可以到<a href=\"{{serverConfigUrl}}\">系统参数</a>页面配置,更多信息可以参考<a href=\"{{wikiUrl}}\">分布式部署指南</a>中的<strong>apollo.portal.envs - 可支持的环境列表</strong>章节。",
@@ -499,7 +502,7 @@
   "SystemRole.AddFailed": "添加失败",
   "SystemRole.Deleted": "删除成功",
   "SystemRole.DeleteFailed": "删除失败",
-  "SystemRole.GetCanCreateProjectUsersError": "获取拥有创建项目的用户列表出错",
+  "SystemRole.GetCanCreateProjectUsersError": "获取拥有创建项目权限的用户列表出错",
   "SystemRole.PleaseEnterAppId": "请输入appId",
   "SystemRole.AppIdNotFound": "AppId: '{{appId}}' 不存在!",
   "SystemRole.AppInfoContent": "应用名:'{{appName}}' 部门:'{{departmentName}}({{departmentId}})' 负责人:'{{ownerName}}",
@@ -526,7 +529,7 @@
   "Open.Manage.Create": "创建",
   "Open.Manage.GrantPermission": "赋权",
   "Open.Manage.GrantPermissionTips": "(Namespace级别权限包括: 修改、发布Namespace。应用级别权限包括: 创建Namespace、修改或发布应用下任何Namespace)",
-  "Open.Manage.Token": "token",
+  "Open.Manage.Token": "Token",
   "Open.Manage.ManagedAppId": "被管理的AppId",
   "Open.Manage.ManagedNamespace": "被管理的Namespace",
   "Open.Manage.ManagedNamespaceTips": "(非properties类型的namespace请加上类型后缀,例如apollo.xml)",
@@ -543,10 +546,10 @@
   "Namespace.Role.GrantModifyTo": "修改权",
   "Namespace.Role.GrantModifyTo2": "(可以修改配置)",
   "Namespace.Role.AllEnv": "所有环境",
-  "Namespace.Role.GrantPubishTo": "发布权",
-  "Namespace.Role.GrantPubishTo2": "(可以发布配置)",
+  "Namespace.Role.GrantPublishTo": "发布权",
+  "Namespace.Role.GrantPublishTo2": "(可以发布配置)",
   "Namespace.Role.Add": "添加",
-  "Namespace.Role.NoPermisson": "您没有权限哟!",
+  "Namespace.Role.NoPermission": "您没有权限哟!",
   "Namespace.Role.InitNamespacePermissionError": "初始化授权出错",
   "Namespace.Role.GetEnvGrantUserError": "加载 '{{env}}' 授权用户出错",
   "Namespace.Role.GetGrantUserError": "加载授权用户出错",
@@ -608,9 +611,11 @@
   "Config.History.OperationType7": "放弃灰度",
   "Config.History.OperationType8": "删除灰度(全量发布)",
   "Config.History.UrgentPublish": "紧急发布",
-  "Config.History.LoadingMore": "加载更多",
+  "Config.History.LoadMore": "加载更多",
   "Config.History.ChangedItem": "变更的配置",
+  "Config.History.ChangedItemTips": "查看此次发布与上次版本的变更",
   "Config.History.AllItem": "全部配置",
+  "Config.History.AllItemTips": "查看此次发布的所有配置信息",
   "Config.History.ChangeType": "Type",
   "Config.History.ChangeKey": "Key",
   "Config.History.ChangeValue": "Value",
@@ -625,7 +630,7 @@
   "Config.History.GrayscaleAppId": "灰度的AppId",
   "Config.History.GrayscaleIp": "灰度的IP",
   "Config.History.NoGrayscaleRule": "无灰度规则",
-  "Config.History.NoPermissonTips": "您不是该项目的管理员,也没有该Namespace的编辑或发布权限,无法查看发布历史",
+  "Config.History.NoPermissionTips": "您不是该项目的管理员,也没有该Namespace的编辑或发布权限,无法查看发布历史",
   "Config.History.NoPublishHistory": "无发布历史信息",
   "Config.History.LoadingHistoryError": "无发布历史信息",
   "Config.Diff.Title": "比较配置",
@@ -654,7 +659,7 @@
   "App.Setting.ProjectOwner": "项目负责人",
   "App.Setting.Modify": "修改项目信息",
   "App.Setting.Cancel": "取消修改",
-  "App.Setting.NoPermissonTips": "您没有权限操作,请找 [{{users}}] 开通权限",
+  "App.Setting.NoPermissionTips": "您没有权限操作,请找 [{{users}}] 开通权限",
   "App.Setting.DeleteAdmin": "删除管理员",
   "App.Setting.CanNotDeleteAllAdmin": "不能删除所有的管理员",
   "App.Setting.PleaseChooseUser": "请选择用户",
@@ -662,7 +667,7 @@
   "App.Setting.AddFailed": "添加失败",
   "App.Setting.Deleted": "删除成功",
   "App.Setting.DeleteFailed": "删除失败",
-  "App.Setting.Modifed": "修改成功",
+  "App.Setting.Modified": "修改成功",
   "Valdr.App.AppId.Size": "AppId长度不能多于32个字符",
   "Valdr.App.AppId.Required": "AppId不能为空",
   "Valdr.App.appName.Size": "应用名称长度不能多于128个字符",
@@ -689,7 +694,7 @@
   "ItemModal.AddedTips": "添加成功,如需生效请发布",
   "ItemModal.AddFailed": "添加失败",
   "ItemModal.PleaseChooseCluster": "请选择集群",
-  "ItemModal.ModifedTips": "更新成功, 如需生效请发布",
+  "ItemModal.ModifiedTips": "更新成功, 如需生效请发布",
   "ItemModal.ModifyFailed": "更新失败",
   "ItemModal.Tabs": "制表符",
   "ItemModal.NewLine": "换行符",
@@ -697,9 +702,9 @@
   "ApolloNsPanel.LoadingHistoryError": "加载修改历史记录出错",
   "ApolloNsPanel.LoadingGrayscaleError": "加载修改历史记录出错",
   "ApolloNsPanel.Deleted": "删除成功",
-  "ApolloNsPanel.GrayscaleModifed": "灰度规则更新成功",
+  "ApolloNsPanel.GrayscaleModified": "灰度规则更新成功",
   "ApolloNsPanel.GrayscaleModifyFailed": "灰度规则更新失败",
-  "ApolloNsPanel.ModifedTips": "更新成功, 如需生效请发布",
+  "ApolloNsPanel.ModifiedTips": "更新成功, 如需生效请发布",
   "ApolloNsPanel.ModifyFailed": "更新失败",
   "ApolloNsPanel.GrammarIsright": "语法正确!",
   "ReleaseModal.Published": "发布成功",

+ 3 - 7
apollo-portal/src/main/resources/static/index.html

@@ -44,7 +44,7 @@
                     ng-click="getUserCreatedApps()">
                     <div href="#" class="thumbnail hover cursor-pointer">
                         <img class="more-img" src="img/more.png" />
-                        <h5>{{'Index.LoadingMore' | translate }}</h5>
+                        <h5>{{'Index.LoadMore' | translate }}</h5>
                     </div>
                 </div>
             </aside>
@@ -77,7 +77,7 @@
                 <div class="col-md-2 text-center" ng-show="hasMoreFavorites" ng-click="getUserFavorites()">
                     <div href="#" class="thumbnail hover cursor-pointer">
                         <img class="more-img" src="img/more.png" />
-                        <h5>{{'Index.LoadingMore' | translate }}</h5>
+                        <h5>{{'Index.LoadMore' | translate }}</h5>
                     </div>
                 </div>
                 <div class="no-favorites text-center" ng-show="!favorites || favorites.length == 0">
@@ -89,7 +89,7 @@
 
         <section class="media visit-app-list" ng-show="visitedApps && visitedApps.length">
             <aside class="media-left text-center">
-                <h5>{{'Index.RecentyViewedItems' | translate }}</h5>
+                <h5>{{'Index.RecentlyViewedItems' | translate }}</h5>
             </aside>
             <aside class="media-body">
                 <div class="app-panel col-md-2 text-center" ng-repeat="app in visitedApps"
@@ -117,10 +117,6 @@
     <script src="vendor/angular/angular-translate.2.18.1/angular-translate-loader-static-files.min.js"></script>
     <script src="vendor/angular/angular-translate.2.18.1/angular-translate-storage-cookie.min.js"></script>
 
-    <!--<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-translate/2.18.1/angular-translate.min.js"></script>-->
-    <!--<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-translate/2.18.1/angular-translate-storage-cookie/angular-translate-storage-cookie.min.js"></script>-->
-    <!--<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-translate/2.18.1/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js"></script>-->
-
     <!-- jquery.js -->
     <script src="vendor/jquery.min.js" type="text/javascript"></script>
     <script src="vendor/select2/select2.min.js" type="text/javascript"></script>

+ 5 - 5
apollo-portal/src/main/resources/static/namespace.html

@@ -62,10 +62,10 @@
                         <div class="row text-right" style="padding-right: 20px;">
                             <div class="btn-group btn-group-sm" role="group" aria-label="...">
                                 <button type="button" class="btn btn-default" ng-class="{active:type=='link'}"
-                                    ng-click="switchType('link')">{{'Namespace.AssociationPublicNamespcae' | translate }}
+                                    ng-click="switchType('link')">{{'Namespace.AssociationPublicNamespace' | translate }}
                                 </button>
                                 <button type="button" class="btn btn-default" ng-class="{active:type=='create'}"
-                                    ng-click="switchType('create')">{{'Namespace.CreateNamespcae' | translate }}
+                                    ng-click="switchType('create')">{{'Namespace.CreateNamespace' | translate }}
                                 </button>
                             </div>
                         </div>
@@ -142,16 +142,16 @@
                                 ng-show="type == 'create' && (pageSetting.canAppAdminCreatePrivateNamespace || hasRootPermission)">
                                 <label class="col-sm-3 control-label">
                                     <apollorequiredfield></apollorequiredfield>
-                                    {{'Namespace.NamespcaeType' | translate }}
+                                    {{'Namespace.NamespaceType' | translate }}
                                 </label>
                                 <div class="col-sm-4" valdr-form-group>
                                     <label class="radio-inline">
                                         <input type="radio" name="namespaceType" value="true" ng-value="true"
-                                            ng-model="appNamespace.isPublic"> {{'Namespace.NamespcaeType.Public' | translate }}
+                                            ng-model="appNamespace.isPublic"> {{'Namespace.NamespaceType.Public' | translate }}
                                     </label>
                                     <label class="radio-inline">
                                         <input type="radio" name="namespaceType" value="false" ng-value="false"
-                                            ng-model="appNamespace.isPublic"> {{'Namespace.NamespcaeType.Private' | translate }}
+                                            ng-model="appNamespace.isPublic"> {{'Namespace.NamespaceType.Private' | translate }}
                                     </label>
                                 </div>
                             </div>

+ 3 - 3
apollo-portal/src/main/resources/static/namespace/role.html

@@ -40,7 +40,7 @@
                     <div class="form-horizontal">
                         <div class="form-group">
                             <label
-                                class="col-sm-2 control-label">{{'Namespace.Role.GrantModifyTo' | translate }}<br><small>{{'Namespace.Role.GrantModifyT2' | translate }}</small></label>
+                                class="col-sm-2 control-label">{{'Namespace.Role.GrantModifyTo' | translate }}<br><small>{{'Namespace.Role.GrantModifyTo2' | translate }}</small></label>
                             <div class="col-sm-8">
                                 <form class="form-inline" ng-submit="assignRoleToUser('ModifyNamespace')">
                                     <div class="form-group">
@@ -88,7 +88,7 @@
                         <div class="form-horizontal">
                             <div class="col-sm-2 text-right">
                                 <label
-                                    class="control-label">{{'Namespace.Role.GrantPubishTo' | translate }}<br><small>{{'Namespace.Role.GrantPubishTo2' | translate }}</small></label>
+                                    class="control-label">{{'Namespace.Role.GrantPublishTo' | translate }}<br><small>{{'Namespace.Role.GrantPublishTo2' | translate }}</small></label>
                             </div>
                             <div class="col-sm-8">
                                 <form class="form-inline" ng-submit="assignRoleToUser('ReleaseNamespace')">
@@ -138,7 +138,7 @@
 
             </div>
             <div class="panel-body text-center" ng-show="!hasAssignUserPermission">
-                <h2>{{'Namespace.Role.NoPermisson' | translate }}</h2>
+                <h2>{{'Namespace.Role.NoPermission' | translate }}</h2>
             </div>
 
         </section>

+ 2 - 2
apollo-portal/src/main/resources/static/scripts/AppUtils.js

@@ -2,7 +2,7 @@ appUtil.service('AppUtil', ['toastr', '$window', '$q', '$translate', function (t
 
     function parseErrorMsg(response) {
         if (response.status == -1) {
-            return $translate.instant('Common.LoginExprieTips');
+            return $translate.instant('Common.LoginExpiredTips');
         }
         var msg = "Code:" + response.status;
         if (response.data.message != null) {
@@ -13,7 +13,7 @@ appUtil.service('AppUtil', ['toastr', '$window', '$q', '$translate', function (t
 
     function parsePureErrorMsg(response) {
         if (response.status == -1) {
-            return $translate.instant('Common.LoginExprieTips');
+            return $translate.instant('Common.LoginExpiredTips');
         }
         if (response.data.message != null) {
             return response.data.message;

+ 8 - 4
apollo-portal/src/main/resources/static/scripts/app.js

@@ -2,15 +2,19 @@
 var appUtil = angular.module('app.util', ['toastr', 'ngCookies', 'pascalprecht.translate'])
     .config(['$translateProvider', function ($translateProvider) {
 
-        // $translateProvider.useMissingTranslationHandlerLog();
+        $translateProvider.useSanitizeValueStrategy(null); // disable sanitization by default
         $translateProvider.useCookieStorage();
         $translateProvider.useStaticFilesLoader({
             prefix: '/i18n/',
             suffix: '.json'
         });
-        $translateProvider.preferredLanguage('en');
-        $translateProvider.fallbackLanguage('zh-cn');
-
+        $translateProvider.registerAvailableLanguageKeys(['en', 'zh-CN'], {
+                              'zh-*': 'zh-CN',
+                              'zh': 'zh-CN',
+                              'en-*': 'en',
+                              "*": "en"
+                            })
+        $translateProvider.uniformLanguageTag('bcp47').determinePreferredLanguage();
     }]);
 /**service module 定义*/
 var appService = angular.module('app.service', ['ngResource', 'app.util'])

+ 3 - 3
apollo-portal/src/main/resources/static/scripts/controller/AppController.js

@@ -27,7 +27,7 @@ function createAppController($scope, $window, $translate, toastr, AppService, Ap
                 organizations.push(org);
             });
             $('#organization').select2({
-                placeholder: $translate.instant('Common.PelaseChooseDepartment'),
+                placeholder: $translate.instant('Common.PleaseChooseDepartment'),
                 width: '100%',
                 data: organizations
             });
@@ -60,7 +60,7 @@ function createAppController($scope, $window, $translate, toastr, AppService, Ap
         var selectedOrg = $('#organization').select2('data')[0];
 
         if (!selectedOrg.id) {
-            toastr.warning($translate.instant('Common.PelaseChooseDepartment'));
+            toastr.warning($translate.instant('Common.PleaseChooseDepartment'));
             $scope.submitBtnDisabled = false;
             return;
         }
@@ -74,7 +74,7 @@ function createAppController($scope, $window, $translate, toastr, AppService, Ap
             owner = { id: $scope.currentUser.userId };
         }
         if (!owner) {
-            toastr.warning($translate.instant('Common.PelaseChooseOwner'));
+            toastr.warning($translate.instant('Common.PleaseChooseOwner'));
             $scope.submitBtnDisabled = false;
             return;
         }

+ 3 - 3
apollo-portal/src/main/resources/static/scripts/controller/DeleteAppClusterNamespaceController.js

@@ -62,7 +62,7 @@ function DeleteAppClusterNamespaceController($scope, $translate, toastr, AppUtil
             toastr.warning($translate.instant('Delete.PleaseEnterAppId'));
             return;
         }
-        if (confirm($translate.instant('Delete.PleaseEnterAppId', { appId: $scope.app.appId }))) {
+        if (confirm($translate.instant('Delete.ConfirmDeleteAppId', { appId: $scope.app.appId }))) {
             AppService.delete_app($scope.app.appId).then(function (result) {
                 toastr.success($translate.instant('Delete.Deleted'));
                 $scope.deleteAppBtnDisabled = true;
@@ -99,9 +99,9 @@ function DeleteAppClusterNamespaceController($scope, $translate, toastr, AppUtil
             return;
         }
         var confirmTip = $translate.instant('Delete.ConfirmDeleteCluster', {
-            appId: result.appId,
+            appId: $scope.cluster.appId,
             env: $scope.cluster.env,
-            clusterName: result.name
+            clusterName: $scope.cluster.name
         });
 
         if (confirm(confirmTip)) {

+ 4 - 2
apollo-portal/src/main/resources/static/scripts/controller/LoginController.js

@@ -8,10 +8,12 @@ function LoginController($scope, $window, $location, $translate, toastr, AppUtil
         if (params.error) {
             $translate('Login.UserNameOrPasswordIncorrect').then(function(result)  {
                 $scope.info = result;
-            })
+            });
         }
         if (params.logout) {
-            $scope.info = $translate.instant('Login.LogoutSuccessfully');
+            $translate('Login.LogoutSuccessfully').then(function(result)  {
+                $scope.info = result;
+            });
         }
     }
 

+ 1 - 1
apollo-portal/src/main/resources/static/scripts/controller/NamespaceController.js

@@ -118,7 +118,7 @@ namespace_module.controller("LinkNamespaceController",
 
                     var namespaceNameLength = $scope.concatNamespace().length;
                     if (namespaceNameLength > 32) {
-                        var errorTip = $translate.instant('Namespace.ChecknamespaceNameLengthTip', {
+                        var errorTip = $translate.instant('Namespace.CheckNamespaceNameLengthTip', {
                             departmentLength: namespaceNameLength - $scope.appNamespace.name.length,
                             namespaceLength: $scope.appNamespace.name.length
                         });

+ 5 - 5
apollo-portal/src/main/resources/static/scripts/controller/ServerConfigController.js

@@ -7,17 +7,17 @@ server_config_module.controller('ServerConfigController',
 
             $scope.create = function () {
                 ServerConfigService.create($scope.serverConfig).then(function (result) {
-                    toastr.success($translate.instant('SericeConfig.Saved'));
+                    toastr.success($translate.instant('ServiceConfig.Saved'));
                     $scope.saveBtnDisabled = true;
                     $scope.serverConfig = result;
                 }, function (result) {
-                    toastr.error(AppUtil.errorMsg(result), $translate.instant('SericeConfig.SaveFailed'));
+                    toastr.error(AppUtil.errorMsg(result), $translate.instant('ServiceConfig.SaveFailed'));
                 });
             };
 
             $scope.getServerConfigInfo = function () {
                 if (!$scope.serverConfig.key) {
-                    toastr.warning($translate.instant('SericeConfig.PleaseEnterKey'));
+                    toastr.warning($translate.instant('ServiceConfig.PleaseEnterKey'));
                     return;
                 }
 
@@ -25,11 +25,11 @@ server_config_module.controller('ServerConfigController',
                     $scope.saveBtnDisabled = false;
 
                     if (!result.key) {
-                        toastr.info($translate.instant('SericeConfig.KeyNotExistsAndCreateTip', { key: $scope.serverConfig.key }));
+                        toastr.info($translate.instant('ServiceConfig.KeyNotExistsAndCreateTip', { key: $scope.serverConfig.key }));
                         return;
                     }
 
-                    toastr.info($translate.instant('SericeConfig.KeyExistsAndSaveTip', { key: $scope.serverConfig.key }));
+                    toastr.info($translate.instant('ServiceConfig.KeyExistsAndSaveTip', { key: $scope.serverConfig.key }));
                     $scope.serverConfig = result;
                 }, function (result) {
                     AppUtil.showErrorMsg(result);

+ 4 - 4
apollo-portal/src/main/resources/static/scripts/controller/SettingController.js

@@ -49,7 +49,7 @@ function SettingController($scope, $location, $translate, toastr,
                 organizations.push(org);
             });
             $orgWidget.select2({
-                placeholder: $translate.instant('Common.PelaseChooseDepartment'),
+                placeholder: $translate.instant('Common.PleaseChooseDepartment'),
                 width: '100%',
                 data: organizations
             });
@@ -177,7 +177,7 @@ function SettingController($scope, $location, $translate, toastr,
         var selectedOrg = $orgWidget.select2('data')[0];
 
         if (!selectedOrg.id) {
-            toastr.warning($translate.instant('Common.PelaseChooseDepartment'));
+            toastr.warning($translate.instant('Common.PleaseChooseDepartment'));
             return;
         }
 
@@ -187,13 +187,13 @@ function SettingController($scope, $location, $translate, toastr,
         // owner
         var owner = $('.ownerSelector').select2('data')[0];
         if (!owner) {
-            toastr.warning($translate.instant('Common.PelaseChooseOwner'));
+            toastr.warning($translate.instant('Common.PleaseChooseOwner'));
             return;
         }
         app.ownerName = owner.id;
 
         AppService.update(app).then(function (app) {
-            toastr.success($translate.instant('Common.Modifed'));
+            toastr.success($translate.instant('App.Setting.Modified'));
             initApplication();
             $scope.display.app.edit = false;
             $scope.submitBtnDisabled = false;

+ 2 - 2
apollo-portal/src/main/resources/static/scripts/controller/config/ConfigBaseInfoController.js

@@ -45,7 +45,7 @@ function ConfigBaseInfoController($rootScope, $scope, $window, $location, $trans
             loadAppInfo();
             handleFavorite();
         }, function (result) {
-            toastr.error(AppUtil.errorMsg(result),  $translate.instant('Config.GetrUserInfoFailed'));
+            toastr.error(AppUtil.errorMsg(result),  $translate.instant('Config.GetUserInfoFailed'));
         });
 
         handlePermission();
@@ -326,7 +326,7 @@ function ConfigBaseInfoController($rootScope, $scope, $window, $location, $trans
                     $scope.favoriteId = 0;
                     toastr.success($translate.instant('Config.CancelledFavorite'));
                 }, function (result) {
-                    toastr.error(AppUtil.errorMsg(result), $translate.instant('Config.CanceFavoriteFailed'));
+                    toastr.error(AppUtil.errorMsg(result), $translate.instant('Config.CancelFavoriteFailed'));
                 })
         };
     }

+ 3 - 3
apollo-portal/src/main/resources/static/scripts/controller/open/OpenManageController.js

@@ -35,7 +35,7 @@ function OpenManageController($scope, $translate, toastr, AppUtil, OrganizationS
                 organizations.push(org);
             });
             $orgWidget.select2({
-                placeholder: $translate.instant('Common.PelaseChooseDepartment'),
+                placeholder: $translate.instant('Common.PleaseChooseDepartment'),
                 width: '100%',
                 data: organizations
             });
@@ -103,7 +103,7 @@ function OpenManageController($scope, $translate, toastr, AppUtil, OrganizationS
         var selectedOrg = $orgWidget.select2('data')[0];
 
         if (!selectedOrg.id) {
-            toastr.warning($translate.instant('Common.PelaseChooseDepartment'));
+            toastr.warning($translate.instant('Common.PleaseChooseDepartment'));
             return;
         }
 
@@ -113,7 +113,7 @@ function OpenManageController($scope, $translate, toastr, AppUtil, OrganizationS
         // owner
         var owner = $('.ownerSelector').select2('data')[0];
         if (!owner) {
-            toastr.warning($translate.instant('Common.PelaseChooseOwner'));
+            toastr.warning($translate.instant('Common.PleaseChooseOwner'));
             return;
         }
         $scope.consumer.ownerName = owner.id;

+ 39 - 37
apollo-portal/src/main/resources/static/scripts/directive/directive.js

@@ -18,9 +18,10 @@ directive_module.directive('apollonav',
                    scope.$apply(function () {});
                });
 
-                $('#app-search-list').select2({
-                    placeholder: $translate.instant('ApolloConfirmDialog.SearchPlaceHolder'),
-                    ajax: {
+               $translate('ApolloConfirmDialog.SearchPlaceHolder').then(function(placeholderLabel)  {
+                   $('#app-search-list').select2({
+                      placeholder: placeholderLabel,
+                      ajax: {
                         url: "/apps/search",
                         dataType: 'json',
                         delay: 400,
@@ -28,44 +29,45 @@ directive_module.directive('apollonav',
                             return {
                                 query: params.term || '',
                                 page: params.page ? params.page - 1 : 0,
-                                size: 20
-                            };
-                        },
-                        processResults: function (data) {
-                            if (data && data.content) {
-                                var hasMore = data.content.length
-                                    === data.size;
-                                var result = [];
-                                data.content.forEach(function (app) {
-                                    result.push({
-                                        id: app.appId,
-                                        text: app.appId + ' / ' + app.name
-                                    })
-                                });
-                                return {
-                                    results: result,
-                                    pagination: {
-                                        more: hasMore
-                                    }
+                                    size: 20
                                 };
-                            } else {
-                                return {
-                                    results: [],
-                                    pagination: {
-                                        more: false
-                                    }
-                                };
-                            }
+                            },
+                            processResults: function (data) {
+                                if (data && data.content) {
+                                    var hasMore = data.content.length
+                                        === data.size;
+                                    var result = [];
+                                    data.content.forEach(function (app) {
+                                        result.push({
+                                            id: app.appId,
+                                            text: app.appId + ' / ' + app.name
+                                        })
+                                    });
+                                    return {
+                                        results: result,
+                                        pagination: {
+                                            more: hasMore
+                                        }
+                                    };
+                                } else {
+                                    return {
+                                        results: [],
+                                        pagination: {
+                                            more: false
+                                        }
+                                    };
+                                }
 
+                            }
                         }
-                    }
-                });
+                    });
 
-                $('#app-search-list').on('select2:select', function () {
-                    var selected = $('#app-search-list').select2('data');
-                    if (selected && selected.length) {
-                        jumpToConfigPage(selected[0].id)
-                    }
+                    $('#app-search-list').on('select2:select', function () {
+                        var selected = $('#app-search-list').select2('data');
+                        if (selected && selected.length) {
+                            jumpToConfigPage(selected[0].id)
+                        }
+                    });
                 });
 
                 function jumpToConfigPage(selectedAppId) {

+ 1 - 1
apollo-portal/src/main/resources/static/scripts/directive/item-modal-directive.js

@@ -124,7 +124,7 @@ function itemModalDirective($translate, toastr, $sce, AppUtil, EventManager, Con
 
                                 AppUtil.hideModal('#itemModal');
 
-                                toastr.success($translate.instant('ItemModal.ModifedTips'));
+                                toastr.success($translate.instant('ItemModal.ModifiedTips'));
                             }, function (result) {
                                 toastr.error(AppUtil.errorMsg(result), $translate.instant('ItemModal.ModifyFailed'));
                             });

+ 2 - 2
apollo-portal/src/main/resources/static/scripts/directive/namespace-panel-directive.js

@@ -659,7 +659,7 @@ function directive($window, $translate, toastr, AppUtil, EventManager, Permissio
                     branch.rules
                 )
                     .then(function (result) {
-                        toastr.success($translate.instant('ApolloNsPanel.GrayscaleModifed'));
+                        toastr.success($translate.instant('ApolloNsPanel.GrayscaleModified'));
 
                         //show tips if branch has not release configs
                         if (branch.itemModifiedCnt) {
@@ -729,7 +729,7 @@ function directive($window, $translate, toastr, AppUtil, EventManager, Permissio
                     namespace.baseInfo.namespaceName,
                     model).then(
                         function (result) {
-                            toastr.success($translate.instant('ApolloNsPanel.ModifedTips'));
+                            toastr.success($translate.instant('ApolloNsPanel.ModifiedTips'));
                             //refresh all namespace items
                             EventManager.emit(EventManager.EventType.REFRESH_NAMESPACE,
                                 {

+ 7 - 7
apollo-portal/src/main/resources/static/server_config.html

@@ -10,7 +10,7 @@
     <link rel="stylesheet" type="text/css" href="vendor/select2/select2.min.css">
     <link rel="stylesheet" type="text/css" media='all' href="vendor/angular/loading-bar.min.css">
     <link rel="stylesheet" type="text/css" href="styles/common-style.css">
-    <title>{{'SericeConfig.Title' | translate }}</title>
+    <title>{{'ServiceConfig.Title' | translate }}</title>
 </head>
 
 <body>
@@ -22,8 +22,8 @@
             <div class="col-md-8 col-md-offset-2">
                 <div class="panel">
                     <header class="panel-heading">
-                        {{'SericeConfig.Title' | translate }}
-                        <small>{{'SericeConfig.Tips' | translate }}</small>
+                        {{'ServiceConfig.Title' | translate }}
+                        <small>{{'ServiceConfig.Tips' | translate }}</small>
                     </header>
 
                     <div class="panel-body">
@@ -31,12 +31,12 @@
                             <div class="form-group">
                                 <label class="col-sm-2 control-label">
                                     <apollorequiredfield></apollorequiredfield>
-                                    {{'SericeConfig.Key' | translate }}
+                                    {{'ServiceConfig.Key' | translate }}
                                 </label>
                                 <div class="col-sm-8">
                                     <input type="text" class="form-control" name="key" ng-model="serverConfig.key"
                                         required>
-                                    <small>{{'SericeConfig.KeyTips' | translate }}</small>
+                                    <small>{{'ServiceConfig.KeyTips' | translate }}</small>
                                 </div>
                                 <div class="col-sm-1">
                                     <button class="btn btn-info"
@@ -46,7 +46,7 @@
                             <div class="form-group">
                                 <label class="col-sm-2 control-label">
                                     <apollorequiredfield></apollorequiredfield>
-                                    {{'SericeConfig.Value' | translate }}
+                                    {{'ServiceConfig.Value' | translate }}
                                 </label>
                                 <div class="col-sm-9">
                                     <textarea class="form-control" rows="4" name="value"
@@ -55,7 +55,7 @@
                             </div>
                             <div class="form-group">
                                 <label class="col-sm-2 control-label">
-                                    {{'SericeConfig.Comment' | translate }}</label>
+                                    {{'ServiceConfig.Comment' | translate }}</label>
                                 <div class="col-sm-9">
                                     <textarea class="form-control" rows="4" name="comment"
                                         ng-model="serverConfig.comment"></textarea>

+ 2 - 2
apollo-portal/src/main/resources/static/styles/common-style.css

@@ -297,7 +297,7 @@ table th {
 
 .project-info th {
     text-align: right;
-    padding: 4px 6px;
+    padding: 4px 2px;
     width: 5em;
 }
 
@@ -654,7 +654,7 @@ table th {
 .release-history .operation-caption {
     position: absolute;
     top: 45px;
-    width: 75px;
+    width: 100px;
     height: 18px;
     color: #fff;
     font-size: 12px;

+ 1 - 1
apollo-portal/src/main/resources/static/views/common/nav.html

@@ -31,7 +31,7 @@
 
                     <ul class="dropdown-menu">
                         <li value="en"><a href="javascript:void(0)" ng-click="changeLanguage('en')">English</a></li>
-                        <li value="zh-cn"><a href="javascript:void(0)" ng-click="changeLanguage('zh-cn')">简体中文</a></li>
+                        <li value="zh-CN"><a href="javascript:void(0)" ng-click="changeLanguage('zh-CN')">简体中文</a></li>
                     </ul>
                 </li>
                 <li class="dropdown" ng-if="hasRootPermission">

+ 1 - 1
apollo-portal/src/main/resources/static/views/component/env-selector.html

@@ -1,4 +1,4 @@
-<table class="table table-hover" style="width: 250px">
+<table class="table table-hover" style="width: 300px">
     <thead>
     <tr>
         <td><input type="checkbox" ng-checked="envAllSelected" ng-click="toggleEnvsCheckedStatus()"></td>

+ 15 - 15
apollo-portal/src/main/resources/static/views/component/namespace-panel-branch-tab.html

@@ -159,7 +159,7 @@
                                         title="{{'Component.Namespace.Branch.Body.DeletedItem' | translate }}">{{'Component.Namespace.Branch.Body.Delete' | translate }}</span>
                                     <span class="label label-info" ng-if="!config.isDeleted && config.masterItemExists"
                                         data-tooltip="tooltip" data-placement="bottom"
-                                        title="{{'Component.Namespace.Branch.Body.ChangedFormMaster' | translate }}">{{'Component.Namespace.Branch.Body.Modify' | translate }}</span>
+                                        title="{{'Component.Namespace.Branch.Body.ChangedFromMaster' | translate }}">{{'Component.Namespace.Branch.Body.Modify' | translate }}</span>
                                     <span class="label label-success"
                                         ng-if="!config.isDeleted && !config.masterItemExists" data-tooltip="tooltip"
                                         data-placement="bottom"
@@ -268,7 +268,7 @@
                                     <span class="label label-info"
                                         ng-if="config.isModified && config.oldValue && !config.isDeleted"
                                         data-tooltip="tooltip" data-placement="bottom"
-                                        title="{{'Component.Namespace.Branch.Body.ModifedItem' | translate }}">{{'Component.Namespace.Branch.Body.Modify' | translate }}</span>
+                                        title="{{'Component.Namespace.Branch.Body.ModifiedItem' | translate }}">{{'Component.Namespace.Branch.Body.Modify' | translate }}</span>
                                     <span class="label label-danger" ng-if="config.isDeleted" data-tooltip="tooltip"
                                         data-placement="bottom"
                                         title="{{'Component.Namespace.Branch.Body.DeletedItem' | translate }}">{{'Component.Namespace.Branch.Body.Delete' | translate }}</span>
@@ -307,7 +307,7 @@
                 <div class="alert alert-warning no-radius"
                     ng-show="!namespace.hasModifyPermission && !namespace.hasReleasePermission">
                     <strong>Tips:</strong>
-                    {{'Component.Namespace.Branch.GrayScaleRule.NoPermissonTips' | translate }}
+                    {{'Component.Namespace.Branch.GrayScaleRule.NoPermissionTips' | translate }}
                 </div>
 
                 <table class="table table-bordered table-hover">
@@ -397,7 +397,7 @@
                         <div class="row text-center"
                             ng-show="namespace.branch.latestReleaseInstances.content.length < namespace.branch.latestReleaseInstances.total">
                             <button class="btn btn-default"
-                                ng-click="loadInstanceInfo(namespace.branch)">{{'Component.Namespace.Branch.Instance.LoadingMore' | translate }}</button>
+                                ng-click="loadInstanceInfo(namespace.branch)">{{'Component.Namespace.Branch.Instance.LoadMore' | translate }}</button>
 
                         </div>
                     </div>
@@ -450,7 +450,7 @@
 
                                 <!--兼容老数据,不显示item类型为空行和注释的item-->
                                 <tr ng-repeat="item in commits.changeSets.createItems" ng-show="item.key">
-                                    <td width="2%">
+                                    <td width="6%">
                                         {{'Component.Namespace.Branch.History.NewAdded' | translate }}
                                     </td>
                                     <td width="20%" title="{{item.key}}">
@@ -458,9 +458,9 @@
                                         <span ng-bind="item.key | limitTo: 250"></span>
                                         <span ng-bind="item.key.length > 250 ? '...' :''"></span>
                                     </td>
-                                    <td width="30%">
+                                    <td width="28%">
                                     </td>
-                                    <td width="30%" class="cursor-pointer" title="{{item.value}}"
+                                    <td width="28%" class="cursor-pointer" title="{{item.value}}"
                                         ng-click="showText(item.value)">
                                         <span ng-bind="item.value | limitTo: 250"></span>
                                         <span ng-bind="item.value.length > 250 ? '...': ''"></span>
@@ -471,19 +471,19 @@
                                     </td>
                                 </tr>
                                 <tr ng-repeat="item in commits.changeSets.updateItems">
-                                    <td width="2%">
-                                        {{'Component.Namespace.Branch.History.Modifed' | translate }}
+                                    <td width="6%">
+                                        {{'Component.Namespace.Branch.History.Modified' | translate }}
                                     </td>
                                     <td width="20%" title="{{item.newItem.key}}">
                                         <span ng-bind="item.newItem.key | limitTo: 250"></span>
                                         <span ng-bind="item.newItem.key.length > 250 ? '...' :''"></span>
                                     </td>
-                                    <td width="30%" class="cursor-pointer" title="{{item.oldItem.value}}"
+                                    <td width="28%" class="cursor-pointer" title="{{item.oldItem.value}}"
                                         ng-click="showText(item.oldItem.value)">
                                         <span ng-bind="item.oldItem.value | limitTo: 250"></span>
                                         <span ng-bind="item.oldItem.value.length > 250 ? '...': ''"></span>
                                     </td>
-                                    <td width="30%" class="cursor-pointer" title="{{item.newItem.value}}"
+                                    <td width="28%" class="cursor-pointer" title="{{item.newItem.value}}"
                                         ng-click="showText(item.newItem.value)">
                                         <span ng-bind="item.newItem.value | limitTo: 250"></span>
                                         <span ng-bind="item.newItem.value.length > 250 ? '...': ''"></span>
@@ -495,18 +495,18 @@
                                 </tr>
                                 <tr ng-repeat="item in commits.changeSets.deleteItems"
                                     ng-show="item.key || item.comment">
-                                    <td width="2%">
+                                    <td width="6%">
                                         {{'Component.Namespace.Branch.History.Deleted' | translate }}
                                     </td>
                                     <td width="20%" title="{{item.key}}">
                                         <span ng-bind="item.key | limitTo: 250"></span>
                                         <span ng-bind="item.key.length > 250 ? '...' :''"></span>
                                     </td>
-                                    <td width="30%" title="{{item.value}}">
+                                    <td width="28%" title="{{item.value}}">
                                         <span ng-bind="item.value | limitTo: 250"></span>
                                         <span ng-bind="item.value.length > 250 ? '...': ''"></span>
                                     </td>
-                                    <td width="30%">
+                                    <td width="28%">
                                     </td>
                                     <td width="18%" title="{{item.comment}}">
                                         <span ng-bind="item.comment | limitTo: 250"></span>
@@ -537,7 +537,7 @@
                 </div>
                 <div class="text-center">
                     <button type="button" class="btn btn-default" ng-show="!namespace.branch.hasLoadAllCommit"
-                        ng-click="loadCommitHistory(namespace.branch)">{{'Component.Namespace.Branch.History.LoadingMore' | translate }}
+                        ng-click="loadCommitHistory(namespace.branch)">{{'Component.Namespace.Branch.History.LoadMore' | translate }}
                         <span class="glyphicon glyphicon-menu-down"></span></button>
                 </div>
                 <div class="empty-container text-center"

+ 29 - 29
apollo-portal/src/main/resources/static/views/component/namespace-panel-master-tab.html

@@ -40,11 +40,11 @@
             <div class="col-md-6 col-sm-6 text-right header-buttons">
 
                 <button type="button" class="btn btn-success btn-sm" data-tooltip="tooltip" data-placement="bottom"
-                    title="{{'Component.Namespace.Master.Items.PubishTips' | translate }}"
+                    title="{{'Component.Namespace.Master.Items.PublishTips' | translate }}"
                     ng-show="(namespace.hasReleasePermission || namespace.hasModifyPermission)"
                     ng-disabled="namespace.isTextEditing" ng-click="publish(namespace)">
                     <img src="img/release.png">
-                    {{'Component.Namespace.Master.Items.Pubish' | translate }}
+                    {{'Component.Namespace.Master.Items.Publish' | translate }}
                 </button>
                 <button type="button" class="btn btn-default btn-sm" data-tooltip="tooltip" data-placement="bottom"
                     title="{{'Component.Namespace.Master.Items.RollbackTips' | translate }}"
@@ -53,10 +53,10 @@
                     {{'Component.Namespace.Master.Items.Rollback' | translate }}
                 </button>
                 <a type="button" class="btn btn-default btn-sm" data-tooltip="tooltip" data-placement="bottom"
-                    title="{{'Component.Namespace.Master.Items.PubishHistoryTips' | translate }}"
+                    title="{{'Component.Namespace.Master.Items.PublishHistoryTips' | translate }}"
                     href="/config/history.html?#/appid={{appId}}&env={{env}}&clusterName={{cluster}}&namespaceName={{namespace.baseInfo.namespaceName}}">
                     <img src="img/release-history.png">
-                    {{'Component.Namespace.Master.Items.PubishHistory' | translate }}
+                    {{'Component.Namespace.Master.Items.PublishHistory' | translate }}
                 </a>
                 <a type="button" class="btn btn-default btn-sm" data-tooltip="tooltip" data-placement="bottom"
                     title="{{'Component.Namespace.Master.Items.GrantTips' | translate }}"
@@ -282,7 +282,7 @@
                                     <span class="label label-info"
                                         ng-if="config.isModified && config.oldValue && !config.isDeleted"
                                         data-tooltip="tooltip" data-placement="bottom"
-                                        title="{{'Component.Namespace.Master.Items.Body.ModifedTips' | translate }}">{{'Component.Namespace.Master.Items.Body.Modifed' | translate }}</span>
+                                        title="{{'Component.Namespace.Master.Items.Body.ModifiedTips' | translate }}">{{'Component.Namespace.Master.Items.Body.Modified' | translate }}</span>
                                     <span class="label label-danger" ng-if="config.isDeleted" data-tooltip="tooltip"
                                         data-placement="bottom"
                                         title="{{'Component.Namespace.Master.Items.Body.DeletedTips' | translate }}">{{'Component.Namespace.Master.Items.Body.Deleted' | translate }}</span>
@@ -400,7 +400,7 @@
                                     <span class="label label-info"
                                         ng-if="config.isModified && config.oldValue && !config.isDeleted"
                                         data-tooltip="tooltip" data-placement="bottom"
-                                        title="{{'Component.Namespace.Master.Items.Body.ModifedTips' | translate }}">{{'Component.Namespace.Master.Items.Body.Modifed' | translate }}</span>
+                                        title="{{'Component.Namespace.Master.Items.Body.ModifiedTips' | translate }}">{{'Component.Namespace.Master.Items.Body.Modified' | translate }}</span>
                                     <span class="label label-danger" ng-if="config.isDeleted" data-tooltip="tooltip"
                                         data-placement="bottom"
                                         title="{{'Component.Namespace.Master.Items.Body.DeletedTips' | translate }}">{{'Component.Namespace.Master.Items.Body.Deleted' | translate }}</span>
@@ -557,7 +557,7 @@
 
                                         <td width="10%" class="text-center" ng-if="!config.isDeleted">
                                             <img src="img/gray.png" data-tooltip="tooltip" data-placement="bottom"
-                                                title="{{'Component.Namespace.Master.Items.Body.Public.PubishedAndCover' | translate }}"
+                                                title="{{'Component.Namespace.Master.Items.Body.Public.PublishedAndCover' | translate }}"
                                                 ng-click="editItem(namespace, config.item)"
                                                 ng-show="namespace.hasModifyPermission && !config.covered">
                                         </td>
@@ -622,7 +622,7 @@
                                         <span class="label label-info"
                                             ng-if="config.isModified && config.oldValue && !config.isDeleted"
                                             data-tooltip="tooltip" data-placement="bottom"
-                                            title="{{'Component.Namespace.Master.Items.Body.ModifedTips' | translate }}">{{'Component.Namespace.Master.Items.Body.Modifed' | translate }}</span>
+                                            title="{{'Component.Namespace.Master.Items.Body.ModifiedTips' | translate }}">{{'Component.Namespace.Master.Items.Body.Modified' | translate }}</span>
                                         <span class="label label-danger" ng-if="config.isDeleted" data-tooltip="tooltip"
                                             data-placement="bottom"
                                             title="{{'Component.Namespace.Master.Items.Body.DeletedTips' | translate }}">{{'Component.Namespace.Master.Items.Body.Deleted' | translate }}</span>
@@ -649,7 +649,7 @@
 
                                     <td width="5%" class="text-center" ng-if="!config.isDeleted">
                                         <img src="img/gray.png" data-tooltip="tooltip" data-placement="bottom"
-                                            title="{{'Component.Namespace.Master.Items.Body.Public.PubishedAndCover' | translate }}"
+                                            title="{{'Component.Namespace.Master.Items.Body.Public.PublishedAndCover' | translate }}"
                                             ng-click="editItem(namespace, config.item)"
                                             ng-show="namespace.hasModifyPermission && !config.covered">
                                     </td>
@@ -712,19 +712,19 @@
                             <thead>
                                 <tr>
                                     <th>
-                                        {{'Component.Namespace.Master.Items.Body.HistoryView.ItemType | translate }}
+                                        {{'Component.Namespace.Master.Items.Body.HistoryView.ItemType' | translate }}
                                     </th>
                                     <th>
-                                        {{'Component.Namespace.Master.Items.Body.HistoryView.ItemKey | translate }}
+                                        {{'Component.Namespace.Master.Items.Body.HistoryView.ItemKey' | translate }}
                                     </th>
                                     <th>
-                                        {{'Component.Namespace.Master.Items.Body.HistoryView.ItemOldValue | translate }}
+                                        {{'Component.Namespace.Master.Items.Body.HistoryView.ItemOldValue' | translate }}
                                     </th>
                                     <th>
-                                        {{'Component.Namespace.Master.Items.Body.HistoryView.ItemNewValue | translate }}
+                                        {{'Component.Namespace.Master.Items.Body.HistoryView.ItemNewValue' | translate }}
                                     </th>
                                     <th>
-                                        {{'Component.Namespace.Master.Items.Body.HistoryView.ItemComment | translate }}
+                                        {{'Component.Namespace.Master.Items.Body.HistoryView.ItemComment' | translate }}
                                     </th>
                                 </tr>
                             </thead>
@@ -732,17 +732,17 @@
 
                                 <!--兼容老数据,不显示item类型为空行和注释的item-->
                                 <tr ng-repeat="item in commits.changeSets.createItems" ng-show="item.key">
-                                    <td width="2%">
-                                        {{'Component.Namespace.Master.Items.Body.HistoryView.NewAdded | translate }}
+                                    <td width="6%">
+                                        {{'Component.Namespace.Master.Items.Body.HistoryView.NewAdded' | translate }}
                                     </td>
                                     <td width="20%" title="{{item.key}}">
 
                                         <span ng-bind="item.key | limitTo: 250"></span>
                                         <span ng-bind="item.key.length > 250 ? '...' :''"></span>
                                     </td>
-                                    <td width="30%">
+                                    <td width="28%">
                                     </td>
-                                    <td width="30%" class="cursor-pointer" title="{{item.value}}"
+                                    <td width="28%" class="cursor-pointer" title="{{item.value}}"
                                         ng-click="showText(item.value)">
                                         <span ng-bind="item.value | limitTo: 250"></span>
                                         <span ng-bind="item.value.length > 250 ? '...': ''"></span>
@@ -753,19 +753,19 @@
                                     </td>
                                 </tr>
                                 <tr ng-repeat="item in commits.changeSets.updateItems">
-                                    <td width="2%">
-                                        {{'Component.Namespace.Master.Items.Body.HistoryView.Updated | translate }}
+                                    <td width="6%">
+                                        {{'Component.Namespace.Master.Items.Body.HistoryView.Updated' | translate }}
                                     </td>
                                     <td width="20%" title="{{item.newItem.key}}">
                                         <span ng-bind="item.newItem.key | limitTo: 250"></span>
                                         <span ng-bind="item.newItem.key.length > 250 ? '...' :''"></span>
                                     </td>
-                                    <td width="30%" class="cursor-pointer" title="{{item.oldItem.value}}"
+                                    <td width="28%" class="cursor-pointer" title="{{item.oldItem.value}}"
                                         ng-click="showText(item.oldItem.value)">
                                         <span ng-bind="item.oldItem.value | limitTo: 250"></span>
                                         <span ng-bind="item.oldItem.value.length > 250 ? '...': ''"></span>
                                     </td>
-                                    <td width="30%" class="cursor-pointer" title="{{item.newItem.value}}"
+                                    <td width="28%" class="cursor-pointer" title="{{item.newItem.value}}"
                                         ng-click="showText(item.newItem.value)">
                                         <span ng-bind="item.newItem.value | limitTo: 250"></span>
                                         <span ng-bind="item.newItem.value.length > 250 ? '...': ''"></span>
@@ -777,18 +777,18 @@
                                 </tr>
                                 <tr ng-repeat="item in commits.changeSets.deleteItems"
                                     ng-show="item.key || item.comment">
-                                    <td width="2%">
-                                        {{'Component.Namespace.Master.Items.Body.HistoryView.Deleted | translate }}
+                                    <td width="6%">
+                                        {{'Component.Namespace.Master.Items.Body.HistoryView.Deleted' | translate }}
                                     </td>
                                     <td width="20%" title="{{item.key}}">
                                         <span ng-bind="item.key | limitTo: 250"></span>
                                         <span ng-bind="item.key.length > 250 ? '...' :''"></span>
                                     </td>
-                                    <td width="30%" title="{{item.value}}">
+                                    <td width="28%" title="{{item.value}}">
                                         <span ng-bind="item.value | limitTo: 250"></span>
                                         <span ng-bind="item.value.length > 250 ? '...': ''"></span>
                                     </td>
-                                    <td width="30%">
+                                    <td width="28%">
                                     </td>
                                     <td width="18%" title="{{item.comment}}">
                                         <span ng-bind="item.comment | limitTo: 250"></span>
@@ -819,7 +819,7 @@
                 </div>
                 <div class="text-center">
                     <button type="button" class="btn btn-default" ng-show="!namespace.hasLoadAllCommit"
-                        ng-click="loadCommitHistory(namespace)">{{'Component.Namespace.Master.Items.Body.HistoryView.LoadingMore' | translate }}
+                        ng-click="loadCommitHistory(namespace)">{{'Component.Namespace.Master.Items.Body.HistoryView.LoadMore' | translate }}
                         <span class="glyphicon glyphicon-menu-down"></span></button>
                 </div>
                 <div class="empty-container text-center" ng-show="!namespace.commits || !namespace.commits.length">
@@ -903,7 +903,7 @@
                         <div class="row text-center"
                             ng-show="namespace.latestReleaseInstances.content.length < namespace.latestReleaseInstances.total">
                             <button class="btn btn-default"
-                                ng-click="loadInstanceInfo(namespace)">{{'Component.Namespace.Master.Items.Body.Instance.LoadingMore' | translate }}</button>
+                                ng-click="loadInstanceInfo(namespace)">{{'Component.Namespace.Master.Items.Body.Instance.LoadMore' | translate }}</button>
 
                         </div>
                     </div>
@@ -983,7 +983,7 @@
                         </table>
                         <div class="row text-center" ng-show="namespace.allInstances.length < namespace.instancesCount">
                             <button class="btn btn-default"
-                                ng-click="loadInstanceInfo(namespace)">{{'Component.Namespace.Master.Items.Body.Instance.LoadingMore' | translate }}</button>
+                                ng-click="loadInstanceInfo(namespace)">{{'Component.Namespace.Master.Items.Body.Instance.LoadMore' | translate }}</button>
                         </div>
                     </div>
                     <div class="text-center" ng-if="namespace.instancesCount == 0">

+ 1 - 1
apollo-portal/src/main/resources/static/views/component/release-modal.html

@@ -80,7 +80,7 @@
                                         <span class="label label-info"
                                             ng-if="config.isModified && config.oldValue && !config.isDeleted"
                                             data-tooltip="tooltip" data-placement="bottom"
-                                            title="{{'Component.Publish.ModifedTips' | translate }}">{{'Component.Publish.Modifed' | translate }}</span>
+                                            title="{{'Component.Publish.ModifiedTips' | translate }}">{{'Component.Publish.Modified' | translate }}</span>
                                         <span class="label label-danger" ng-if="config.isDeleted" data-tooltip="tooltip"
                                             data-placement="bottom"
                                             title="{{'Component.Publish.DeletedTips' | translate }}">{{'Component.Publish.Deleted' | translate }}</span>

+ 3 - 3
apollo-portal/src/main/resources/static/views/component/rollback-modal.html

@@ -6,7 +6,7 @@
                         aria-hidden="true">&times;</span></button>
                 <div class="modal-title text-center">
                     <span style="font-size: 18px;" ng-bind="toRollbackNamespace.firstRelease.name"></span>
-                    <span style="font-size: 18px;"> &nbsp;{{'Component.Rollback.Goto' | translate }}&nbsp;</span>
+                    <span style="font-size: 18px;"> &nbsp;{{'Component.Rollback.To' | translate }}&nbsp;</span>
                     <span style="font-size: 18px;" ng-bind="toRollbackNamespace.secondRelease.name"></span>
                 </div>
             </div>
@@ -14,7 +14,7 @@
                 <div class="alert alert-warning" role="alert">
                     {{'Component.Rollback.Tips' | translate }}
                     <a target="_blank"
-                        href="/config/history.html?#/appid={{appId}}&env={{env}}&clusterName={{toRollbackNamespace.baseInfo.clusterName}}&namespaceName={{toRollbackNamespace.baseInfo.namespaceName}}">点击查看</a>
+                        href="/config/history.html?#/appid={{appId}}&env={{env}}&clusterName={{toRollbackNamespace.baseInfo.clusterName}}&namespaceName={{toRollbackNamespace.baseInfo.namespaceName}}">{{'Component.Rollback.ClickToView' | translate }}</a>
                 </div>
 
                 <div class="form-group" style="margin-top: 15px;">
@@ -46,7 +46,7 @@
                                         <span
                                             ng-show="change.type == 'ADDED'">{{'Component.Rollback.Added' | translate }}</span>
                                         <span
-                                            ng-show="change.type == 'MODIFIED'">{{'Component.Rollback.Modifed' | translate }}</span>
+                                            ng-show="change.type == 'MODIFIED'">{{'Component.Rollback.Modified' | translate }}</span>
                                         <span
                                             ng-show="change.type == 'DELETED'">{{'Component.Rollback.Deleted' | translate }}</span>
                                     </td>