Commit 17a7610f84ba0d04c0986c0de1724dff39d4e7db

Authored by volodymyr-babak
2 parents 3a1eef44 6a51eda9

Merge branch 'master' of github.com:volodymyr-babak/thingsboard into feature/kubernetes

  1 +*.toDelete
1 output/** 2 output/**
2 *.class 3 *.class
3 *~ 4 *~
1 -!bin/  
  1 +!bin/
  2 +/bin/
@@ -51,13 +51,7 @@ import org.thingsboard.server.extensions.api.plugins.msg.ToDeviceRpcRequestBody; @@ -51,13 +51,7 @@ import org.thingsboard.server.extensions.api.plugins.msg.ToDeviceRpcRequestBody;
51 import org.thingsboard.server.extensions.api.plugins.msg.ToDeviceRpcRequestPluginMsg; 51 import org.thingsboard.server.extensions.api.plugins.msg.ToDeviceRpcRequestPluginMsg;
52 import org.thingsboard.server.extensions.api.plugins.msg.ToPluginRpcResponseDeviceMsg; 52 import org.thingsboard.server.extensions.api.plugins.msg.ToPluginRpcResponseDeviceMsg;
53 53
54 -import java.util.HashMap;  
55 -import java.util.HashSet;  
56 -import java.util.List;  
57 -import java.util.Map;  
58 -import java.util.Optional;  
59 -import java.util.Set;  
60 -import java.util.UUID; 54 +import java.util.*;
61 import java.util.concurrent.ExecutionException; 55 import java.util.concurrent.ExecutionException;
62 import java.util.concurrent.TimeoutException; 56 import java.util.concurrent.TimeoutException;
63 import java.util.function.Consumer; 57 import java.util.function.Consumer;
@@ -205,25 +199,21 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso @@ -205,25 +199,21 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso
205 199
206 void processAttributesUpdate(ActorContext context, DeviceAttributesEventNotificationMsg msg) { 200 void processAttributesUpdate(ActorContext context, DeviceAttributesEventNotificationMsg msg) {
207 refreshAttributes(msg); 201 refreshAttributes(msg);
208 - Set<AttributeKey> keys = msg.getDeletedKeys();  
209 if (attributeSubscriptions.size() > 0) { 202 if (attributeSubscriptions.size() > 0) {
210 ToDeviceMsg notification = null; 203 ToDeviceMsg notification = null;
211 if (msg.isDeleted()) { 204 if (msg.isDeleted()) {
212 - List<AttributeKey> sharedKeys = keys.stream() 205 + List<AttributeKey> sharedKeys = msg.getDeletedKeys().stream()
213 .filter(key -> DataConstants.SHARED_SCOPE.equals(key.getScope())) 206 .filter(key -> DataConstants.SHARED_SCOPE.equals(key.getScope()))
214 .collect(Collectors.toList()); 207 .collect(Collectors.toList());
215 notification = new AttributesUpdateNotification(BasicAttributeKVMsg.fromDeleted(sharedKeys)); 208 notification = new AttributesUpdateNotification(BasicAttributeKVMsg.fromDeleted(sharedKeys));
216 } else { 209 } else {
217 - List<AttributeKvEntry> attributes = keys.stream()  
218 - .filter(key -> DataConstants.SHARED_SCOPE.equals(key.getScope()))  
219 - .map(key -> deviceAttributes.getServerPublicAttribute(key.getAttributeKey()))  
220 - .filter(Optional::isPresent)  
221 - .map(Optional::get)  
222 - .collect(Collectors.toList());  
223 - if (attributes.size() > 0) {  
224 - notification = new AttributesUpdateNotification(BasicAttributeKVMsg.fromShared(attributes));  
225 - } else {  
226 - logger.debug("[{}] No public server side attributes changed!", deviceId); 210 + if (DataConstants.SHARED_SCOPE.equals(msg.getScope())) {
  211 + List<AttributeKvEntry> attributes = new ArrayList<>(msg.getValues());
  212 + if (attributes.size() > 0) {
  213 + notification = new AttributesUpdateNotification(BasicAttributeKVMsg.fromShared(attributes));
  214 + } else {
  215 + logger.debug("[{}] No public server side attributes changed!", deviceId);
  216 + }
227 } 217 }
228 } 218 }
229 if (notification != null) { 219 if (notification != null) {
@@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
16 import injectTapEventPlugin from 'react-tap-event-plugin'; 16 import injectTapEventPlugin from 'react-tap-event-plugin';
17 import UrlHandler from './url.handler'; 17 import UrlHandler from './url.handler';
18 import addLocaleKorean from './locale/locale.constant-ko'; 18 import addLocaleKorean from './locale/locale.constant-ko';
  19 +import addLocaleChinese from './locale/locale.constant-zh';
19 20
20 /* eslint-disable import/no-unresolved, import/default */ 21 /* eslint-disable import/no-unresolved, import/default */
21 22
@@ -50,11 +51,15 @@ export default function AppConfig($provide, @@ -50,11 +51,15 @@ export default function AppConfig($provide,
50 $translateProvider.addInterpolation('$translateMessageFormatInterpolation'); 51 $translateProvider.addInterpolation('$translateMessageFormatInterpolation');
51 52
52 addLocaleKorean(locales); 53 addLocaleKorean(locales);
  54 + addLocaleChinese(locales);
53 var $window = angular.injector(['ng']).get('$window'); 55 var $window = angular.injector(['ng']).get('$window');
54 var lang = $window.navigator.language || $window.navigator.userLanguage; 56 var lang = $window.navigator.language || $window.navigator.userLanguage;
55 if (lang === 'ko') { 57 if (lang === 'ko') {
56 $translateProvider.useSanitizeValueStrategy(null); 58 $translateProvider.useSanitizeValueStrategy(null);
57 $translateProvider.preferredLanguage('ko_KR'); 59 $translateProvider.preferredLanguage('ko_KR');
  60 + } else if (lang === 'zh') {
  61 + $translateProvider.useSanitizeValueStrategy(null);
  62 + $translateProvider.preferredLanguage('zh_CN');
58 } 63 }
59 64
60 for (var langKey in locales) { 65 for (var langKey in locales) {
@@ -775,7 +775,8 @@ export default function addLocaleKorean(locales) { @@ -775,7 +775,8 @@ export default function addLocaleKorean(locales) {
775 "language": { 775 "language": {
776 "language": "언어", 776 "language": "언어",
777 "en_US": "영어", 777 "en_US": "영어",
778 - "ko_KR": "한글" 778 + "ko_KR": "한글",
  779 + "zh_CN": "중국어"
779 } 780 }
780 }; 781 };
781 angular.extend(locales, {'ko_KR': ko_KR}); 782 angular.extend(locales, {'ko_KR': ko_KR});
  1 +/*
  2 + * Copyright © 2016-2017 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +
  17 +export default function addLocaleChinese(locales) {
  18 + var zh_CN = {
  19 + "access" : {
  20 + "unauthorized" : "未授权",
  21 + "unauthorized-access" : "未授权访问",
  22 + "unauthorized-access-text" : "您需要登陆才能访问这个资源!",
  23 + "access-forbidden" : "禁止访问",
  24 + "access-forbidden-text" : "您没有访问此位置的权限<br/>如果您仍希望访问此位置,请尝试使用其他用户登录。",
  25 + "refresh-token-expired" : "会话已过期",
  26 + "refresh-token-failed" : "无法刷新会话"
  27 + },
  28 + "action" : {
  29 + "activate" : "激活",
  30 + "suspend" : "暂停",
  31 + "save" : "保存",
  32 + "saveAs" : "另存为",
  33 + "cancel" : "取消",
  34 + "ok" : "确定",
  35 + "delete" : "删除",
  36 + "add" : "添加",
  37 + "yes" : "是",
  38 + "no" : "否",
  39 + "update" : "更新",
  40 + "remove" : "移除",
  41 + "search" : "查询",
  42 + "assign" : "分配",
  43 + "unassign" : "取消分配",
  44 + "share" : "分享",
  45 + "make-private" : "私有",
  46 + "apply" : "应用",
  47 + "apply-changes" : "应用更改",
  48 + "edit-mode" : "编辑模式",
  49 + "enter-edit-mode" : "进入编辑模式",
  50 + "decline-changes" : "拒绝变更",
  51 + "close" : "关闭",
  52 + "back" : "后退",
  53 + "run" : "运行",
  54 + "sign-in" : "登录!",
  55 + "edit" : "编辑",
  56 + "view" : "查看",
  57 + "create" : "创建",
  58 + "drag" : "拖拽",
  59 + "refresh" : "刷新",
  60 + "undo" : "撤销",
  61 + "copy" : "复制",
  62 + "paste" : "粘贴",
  63 + "import" : "导入",
  64 + "export" : "导出",
  65 + "share-via" : "通过 {{provider}}分享"
  66 + },
  67 + "aggregation" : {
  68 + "aggregation" : "聚合",
  69 + "function" : "数据聚合功能",
  70 + "limit" : "最大值",
  71 + "group-interval" : "分组间隔",
  72 + "min" : "最少值",
  73 + "max" : "最大值",
  74 + "avg" : "平均值",
  75 + "sum" : "求和",
  76 + "count" : "计数",
  77 + "none" : "空"
  78 + },
  79 + "admin" : {
  80 + "general" : "常规",
  81 + "general-settings" : "常规设置",
  82 + "outgoing-mail" : "发送邮件",
  83 + "outgoing-mail-settings" : "发送邮件设置",
  84 + "system-settings" : "系统设置",
  85 + "test-mail-sent" : "测试邮件发送成功!",
  86 + "base-url" : "基本URL",
  87 + "base-url-required" : "基本URL是必须的。",
  88 + "mail-from" : "邮件来自",
  89 + "mail-from-required" : "邮件发件人是必须的。",
  90 + "smtp-protocol" : "SMTP协议",
  91 + "smtp-host" : "SMTP主机",
  92 + "smtp-host-required" : "SMTP主机是必须的。",
  93 + "smtp-port" : "SMTP端口",
  94 + "smtp-port-required" : "您必须提供一个smtp端口。",
  95 + "smtp-port-invalid" : "这看起来不是有效的smtp端口。",
  96 + "timeout-msec" : "超时(ms)",
  97 + "timeout-required" : "超时是必须的。",
  98 + "timeout-invalid" : "这看起来不像有效的超时值。",
  99 + "enable-tls" : "启用TLS",
  100 + "send-test-mail" : "发送测试邮件"
  101 + },
  102 + "attribute" : {
  103 + "attributes" : "属性",
  104 + "latest-telemetry" : "最新遥测",
  105 + "attributes-scope" : "设备属性范围",
  106 + "scope-latest-telemetry" : "最新遥测",
  107 + "scope-client" : "客户端属性",
  108 + "scope-server" : "服务端属性",
  109 + "scope-shared" : "共享属性",
  110 + "add" : "添加属性",
  111 + "key" : "键",
  112 + "key-required" : "属性键是必需的。",
  113 + "value" : "值",
  114 + "value-required" : "属性值是必需的。",
  115 + "delete-attributes-title" : "您确定要删除 { count, select, 1 {1 attribute} other {# attributes} }吗?",
  116 + "delete-attributes-text" : "注意,确认后所有选中的属性都会被删除。",
  117 + "delete-attributes" : "删除属性",
  118 + "enter-attribute-value" : "输入属性值",
  119 + "show-on-widget" : "在小部件上显示",
  120 + "widget-mode" : "小部件模式",
  121 + "next-widget" : "下一个小部件",
  122 + "prev-widget" : "上一个小部件",
  123 + "add-to-dashboard" : "添加到仪表板",
  124 + "add-widget-to-dashboard" : "将小部件添加到仪表板",
  125 + "selected-attributes" : "{ count, select, 1 {1 attribute} other {# attributes} } 被选中",
  126 + "selected-telemetry" : "{ count, select, 1 {1 telemetry unit} other {# telemetry units} } 被选中"
  127 + },
  128 + "confirm-on-exit" : {
  129 + "message" : "您有未保存的更改。确定要离开此页吗?",
  130 + "html-message" : "您有未保存的更改。<br/> 确定要离开此页面吗?",
  131 + "title" : "未保存的更改"
  132 + },
  133 + "contact" : {
  134 + "country" : "国家",
  135 + "city" : "城市",
  136 + "state" : "州",
  137 + "postal-code" : "邮政编码",
  138 + "postal-code-invalid" : "只允许数字。",
  139 + "address" : "地址",
  140 + "address2" : "地址2",
  141 + "phone" : "手机",
  142 + "email" : "邮箱",
  143 + "no-address" : "无地址"
  144 + },
  145 + "common" : {
  146 + "username" : "用户名",
  147 + "password" : "密码",
  148 + "enter-username" : "输入用户名",
  149 + "enter-password" : "输入密码",
  150 + "enter-search" : "输入检索条件"
  151 + },
  152 + "customer" : {
  153 + "customers" : "客户",
  154 + "management" : "客户管理",
  155 + "dashboard" : "客户仪表板",
  156 + "dashboards" : "客户仪表板",
  157 + "devices" : "客户设备",
  158 + "public-dashboards" : "公共仪表板",
  159 + "public-devices" : "公共设备",
  160 + "add" : "添加客户",
  161 + "delete" : "删除客户",
  162 + "manage-customer-users" : "管理客户用户",
  163 + "manage-customer-devices" : "管理客户设备",
  164 + "manage-customer-dashboards" : "管理客户仪表板",
  165 + "manage-public-devices" : "管理公共设备",
  166 + "manage-public-dashboards" : "管理公共仪表板",
  167 + "add-customer-text" : "添加新客户",
  168 + "no-customers-text" : "没有找到客户",
  169 + "customer-details" : "客户详情",
  170 + "delete-customer-title" : "您确定要删除客户'{{customerTitle}}'吗?",
  171 + "delete-customer-text" : "小心!确认后,客户及其所有相关数据将不可恢复。",
  172 + "delete-customers-title" : "您确定要删除 { count, select, 1 {1 customer} other {# customers} }?吗",
  173 + "delete-customers-action-title" : "删除 { count, select, 1 {1 customer} other {# customers} }",
  174 + "delete-customers-text" : "小心!确认后,所有选定的客户将被删除,所有相关数据将不可恢复。",
  175 + "manage-users" : "管理用户",
  176 + "manage-devices" : "管理设备",
  177 + "manage-dashboards" : "管理仪表板",
  178 + "title" : "标题",
  179 + "title-required" : "需要标题。",
  180 + "description" : "描述"
  181 + },
  182 + "datetime" : {
  183 + "date-from" : "日期从",
  184 + "time-from" : "时间从",
  185 + "date-to" : "日期到",
  186 + "time-to" : "时间到"
  187 + },
  188 + "dashboard" : {
  189 + "dashboard" : "仪表板",
  190 + "dashboards" : "仪表板库",
  191 + "management" : "仪表板管理",
  192 + "view-dashboards" : "查看仪表板",
  193 + "add" : "添加仪表板",
  194 + "assign-dashboard-to-customer" : "将仪表板分配给客户",
  195 + "assign-dashboard-to-customer-text" : "请选择要分配给客户的仪表板",
  196 + "assign-to-customer-text" : "请选择客户分配仪表板",
  197 + "assign-to-customer" : "分配给客户",
  198 + "unassign-from-customer" : "取消分配客户",
  199 + "make-public" : "使仪表板公有",
  200 + "make-private" : "使仪表板私有",
  201 + "no-dashboards-text" : "没有找到仪表板",
  202 + "no-widgets" : "没有配置小部件",
  203 + "add-widget" : "添加新的小部件",
  204 + "title" : "标题",
  205 + "select-widget-title" : "选择小部件",
  206 + "select-widget-subtitle" : "可用的小部件类型列表",
  207 + "delete" : "删除仪表板",
  208 + "title-required" : "需要标题。",
  209 + "description" : "描述",
  210 + "details" : "详情",
  211 + "dashboard-details" : "仪表板详情",
  212 + "add-dashboard-text" : "添加新的仪表板",
  213 + "assign-dashboards" : "分配仪表板",
  214 + "assign-new-dashboard" : "分配新的仪表板",
  215 + "assign-dashboards-text" : "分配 { count, select, 1 {1 dashboard} other {# dashboards} } 给客户",
  216 + "delete-dashboards" : "删除仪表板",
  217 + "unassign-dashboards" : "取消分配仪表板",
  218 + "unassign-dashboards-action-title" : "取消分配 { count, select, 1 {1 dashboard} other {# dashboards} } from customer",
  219 + "delete-dashboard-title" : "您确定要删除仪表板 '{{dashboardTitle}}'吗?",
  220 + "delete-dashboard-text" : "小心!确认后仪表板及其所有相关数据将不可恢复。",
  221 + "delete-dashboards-title" : "你确定你要删除 { count, select, 1 {1 dashboard} other {# dashboards} }吗?",
  222 + "delete-dashboards-action-title" : "删除 { count, select, 1 {1 dashboard} other {# dashboards} }",
  223 + "delete-dashboards-text" : "小心!确认后所有选定的仪表板将被删除,所有相关数据将不可恢复。",
  224 + "unassign-dashboard-title" : "您确定要取消分配仪表板 '{{dashboardTitle}}'吗?",
  225 + "unassign-dashboard-text" : "确认后,面板将被取消分配,客户将无法访问。",
  226 + "unassign-dashboard" : "取消分配仪表板",
  227 + "unassign-dashboards-title" : "您确定要取消分配仪表板 { count, select, 1 {1 dashboard} other {# dashboards} } 吗?",
  228 + "unassign-dashboards-text" : "确认后,所有选定的仪表板将被取消分配,客户将无法访问。",
  229 + "public-dashboard-title" : "仪表板现已公布",
  230 + "public-dashboard-text" : "你的仪表板 <b>{{dashboardTitle}}</b> 已被公开,可通过如下 <a href='{{publicLink}}' target='_blank'>链接</a>访问:",
  231 + "public-dashboard-notice" : "<b>提示:</b> 不要忘记将相关设备公开以访问其数据。",
  232 + "make-private-dashboard-title" : "您确定要使仪表板 '{{dashboardTitle}}' 私有吗?",
  233 + "make-private-dashboard-text" : "确认后,仪表板将被私有,不能被其他人访问。",
  234 + "make-private-dashboard" : "仪表板私有",
  235 + "socialshare-text" : "'{{dashboardTitle}}' 由ThingsBoard提供支持",
  236 + "socialshare-title" : "'{{dashboardTitle}}' 由ThingsBoard提供支持",
  237 + "select-dashboard" : "选择仪表板",
  238 + "no-dashboards-matching" : "找不到符合 '{{dashboard}}' 的仪表板。",
  239 + "dashboard-required" : "仪表板是必需的。",
  240 + "select-existing" : "选择现有仪表板",
  241 + "create-new" : "创建新的仪表板",
  242 + "new-dashboard-title" : "新仪表板标题",
  243 + "open-dashboard" : "打开仪表板",
  244 + "set-background" : "设置背景",
  245 + "background-color" : "背景颜色",
  246 + "background-image" : "背景图片",
  247 + "background-size-mode" : "背景大小模式",
  248 + "no-image" : "无图像选择",
  249 + "drop-image" : "拖拽图像或单击以选择要上传的文件。",
  250 + "settings" : "设置",
  251 + "columns-count" : "列数",
  252 + "columns-count-required" : "需要列数。",
  253 + "min-columns-count-message" : "只允许最少10列",
  254 + "max-columns-count-message" : "只允许最多1000列",
  255 + "widgets-margins" : "部件间边距",
  256 + "horizontal-margin" : "水平边距",
  257 + "horizontal-margin-required" : "需要水平边距值。",
  258 + "min-horizontal-margin-message" : "只允许0作为最小水平边距值。",
  259 + "max-horizontal-margin-message" : "只允许50作为最大水平边距值。",
  260 + "vertical-margin" : "垂直边距",
  261 + "vertical-margin-required" : "需要垂直边距值。",
  262 + "min-vertical-margin-message" : "只允许0作为最小垂直边距值。",
  263 + "max-vertical-margin-message" : "只允许50作为最大垂直边距值。",
  264 + "display-title" : "显示仪表板标题",
  265 + "title-color" : "标题颜色",
  266 + "display-device-selection" : "显示设备选择",
  267 + "display-dashboard-timewindow" : "显示时间窗口",
  268 + "display-dashboard-export" : "显示导出",
  269 + "import" : "导入仪表板",
  270 + "export" : "导出仪表板",
  271 + "export-failed-error" : "无法导出仪表板: {{error}}",
  272 + "create-new-dashboard" : "创建新的仪表板",
  273 + "dashboard-file" : "仪表板文件",
  274 + "invalid-dashboard-file-error" : "无法导入仪表板: 仪表板数据结构无效。",
  275 + "dashboard-import-missing-aliases-title" : "配置导入仪表板使用的别名",
  276 + "create-new-widget" : "创建新小部件",
  277 + "import-widget" : "导入小部件",
  278 + "widget-file" : "小部件文件",
  279 + "invalid-widget-file-error" : "无法导入窗口小部件: 窗口小部件数据结构无效。",
  280 + "widget-import-missing-aliases-title" : "配置导入的窗口小部件使用的别名",
  281 + "open-toolbar" : "打开仪表板工具栏",
  282 + "close-toolbar" : "关闭工具栏",
  283 + "configuration-error" : "配置错误",
  284 + "alias-resolution-error-title" : "仪表板别名配置错误",
  285 + "invalid-aliases-config" : "无法找到与某些别名过滤器匹配的任何设备。<br/>" +
  286 + "请联系您的管理员以解决此问题。",
  287 + "select-devices" : "选择设备",
  288 + "assignedToCustomer" : "分配给客户",
  289 + "public" : "公共",
  290 + "public-link" : "公共链接",
  291 + "copy-public-link" : "复制公共链接",
  292 + "public-link-copied-message" : "仪表板的公共链接已被复制到剪贴板"
  293 + },
  294 + "datakey" : {
  295 + "settings": "设置",
  296 + "advanced": "高级",
  297 + "label": "标签",
  298 + "color": "颜色",
  299 + "data-generation-func": "数据生成功能",
  300 + "use-data-post-processing-func": "使用数据后处理功能",
  301 + "configuration": "数据键配置",
  302 + "timeseries": "时间序列",
  303 + "attributes": "属性",
  304 + "timeseries-required": "需要设备时间序列。",
  305 + "timeseries-or-attributes-required": "设备时间/属性是必需的。",
  306 + "function-types": "函数类型",
  307 + "function-types-required": "需要函数类型。"
  308 + },
  309 + "datasource" : {
  310 + "type": "数据源类型",
  311 + "add-datasource-prompt": "请添加数据源"
  312 + },
  313 + "details" : {
  314 + "edit-mode": "编辑模式",
  315 + "toggle-edit-mode": "切换编辑模式"
  316 + },
  317 + "device" : {
  318 + "device": "设备",
  319 + "device-required": "设备是必需的",
  320 + "devices": "设备",
  321 + "management": "设备管理",
  322 + "view-devices": "查看设备",
  323 + "device-alias": "设备别名",
  324 + "aliases": "设备别名",
  325 + "no-alias-matching" : "'{{alias}}' 没有找到。",
  326 + "no-aliases-found" : "找不到别名。",
  327 + "no-key-matching" : "'{{key}}' 没有找到。",
  328 + "no-keys-found" : "找不到密钥。",
  329 + "create-new-alias": "创建一个新的!",
  330 + "create-new-key": "创建一个新的!",
  331 + "duplicate-alias-error" : "找到重复别名 '{{alias}}'。 <br> 设备别名必须是唯一的。",
  332 + "configure-alias" : "配置 '{{alias}}' 别名",
  333 + "no-devices-matching" : "找不到与 '{{device}}' 匹配的设备。",
  334 + "alias" : "别名",
  335 + "alias-required" : "需要设备别名。",
  336 + "remove-alias": "删除设备别名",
  337 + "add-alias": "添加设备别名",
  338 + "name-starts-with" : "名称前缀",
  339 + "device-list" : "设备列表",
  340 + "use-device-name-filter" : "使用过滤器",
  341 + "device-list-empty" : "没有被选中的设备",
  342 + "device-name-filter-required" : "设备名称过滤器是必需得。",
  343 + "device-name-filter-no-device-matched" : "找不到以'{{device}}' 开头的设备。",
  344 + "add" : "添加设备",
  345 + "assign-to-customer": "分配给客户",
  346 + "assign-device-to-customer": "将设备分配给客户",
  347 + "assign-device-to-customer-text": "请选择要分配给客户的设备",
  348 + "make-public" : "公有",
  349 + "make-private" : "私有",
  350 + "no-devices-text": "找不到设备",
  351 + "assign-to-customer-text": "请选择客户分配设备",
  352 + "device-details": "设备详细信息",
  353 + "add-device-text": "添加新设备",
  354 + "credentials": "凭据",
  355 + "manage-credentials": "管理凭据",
  356 + "delete": "删除设备",
  357 + "assign-devices": "分配设备",
  358 + "assign-devices-text": "将{count,select,1 {1 device} other {# devices}}分配给客户",
  359 + "delete-devices": "删除设备",
  360 + "unassign-from-customer": "取消分配客户",
  361 + "unassign-devices": "取消分配设备",
  362 + "unassign-devices-action-title": "从客户处取消分配{count,select,1 {1 device} other {# devices}}",
  363 + "assign-new-device": "分配新设备",
  364 + "make-public-device-title" : "您确定要将设备 '{{deviceName}}' 设为公开吗?",
  365 + "make-public-device-text" : "确认后,设备及其所有数据将被公开并可被其他人访问。",
  366 + "make-private-device-title" : "您确定要将设备 '{{deviceName}}' 设为私有吗?",
  367 + "make-private-device-text" : "确认后,设备及其所有数据将被私有化,不被其他人访问。",
  368 + "view-credentials": "查看凭据",
  369 + "delete-device-title": "您确定要删除设备的{{deviceName}}吗?",
  370 + "delete-device-text": "小心!确认后设备及其所有相关数据将不可恢复。",
  371 + "delete-devices-title": "您确定要删除{count,select,1 {1 device} other {# devices}} 吗?",
  372 + "delete-devices-action-title": "删除 {count,select,1 {1 device} other {# devices}}",
  373 + "delete-devices-text": "小心!确认后所有选定的设备将被删除,所有相关数据将不可恢复。",
  374 + "unassign-device-title": "您确定要取消分配设备 '{{deviceName}}'?",
  375 + "unassign-device-text": "确认后,设备将被取消分配,客户将无法访问。",
  376 + "unassign-device": "取消分配设备",
  377 + "unassign-devices-title": "您确定要取消分配{count,select,1 {1 device} other {# devices}} 吗?",
  378 + "unassign-devices-text": "确认后,所有选定的设备将被取消分配,并且客户将无法访问。",
  379 + "device-credentials": "设备凭据",
  380 + "credentials-type": "凭据类型",
  381 + "access-token": "访问令牌",
  382 + "access-token-required": "需要访问令牌",
  383 + "access-token-invalid": "访问令牌长度必须为1到20个字符。",
  384 + "rsa-key": "RSA公钥",
  385 + "rsa-key-required": "需要RSA公钥",
  386 + "secret": "密钥",
  387 + "secret-required": "密钥是必需的",
  388 + "name": "名称",
  389 + "name-required": "名称是必需的。",
  390 + "description": "说明",
  391 + "events": "事件",
  392 + "details": "详细信息",
  393 + "copyId": "复制设备ID",
  394 + "copyAccessToken": "复制访问令牌",
  395 + "idCopiedMessage": "设备ID已复制到剪贴板",
  396 + "accessTokenCopiedMessage": "设备访问令牌已复制到剪贴板",
  397 + "assignedToCustomer": "分配给客户",
  398 + "unable-delete-device-alias-title": "无法删除设备别名",
  399 + "unable-delete-device-alias-text": "设备别名 '{{deviceAlias}}' 不能够被删除,因为它被下列部件所使用: <br/> {{widgetsList}}",
  400 + "is-gateway": "是网关",
  401 + "public" : "公共",
  402 + "device-public" : "设备是公共的"
  403 + },
  404 + "dialog" : {
  405 + "close" : "关闭对话框"
  406 + },
  407 + "error" : {
  408 + "unable-to-connect": "无法连接到服务器!请检查您的互联网连接。",
  409 + "unhandled-error-code": "未处理的错误代码: {{errorCode}}",
  410 + "unknown-error": "未知错误"
  411 + },
  412 + "event" : {
  413 + "event-type": "事件类型",
  414 + "type-alarm": "报警",
  415 + "type-error": "错误",
  416 + "type-lc-event": "生命周期事件",
  417 + "type-stats": "类型统计",
  418 + "no-events-prompt": "找不到事件",
  419 + "error": "错误",
  420 + "alarm": "报警",
  421 + "event-time": "事件时间",
  422 + "server": "服务器",
  423 + "body": "整体",
  424 + "method": "方法",
  425 + "event": "事件",
  426 + "status": "状态",
  427 + "success": "成功",
  428 + "failed": "失败",
  429 + "messages-processed": "消息处理",
  430 + "errors-occurred": "错误发生"
  431 + },
  432 + "fullscreen" : {
  433 + "expand": "展开到全屏",
  434 + "exit": "退出全屏",
  435 + "toggle": "切换全屏模式",
  436 + "fullscreen": "全屏"
  437 + },
  438 + "function" : {
  439 + "function" : "函数"
  440 + },
  441 + "grid" : {
  442 + "delete-item-title": "您确定要删除此项吗?",
  443 + "delete-item-text": "注意,确认后此项及其所有相关数据将变得不可恢复。",
  444 + "delete-items-title" : "你确定你要删除 { count, select, 1 {1 item} other {# items} }吗?",
  445 + "delete-items-action-title" : "删除 { count, select, 1 {1 item} other {# items} }",
  446 + "delete-items-text": "注意,确认后所有选择的项目将被删除,所有相关数据将不可恢复。",
  447 + "add-item-text": "添加新项目",
  448 + "no-items-text": "没有找到项目",
  449 + "item-details": "项目详细信息",
  450 + "delete-item": "删除项目",
  451 + "delete-items": "删除项目",
  452 + "scroll-to-top": "滚动到顶部"
  453 + },
  454 + "help" : {
  455 + "goto-help-page" : "转到帮助页面"
  456 + },
  457 + "home" : {
  458 + "home": "首页",
  459 + "profile": "属性",
  460 + "logout": "注销",
  461 + "menu": "菜单",
  462 + "avatar": "头像",
  463 + "open-user-menu": "打开用户菜单"
  464 + },
  465 + "import" : {
  466 + "no-file" : "没有选择文件",
  467 + "drop-file" : "拖动一个JSON文件或者单击以选择要上传的文件。"
  468 + },
  469 + "item" : {
  470 + "selected" : "选择"
  471 + },
  472 + "js-func" : {
  473 + "no-return-error": "函数必须返回值!",
  474 + "return-type-mismatch": "函数必须返回 '{{type}}' 类型的值!"
  475 + },
  476 + "legend" : {
  477 + "position" : "图例位置",
  478 + "show-max" : "显示最大值",
  479 + "show-min" : "显示最小值",
  480 + "show-avg" : "显示平均值",
  481 + "show-total" : "显示总数",
  482 + "settings" : "图例设置",
  483 + "min" : "最小值",
  484 + "max" : "最大值",
  485 + "avg" : "平均值",
  486 + "total" : "总数"
  487 + },
  488 + "login" : {
  489 + "login": "登录",
  490 + "request-password-reset": "请求密码重置",
  491 + "reset-password": "重置密码",
  492 + "create-password": "创建密码",
  493 + "passwords-mismatch-error": "输入的密码必须相同!",
  494 + "password-again": "再次输入密码",
  495 + "sign-in": "登录 ",
  496 + "username": "用户名(电子邮件)",
  497 + "remember-me": "记住我",
  498 + "forgot-password": "忘记密码?",
  499 + "password-reset": "密码重置",
  500 + "new-password": "新密码",
  501 + "new-password-again": "再次输入新密码",
  502 + "password-link-sent-message": "密码重置链接已成功发送!",
  503 + "email": "电子邮件"
  504 + },
  505 + "plugin" : {
  506 + "plugins" : "插件",
  507 + "delete" : "删除插件",
  508 + "activate" : "激活插件",
  509 + "suspend" : "暂停插件",
  510 + "active" : "激活",
  511 + "suspended" : "暂停",
  512 + "name" : "名称",
  513 + "name-required" : "名称是必填项。",
  514 + "description" : "描述",
  515 + "add" : "添加插件",
  516 + "delete-plugin-title" : "你确定要删除插件 '{{pluginName}}' 吗?",
  517 + "delete-plugin-text" : "小心!确认后,插件和所有相关数据将不可恢复。",
  518 + "delete-plugins-title" : "你确定你要删除 { count, select, 1 {1 plugin} other {# plugins} } 吗?",
  519 + "delete-plugins-action-title" : "删除 { count, select, 1 {1 plugin} other {# plugins} }",
  520 + "delete-plugins-text" : "小心!确认后,所有选定的插件将被删除,所有相关数据将不可恢复。",
  521 + "add-plugin-text" : "添加新的插件",
  522 + "no-plugins-text" : "没有找到插件",
  523 + "plugin-details" : "插件详细信息",
  524 + "api-token" : "API令牌",
  525 + "api-token-required" : "API令牌是必需的。",
  526 + "type" : "插件类型",
  527 + "type-required" : "插件类型是必需的。",
  528 + "configuration" : "插件配置",
  529 + "system" : "系统",
  530 + "select-plugin" : "选择插件",
  531 + "plugin" : "插件",
  532 + "no-plugins-matching" : "没有找到匹配'{{plugin}}'的插件。",
  533 + "plugin-required" : "插件是必需的。",
  534 + "plugin-require-match" : "请选择一个现有的插件。",
  535 + "events" : "事件",
  536 + "details" : "详情",
  537 + "import" : "导入插件",
  538 + "export" : "导出插件",
  539 + "export-failed-error" : "无法导出插件:{{error}}",
  540 + "create-new-plugin" : "创建新的插件",
  541 + "plugin-file" : "插件文件",
  542 + "invalid-plugin-file-error" : "无法导入插件:插件数据结构无效。"
  543 + },
  544 + "position" : {
  545 + "top" : "顶部",
  546 + "bottom" : "底部",
  547 + "left" : "左侧",
  548 + "right" : "右侧"
  549 + },
  550 + "profile" : {
  551 + "profile": "属性",
  552 + "change-password": "更改密码",
  553 + "current-password": "当前密码"
  554 + },
  555 + "rule" : {
  556 + "rules" : "规则",
  557 + "delete" : "删除规则",
  558 + "activate" : "激活规则",
  559 + "suspend" : "暂停规则",
  560 + "active" : "激活",
  561 + "suspended" : "暂停",
  562 + "name" : "名称",
  563 + "name-required" : "名称是必填项。",
  564 + "description" : "描述",
  565 + "add" : "添加规则",
  566 + "delete-rule-title" : "您确定要删除规则'{{ruleName}}'吗?",
  567 + "delete-rule-text" : "小心!确认后,规则和所有相关数据将不可恢复。",
  568 + "delete-rules-title" : "你确定要删除 {count, select, 1 {1 rule} other {# rules}} 吗?",
  569 + "delete-rules-action-title" : "删除 { count, select, 1 {1 rule} other {# rules} }",
  570 + "delete-rules-text" : "小心!确认后,所有选定的规则将被删除,所有相关数据将不可恢复。",
  571 + "add-rule-text" : "添加新规则",
  572 + "no-rules-text" : "没有找到规则",
  573 + "rule-details" : "规则详情",
  574 + "filters" : "过滤器",
  575 + "filter" : "过滤器",
  576 + "add-filter-prompt" : "请添加过滤器",
  577 + "remove-filter" : "删除过滤器",
  578 + "add-filter" : "添加过滤器",
  579 + "filter-name" : "过滤器名称",
  580 + "filter-type" : "过滤器类型",
  581 + "edit-filter" : "编辑过滤器",
  582 + "view-filter" : "查看过滤器",
  583 + "component-name" : "名称",
  584 + "component-name-required" : "名称是必填项。",
  585 + "component-type" : "类型",
  586 + "component-type-required" : "类型是必填项。",
  587 + "processor" : "处理器",
  588 + "no-processor-configured" : "未配置处理器",
  589 + "create-processor" : "创建处理器",
  590 + "processor-name" : "处理器名称",
  591 + "processor-type" : "处理器类型",
  592 + "plugin-action" : "插件动作",
  593 + "action-name" : "动作名称",
  594 + "action-type" : "动作类型",
  595 + "create-action-prompt" : "请创建动作",
  596 + "create-action" : "创建动作",
  597 + "details" : "详情",
  598 + "events" : "事件",
  599 + "system" : "系统",
  600 + "import" : "导入规则",
  601 + "export" : "导出规则",
  602 + "export-failed-error" : "无法导出规则:{{error}}",
  603 + "create-new-rule" : "创建新规则",
  604 + "rule-file" : "规则文件",
  605 + "invalid-rule-file-error" : "无法导入规则:规则数据结构无效。"
  606 + },
  607 + "rule-plugin" : {
  608 + "management" : "规则和插件管理"
  609 + },
  610 + "tenant" : {
  611 + "tenants" : "租户",
  612 + "management" : "租户管理",
  613 + "add" : "添加租户",
  614 + "admins" : "管理员",
  615 + "manage-tenant-admins" : "管理租户管理员",
  616 + "delete" : "删除租户",
  617 + "add-tenant-text" : "添加新租户",
  618 + "no-tenants-text" : "没有找到租户",
  619 + "tenant-details" : "租客详情",
  620 + "delete-tenant-title" : "您确定要删除租户'{{tenantTitle}}'吗?",
  621 + "delete-tenant-text" : "小心!确认后,租户和所有相关数据将不可恢复。",
  622 + "delete-tenants-title" : "您确定要删除 {count,select,1 {1 tenant} other {# tenants}} 吗?",
  623 + "delete-tenants-action-title" : "删除 { count, select, 1 {1 tenant} other {# tenants} }",
  624 + "delete-tenants-text" : "小心!确认后,所有选定的租户将被删除,所有相关数据将不可恢复。",
  625 + "title" : "标题",
  626 + "title-required" : "标题是必填项。",
  627 + "description" : "描述"
  628 + },
  629 + "timeinterval" : {
  630 + "seconds-interval" : "{ seconds, select, 1 {1 second} other {# seconds} }",
  631 + "minutes-interval" : "{ minutes, select, 1 {1 minute} other {# minutes} }",
  632 + "hours-interval" : "{ hours, select, 1 {1 hour} other {# hours} }",
  633 + "days-interval" : "{ days, select, 1 {1 day} other {# days} }",
  634 + "days" : "天",
  635 + "hours" : "时",
  636 + "minutes" : "分",
  637 + "seconds" : "秒",
  638 + "advanced" : "高级"
  639 + },
  640 + "timewindow" : {
  641 + "days" : "{ days, select, 1 { day } other {# days } }",
  642 + "hours" : "{ hours, select, 0 { hour } 1 {1 hour } other {# hours } }",
  643 + "minutes" : "{ minutes, select, 0 { minute } 1 {1 minute } other {# minutes } }",
  644 + "seconds" : "{ seconds, select, 0 { second } 1 {1 second } other {# seconds } }",
  645 + "realtime" : "实时",
  646 + "history" : "历史",
  647 + "last-prefix" : "最后",
  648 + "period" : "从 {{ startTime }} 到 {{ endTime }}",
  649 + "edit" : "编辑时间窗口",
  650 + "date-range" : "日期范围",
  651 + "last" : "最后",
  652 + "time-period" : "时间段"
  653 + },
  654 + "user" : {
  655 + "users" : "用户",
  656 + "customer-users" : "客户用户",
  657 + "tenant-admins" : "租户管理员",
  658 + "sys-admin" : "系统管理员",
  659 + "tenant-admin" : "租户管理员",
  660 + "customer" : "客户",
  661 + "anonymous" : "匿名",
  662 + "add" : "添加用户",
  663 + "delete" : "删除用户",
  664 + "add-user-text" : "添加新用户",
  665 + "no-users-text" : "找不到用户",
  666 + "user-details" : "用户详细信息",
  667 + "delete-user-title" : "您确定要删除用户 '{{userEmail}}' 吗?",
  668 + "delete-user-text" : "小心!确认后,用户和所有相关数据将不可恢复。",
  669 + "delete-users-title" : "你确定你要删除 { count, select, 1 {1 user} other {# users} } 吗?",
  670 + "delete-users-action-title" : "删除 { count, select, 1 {1 user} other {# users} }",
  671 + "delete-users-text" : "小心!确认后,所有选定的用户将被删除,所有相关数据将不可恢复。",
  672 + "activation-email-sent-message" : "激活电子邮件已成功发送!",
  673 + "resend-activation" : "重新发送激活",
  674 + "email" : "电子邮件",
  675 + "email-required" : "电子邮件是必需的。",
  676 + "first-name" : "名字",
  677 + "last-name" : "姓",
  678 + "description" : "描述",
  679 + "default-dashboard" : "默认面板",
  680 + "always-fullscreen" : "始终全屏"
  681 + },
  682 + "value" : {
  683 + "type" : "值类型",
  684 + "string" : "字符串",
  685 + "string-value" : "字符串值",
  686 + "integer" : "数字",
  687 + "integer-value" : "数字值",
  688 + "invalid-integer-value" : "整数值无效",
  689 + "double" : "双精度小数",
  690 + "double-value" : "双精度小数值",
  691 + "boolean" : "布尔",
  692 + "boolean-value" : "布尔值",
  693 + "false" : "假",
  694 + "true" : "真"
  695 + },
  696 + "widget" : {
  697 + "widget-library" : "小部件库",
  698 + "widget-bundle" : "小部件包",
  699 + "select-widgets-bundle" : "选择小部件包",
  700 + "management" : "小部件管理",
  701 + "editor" : "小部件编辑器",
  702 + "widget-type-not-found" : "加载小部件配置时出现问题。<br> 可能关联的\n 小部件类型已删除。",
  703 + "widget-type-load-error" : "由于以下错误,小工具未加载:",
  704 + "remove" : "删除小部件",
  705 + "edit" : "编辑小部件",
  706 + "remove-widget-title" : "您确定要删除小部件 '{{widgetTitle}}' 吗?",
  707 + "remove-widget-text" : "确认后,窗口小部件和所有相关数据将不可恢复。",
  708 + "timeseries" : "时间序列",
  709 + "latest-values" : "最新值",
  710 + "rpc" : "控件小部件",
  711 + "static" : "静态小部件",
  712 + "select-widget-type" : "选择窗口小部件类型",
  713 + "missing-widget-title-error" : "小部件标题必须指定!",
  714 + "widget-saved" : "小部件已保存",
  715 + "unable-to-save-widget-error" : "无法保存窗口小部件! 小部件有错误!",
  716 + "save" : "保存小部件",
  717 + "saveAs" : "将小部件另存为",
  718 + "save-widget-type-as" : "将小部件类型另存为",
  719 + "save-widget-type-as-text" : "请输入新的小部件标题和/或选择目标小部件包",
  720 + "toggle-fullscreen" : "切换全屏",
  721 + "run" : "运行小部件",
  722 + "title" : "小部件标题",
  723 + "title-required" : "需要小部件标题。",
  724 + "type" : "小部件类型",
  725 + "resources" : "资源",
  726 + "resource-url" : "JavaScript/CSS URL",
  727 + "remove-resource" : "删除资源",
  728 + "add-resource" : "添加资源",
  729 + "html" : "HTML",
  730 + "tidy" : "整理",
  731 + "css" : "CSS",
  732 + "settings-schema" : "设置模式",
  733 + "datakey-settings-schema" : "数据键设置模式",
  734 + "javascript" : "Javascript",
  735 + "remove-widget-type-title" : "您确定要删除小部件类型 '{{widgetName}}'吗?",
  736 + "remove-widget-type-text" : "确认后,窗口小部件类型和所有相关数据将不可恢复。",
  737 + "remove-widget-type" : "删除小部件类型",
  738 + "add-widget-type" : "添加新的小部件类型",
  739 + "widget-type-load-failed-error" : "无法加载小部件类型!",
  740 + "widget-template-load-failed-error" : "无法加载小部件模板!",
  741 + "add" : "添加小部件",
  742 + "undo" : "撤消小部件更改",
  743 + "export" : "导出小部件"
  744 + },
  745 + "widgets-bundle" : {
  746 + "current" : "当前包",
  747 + "widgets-bundles" : "小部件包",
  748 + "add" : "添加小部件包",
  749 + "delete" : "删除小部件包",
  750 + "title" : "标题",
  751 + "title-required" : "标题是必填项。",
  752 + "add-widgets-bundle-text" : "添加新的小部件包",
  753 + "no-widgets-bundles-text" : "找不到小部件包",
  754 + "empty" : "小部件包是空的",
  755 + "details" : "详情",
  756 + "widgets-bundle-details" : "小部件包详细信息",
  757 + "delete-widgets-bundle-title" : "您确定要删除小部件包 '{{widgetsBundleTitle}}'吗?",
  758 + "delete-widgets-bundle-text" : "小心!确认后,小部件包和所有相关数据将不可恢复。",
  759 + "delete-widgets-bundles-title" : "你确定你要删除 { count, select, 1 {1 widgets bundle} other {# widgets bundles} } 吗?",
  760 + "delete-widgets-bundles-action-title" : "删除 { count, select, 1 {1 widgets bundle} other {# widgets bundles} }",
  761 + "delete-widgets-bundles-text" : "小心!确认后,所有选定的小部件包将被删除,所有相关数据将不可恢复。",
  762 + "no-widgets-bundles-matching" : "没有找到与 '{{widgetsBundle}}' 匹配的小部件包。",
  763 + "widgets-bundle-required" : "需要小部件包。",
  764 + "system" : "系统",
  765 + "import" : "导入小部件包",
  766 + "export" : "导出小部件包",
  767 + "export-failed-error" : "无法导出小部件包: {{error}}",
  768 + "create-new-widgets-bundle" : "创建新的小部件包",
  769 + "widgets-bundle-file" : "小部件包文件",
  770 + "invalid-widgets-bundle-file-error" : "无法导入小部件包:无效的小部件包数据结构。"
  771 + },
  772 + "widget-config" : {
  773 + "data" : "数据",
  774 + "settings" : "设置",
  775 + "advanced" : "高级",
  776 + "title" : "标题",
  777 + "general-settings" : "常规设置",
  778 + "display-title" : "显示标题",
  779 + "drop-shadow" : "阴影",
  780 + "enable-fullscreen" : "启用全屏",
  781 + "background-color" : "背景颜色",
  782 + "text-color" : "文字颜色",
  783 + "padding" : "填充",
  784 + "title-style" : "标题风格",
  785 + "mobile-mode-settings" : "移动模式设置",
  786 + "order" : "顺序",
  787 + "height" : "高度",
  788 + "units" : "特殊符号展示值",
  789 + "decimals" : "浮点数后的位数",
  790 + "timewindow" : "时间窗口",
  791 + "use-dashboard-timewindow" : "使用仪表板的时间窗口",
  792 + "display-legend" : "显示图例",
  793 + "datasources" : "数据源",
  794 + "datasource-type" : "类型",
  795 + "datasource-parameters" : "参数",
  796 + "remove-datasource" : "移除数据源",
  797 + "add-datasource" : "添加数据源",
  798 + "target-device" : "目标设备"
  799 + },
  800 + "widget-type" : {
  801 + "import" : "导入小部件类型",
  802 + "export" : "导出小部件类型",
  803 + "export-failed-error" : "无法导出小部件类型: {{error}}",
  804 + "create-new-widget-type" : "创建新的小部件类型",
  805 + "widget-type-file" : "小部件类型文件",
  806 + "invalid-widget-type-file-error" : "无法导入小部件类型:无效的小部件类型数据结构。"
  807 + },
  808 + "language" : {
  809 + "language" : "语言",
  810 + "en_US" : "英语",
  811 + "ko_KR" : "韩语",
  812 + "zh_CN" : "汉语"
  813 + }
  814 + };
  815 + angular.extend(locales, {
  816 + 'zh_CN' : zh_CN
  817 + });
  818 +}
@@ -810,7 +810,8 @@ export default angular.module('thingsboard.locale', []) @@ -810,7 +810,8 @@ export default angular.module('thingsboard.locale', [])
810 "language": { 810 "language": {
811 "language": "Language", 811 "language": "Language",
812 "en_US": "English", 812 "en_US": "English",
813 - "ko_KR": "Korean" 813 + "ko_KR": "Korean",
  814 + "zh_CN": "Chinese"
814 } 815 }
815 } 816 }
816 } 817 }
@@ -27,7 +27,11 @@ export default function ProfileController(userService, $scope, $document, $mdDia @@ -27,7 +27,11 @@ export default function ProfileController(userService, $scope, $document, $mdDia
27 27
28 vm.save = save; 28 vm.save = save;
29 vm.changePassword = changePassword; 29 vm.changePassword = changePassword;
30 - vm.languageList = {en_US: {value: "en_US", name: "language.en_US"}, ko_KR: {value : "ko_KR", name: "language.ko_KR"}}; 30 + vm.languageList = {
  31 + en_US: {value : "en_US", name: "language.en_US"},
  32 + ko_KR: {value : "ko_KR", name: "language.ko_KR"},
  33 + zh_CN: {value : "zh_CN", name: "language.zh_CN"}
  34 + };
31 35
32 loadProfile(); 36 loadProfile();
33 37