thingsboard-aplcache

Merge pull request #88 from OutOfBedlam/PR/sel_locale_ui Add

3/23/2017 1:57:02 PM

Details

diff --git a/ui/src/app/app.config.js b/ui/src/app/app.config.js
index c32257d..9b2ad25 100644
--- a/ui/src/app/app.config.js
+++ b/ui/src/app/app.config.js
@@ -15,6 +15,7 @@
  */
 import injectTapEventPlugin from 'react-tap-event-plugin';
 import UrlHandler from './url.handler';
+import addLocaleKorean from './locale/locale.constant-ko';
 
 /* eslint-disable import/no-unresolved, import/default */
 
@@ -48,6 +49,14 @@ export default function AppConfig($provide,
     $translateProvider.useMissingTranslationHandlerLog();
     $translateProvider.addInterpolation('$translateMessageFormatInterpolation');
 
+    addLocaleKorean(locales);
+    var $window = angular.injector(['ng']).get('$window');
+    var lang = $window.navigator.language || $window.navigator.userLanguage;
+    if (lang === 'ko') {
+        $translateProvider.useSanitizeValueStrategy(null);
+        $translateProvider.preferredLanguage('ko_KR');
+    }
+
     for (var langKey in locales) {
         var translationTable = locales[langKey];
         $translateProvider.translations(langKey, translationTable);
diff --git a/ui/src/app/locale/locale.constant.js b/ui/src/app/locale/locale.constant.js
index 6d4e5a5..3de229e 100644
--- a/ui/src/app/locale/locale.constant.js
+++ b/ui/src/app/locale/locale.constant.js
@@ -774,6 +774,11 @@ export default angular.module('thingsboard.locale', [])
                     "create-new-widget-type": "Create new widget type",
                     "widget-type-file": "Widget type file",
                     "invalid-widget-type-file-error": "Unable to import widget type: Invalid widget type data structure."
+                },
+                "language": {
+                    "language": "Language",
+                    "en_US": "English",
+                    "ko_KR": "Korean"
                 }
             }
         }
diff --git a/ui/src/app/locale/locale.constant-ko.js b/ui/src/app/locale/locale.constant-ko.js
index 06cd26b..bdc9388 100644
--- a/ui/src/app/locale/locale.constant-ko.js
+++ b/ui/src/app/locale/locale.constant-ko.js
@@ -14,767 +14,769 @@
  * limitations under the License.
  */
 
-export default angular.module('thingsboard.locale', [])
-    .constant('locales',
-        {
-            'ko_KR': {
-                "access": {
-                    "unauthorized": "권한 없음.",
-                    "unauthorized-access": "허가되지 않은 접근",
-                    "unauthorized-access-text": "이 리소스에 접근하려면 로그인해야 합니다!",
-                    "access-forbidden": "접근 금지",
-                    "access-forbidden-text": "접근 권한이 없습니다.!<br/> 만일 이 페이지에 계속 접근하려면 다른 사용자로 로그인 하세요.",
-                    "refresh-token-expired": "세션이 만료되었습니다.",
-                    "refresh-token-failed": "세션을 새로 고칠 수 없습니다."
-                },
-                "action": {
-                    "activate": "활설화",
-                    "suspend": "비활성화",
-                    "save": "저장",
-                    "saveAs": "다른 이름으로 저장",
-                    "cancel": "취소",
-                    "ok": "확인",
-                    "delete": "삭제",
-                    "add": "추가",
-                    "yes": "네",
-                    "no": "아니오",
-                    "update": "업데이트",
-                    "remove": "제거",
-                    "search": "검색",
-                    "assign": "할당",
-                    "unassign": "비할당",
-                    "apply": "적용",
-                    "apply-changes": "변경사항 적용",
-                    "edit-mode": "수정 모드",
-                    "enter-edit-mode": "수정 모드 진입",
-                    "decline-changes": "변경사항 포기",
-                    "close": "닫기",
-                    "back": "뒤로",
-                    "run": "실행",
-                    "sign-in": "로그인!",
-                    "edit": "수정",
-                    "view": "보기",
-                    "create": "만들기",
-                    "drag": "끌기",
-                    "refresh": "새로고침",
-                    "undo": "취소",
-                    "copy": "복사",
-                    "paste": "붙여넣기",
-                    "import": "가져오기",
-                    "export": "내보내기"
-                },
-                "aggregation": {
-                    "aggregation": "집합",
-                    "function": "데이터 집합 함수",
-                    "limit": "최대 값",
-                    "group-interval": "그룹 간격",
-                    "min": "최소",
-                    "max": "최대",
-                    "avg": "평균",
-                    "sum": "합계",
-                    "count": "숫자",
-                    "none": "없음"
-                },
-                "admin": {
-                    "general": "일반",
-                    "general-settings": "일반 설정",
-                    "outgoing-mail": "메일 전송",
-                    "outgoing-mail-settings": "메일 전송 설정",
-                    "system-settings": "시스템 설정",
-                    "test-mail-sent": "테스트 메일이 성공적으로 전송되었습니다!",
-                    "base-url": "기본 URL",
-                    "base-url-required": "기본 URL을 입력해야 합니다.",
-                    "mail-from": "보내는 사람",
-                    "mail-from-required": "보내는 사람을 입력해야 합니다.",
-                    "smtp-protocol": "SMTP 프로토콜",
-                    "smtp-host": "SMTP 호스트",
-                    "smtp-host-required": "SMTP 호스트를 입력해야 합니다.",
-                    "smtp-port": "SMTP 포트",
-                    "smtp-port-required": "SMTP 포트를 입력해야 합니다.",
-                    "smtp-port-invalid": "올바른 SMTP 포트가 아닙니다.",
-                    "timeout-msec": "제한시간 (msec)",
-                    "timeout-required": "제한시간을 입력해야 합니다.",
-                    "timeout-invalid": "올바른 제한시간이 아닙니다.",
-                    "enable-tls": "TLS 사용",
-                    "send-test-mail": "테스트 메일 보내기"
-                },
-                "attribute": {
-                    "attributes": "속성",
-                    "latest-telemetry": "최근 데이터",
-                    "attributes-scope": "디바이스 속성 범위",
-                    "scope-latest-telemetry": "최근 데이터",
-                    "scope-client": "클라이언트 속성",
-                    "scope-server": "서버 속성",
-                    "scope-shared": "공유 속성",
-                    "add": "속성 추가",
-                    "key": "Key",
-                    "key-required": "속성 key를 입력하세요.",
-                    "value": "Value",
-                    "value-required": "속성 value를 입력하세요.",
-                    "delete-attributes-title": "{ count, select, 1 {속성} other {여러 속성들을} } 삭제하시겠습니까??",
-                    "delete-attributes-text": "모든 선택된 속성들이 제거 될 것이므로 주의하십시오.",
-                    "delete-attributes": "속성 삭제",
-                    "enter-attribute-value": "속성 값 입력",
-                    "show-on-widget": "위젯 보기",
-                    "widget-mode": "위젯 모드",
-                    "next-widget": "다음 위젯",
-                    "prev-widget": "이전 위젯",
-                    "add-to-dashboard": "대시보드에 추가",
-                    "add-widget-to-dashboard": "대시보드에 위젯 추가",
-                    "selected-attributes": "{ count, select, 1 {속성 1개} other {속성 #개} } 선택됨",
-                    "selected-telemetry": "{ count, select, 1 {최근 데이터 1개} other {최근 데이터 #개} } 선택됨"
-                },
-                "confirm-on-exit": {
-                    "message": "변경 사항을 저장하지 않았습니다. 이 페이지를 나가시겠습니까?",
-                    "html-message": "변경 사항을 저장하지 않았습니다.<br/>이 페이지를 나가시겠습니까?",
-                    "title": "저장되지 않은 변경사항"
-                },
-                "contact": {
-                    "country": "국가",
-                    "city": "시",
-                    "state": "도",
-                    "postal-code": "우편 번호",
-                    "postal-code-invalid": "숫자만 입력하세요.",
-                    "address": "주소",
-                    "address2": "상세주소",
-                    "phone": "전화번호",
-                    "email": "Email",
-                    "no-address": "주소 정보 없음"
-                },
-                "common": {
-                    "username": "사용자명",
-                    "password": "비밀번호",
-                    "enter-username": "사용자명을 입력하세요.",
-                    "enter-password": "비밀번호를 입력하세요.",
-                    "enter-search": "검색어 입력"
-                },
-                "customer": {
-                    "customers": "커스터머",
-                    "management": "커스터머 관리",
-                    "dashboard": "커스터머 대시보드",
-                    "dashboards": "커스터머 대시보드",
-                    "devices": "커스터머 디바이스",
-                    "add": "커스터머 추가",
-                    "delete": "커스터머 삭제",
-                    "manage-customer-users": "커스터머 사용자 관리",
-                    "manage-customer-devices": "커스터머 디바이스 관리",
-                    "manage-customer-dashboards": "커스터머 대시보드 관리",
-                    "add-customer-text": "커스터머 추가",
-                    "no-customers-text": "커스터머가 없습니다.",
-                    "customer-details": "커스터머 상세정보",
-                    "delete-customer-title": "'{{customerTitle}}' 커스터머를 삭제하시겠습니까?",
-                    "delete-customer-text": "커스터머 및 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "delete-customers-title": "{ count, select, 1 {커스터머 1개} other {커스터머 #개} }를 삭제하시겠습니까?",
-                    "delete-customers-action-title": "{ count, select, 1 {커스터머 1개} other {커스터머 #개} } 삭제",
-                    "delete-customers-text": "선택된 커스터머는 삭제되고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "manage-users": "사용자 관리",
-                    "manage-devices": "디바이스 관리",
-                    "manage-dashboards": "대시보드 관리",
-                    "title": "타이틀",
-                    "title-required": "타이틀을 입력하세요.",
-                    "description": "설명"
-                },
-                "datetime": {
-                    "date-from": "시작 날짜",
-                    "time-from": "시작 시간",
-                    "date-to": "종료 날짜",
-                    "time-to": "종료 시간"
-                },
-                "dashboard": {
-                    "dashboard": "대시보드",
-                    "dashboards": "대시보드",
-                    "management": "대시보드 관리",
-                    "view-dashboards": "대시보드 보기",
-                    "add": "대시보드 추가",
-                    "assign-dashboard-to-customer": "대시보드 커스터머 선택",
-                    "assign-dashboard-to-customer-text": "대시보드 커스터머를 선택하세요.",
-                    "assign-to-customer-text": "대시보드 커스터머를 선택하세요.",
-                    "assign-to-customer": "커스터머 선택",
-                    "unassign-from-customer": "커스터머 해제",
-                    "no-dashboards-text": "대시보드가 없습니다",
-                    "no-widgets": "설정된 위젯 없음",
-                    "add-widget": "위젯 추가",
-                    "title": "타이틀",
-                    "select-widget-title": "위젯 선택",
-                    "select-widget-subtitle": "사용가능한 위젯 타입 목록",
-                    "delete": "대시보드 삭제",
-                    "title-required": "타이틀을 입력하세요.",
-                    "description": "설명",
-                    "details": "상세",
-                    "dashboard-details": "대시보드 상세정보",
-                    "add-dashboard-text": "대시보드 추가",
-                    "assign-dashboards": "대시보드 지정",
-                    "assign-new-dashboard": "새 대시보드 할당",
-                    "assign-dashboards-text": "{ count, select, 1 {대시보드 1개} other {대시보드 #개} }를 커스터머 할당",
-                    "delete-dashboards": "대시보드 삭제",
-                    "unassign-dashboards": "대시보드 할당 취소",
-                    "unassign-dashboards-action-title": "{ count, select, 1 {대시보드 1개} other {대시보드 #개} }를 커스터머 할당 취소",
-                    "delete-dashboard-title": "'{{dashboardTitle}}' 대시보드를 삭제하시겠습니까?",
-                    "delete-dashboard-text": "대시보드 및 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "delete-dashboards-title": "{ count, select, 1 {대시보드 1개} other {대시보드 #개} }를 삭제하시겠습니까?",
-                    "delete-dashboards-action-title": "{ count, select, 1 {대시보드 1개} other {대시보드 #개} } 삭제",
-                    "delete-dashboards-text": "선택된 대시보드가 삭제되고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "unassign-dashboard-title": "'{{dashboardTitle}}' 대시보드 할당을 해제하시겠습니까?",
-                    "unassign-dashboard-text": "대시보드가 할당 해제되고 커스터머는 액세스 할 수 없게됩니다.",
-                    "unassign-dashboard": "대시보드 할달 취소",
-                    "unassign-dashboards-title": "{ count, select, 1 {대시보드 1개} other {대시보드 #개} }의 할당을 취소하시겠습니까?",
-                    "unassign-dashboards-text": "선택된 대시보드가 할당 해제되고 커스터머는 액세스 할 수 없게됩니다.",
-                    "select-dashboard": "대시보드 선택",
-                    "no-dashboards-matching": "'{{dashboard}}'와 일치하는 대시보드가 없습니다.",
-                    "dashboard-required": "대시보드를 입력하세요.",
-                    "select-existing": "기존 대시보드 선택",
-                    "create-new": "대시보드 생성",
-                    "new-dashboard-title": "새로운 대시보드 타이틀",
-                    "open-dashboard": "대시보드 열기",
-                    "set-background": "대시보드 설정",
-                    "background-color": "배경색",
-                    "background-image": "배경 이미지",
-                    "background-size-mode": "배경 사이즈 모드",
-                    "no-image": "이미지 없음",
-                    "drop-image": "이곳에 이미지를 끌어다놓거나 이곳을 클릭하여 파일을 선택하고 업로드하세요.",
-                    "settings": "설정",
-                    "columns-count": "열 개수",
-                    "columns-count-required": "열 개수를 입력하세요.",
-                    "min-columns-count-message": "열 개수를 최소 10 이상 입력하세요.",
-                    "max-columns-count-message": "열 개수를 최대 100 이하로 입력하세요.",
-                    "widgets-margins": "위젯 사이 여백 크기",
-                    "horizontal-margin": "세로 여백",
-                    "horizontal-margin-required": "세로 여백 값을 입력하세요.",
-                    "min-horizontal-margin-message": "세로 여백 값을 최소 0 이상 입력하세요.",
-                    "max-horizontal-margin-message": "세로 여백 값을 최대 50 이하로 입력하세요.",
-                    "vertical-margin": "가로 여백",
-                    "vertical-margin-required": "가로 여백 값을 입력하세요.",
-                    "min-vertical-margin-message": "가로 여백 값을 최소 0 이상 입력하세요.",
-                    "max-vertical-margin-message": "가로 여백 값을 최대 50 이하로 입력하세요.",
-                    "display-title": "대시보드 타이틀 표시",
-                    "title-color": "타이틀 색상",
-                    "import": "대시보드 가져오기",
-                    "export": "대시보드 내보내기",
-                    "export-failed-error": "대시보드 내보내기를 할 수 없습니다.: {error}",
-                    "create-new-dashboard": "대시보드 생성",
-                    "dashboard-file": "대시보드 파일",
-                    "invalid-dashboard-file-error": "대시보드 가져오기를 할 수 없습니다.: 대시보드 데이터 구조가 잘못되었습니다.",
-                    "dashboard-import-missing-aliases-title": "대시보드 앨리어스를 위해 누락 된 디바이스 선택",
-                    "create-new-widget": "새로운 위젯 생성",
-                    "import-widget": "위젯 가져오기",
-                    "widget-file": "위젯 파일",
-                    "invalid-widget-file-error": "위젯 가져오기를 할 수 없습니다: 위젯 데이터 구조가 잘못되었습니다.",
-                    "widget-import-missing-aliases-title": "위젯에서 사용하는 누락 된 디바이스 선택",
-                    "open-toolbar": "대시보드 툴바 열기",
-                    "close-toolbar": "툴바 닫기",
-                    "configuration-error": "구성 오류",
-                    "alias-resolution-error-title": "대시보드 앨리어스 구성 오류",
-                    "invalid-aliases-config": "일부 앨리어스 필터와 일치하는 디바이스를 찾을 수 없습니다.<br/>" +
-                                              "이 문제를 해결하려면 관리자에게 문의하십시오.",
-                    "select-devices": "디바이스 선택",
-                    "assignedToCustomer": "커스터머에 할당됨"
-                },
-                "datakey": {
-                    "settings": "설정",
-                    "advanced": "고급",
-                    "label": "Label",
-                    "color": "색상",
-                    "data-generation-func": "데이터 생성 기능",
-                    "use-data-post-processing-func": "데이터 후처리 기능 사용",
-                    "configuration": "데이터 key 구성",
-                    "timeseries": "Timeseries",
-                    "attributes": "Attributes",
-                    "timeseries-required": "디바이스 timeseries 를 입력하세요.",
-                    "timeseries-or-attributes-required": "디바이스 timeseries/attributes 를 입력하세요.",
-                    "function-types": "함수 유형",
-                    "function-types-required": "함수 유형을 입력하세요."
-                },
-                "datasource": {
-                    "type": "데이터소스 유형",
-                    "add-datasource-prompt": "데이터소스를 추가하세요."
-                },
-                "details": {
-                    "edit-mode": "편집 모드",
-                    "toggle-edit-mode": "편집 모드 전환"
-                },
-                "device": {
-                    "device": "디바이스",
-                    "device-required": "디바이스를 입력하세요.",
-                    "devices": "디바이스",
-                    "management": "디바이스 관리",
-                    "view-devices": "디바이스 보기",
-                    "device-alias": "디바이스 앨리어스",
-                    "aliases": "디바이스 앨리어스",
-                    "no-alias-matching": "'{{alias}}' 를 찾을 수 없습니다.",
-                    "no-aliases-found": "앨리어스가 없습니다.",
-                    "no-key-matching": "'{{key}}' 를 찾을 수 없습니다.",
-                    "no-keys-found": "Key가 없습니다.",
-                    "create-new-alias": "새로 만들기!",
-                    "create-new-key": "새로 만들기!",
-                    "duplicate-alias-error": "중복된 '{{alias}}' 앨리어스가 있습니다.<br> 디바이스 앨리어스는 대시보드 내에서 고유해야 합니다.",
-                    "configure-alias": "'{{alias}}' 앨리어스 구성",
-                    "no-devices-matching": "'{{device}}'와 일치하는 디바이스를 찾을 수 없습니다.",
-                    "alias": "앨리어스",
-                    "alias-required": "디바이스 앨리어스를 입력하세요.",
-                    "remove-alias": "디바이스 앨리어스 삭제",
-                    "add-alias": "디바이스 앨리어스 추가",
-                    "name-starts-with": "시작되는 이름",
-                    "device-list": "디바이스 리스트",
-                    "use-device-name-filter": "필터 사용",
-                    "device-list-empty": "선택된 디바이스가 없습니다.",
-                    "device-name-filter-required": "디바이스 필터 이름을 입력하세요.",
-                    "device-name-filter-no-device-matched": "'{{device}}' 로 시작되는 디바이스를 찾을 수 없습니다.",
-                    "add": "디바이스 추가",
-                    "assign-to-customer": "커스터머에게 할당",
-                    "assign-device-to-customer": "디바이스를 커스터머에게 할당",
-                    "assign-device-to-customer-text": "고객에게 할당할 디바이스를 선택하십시오.",
-                    "no-devices-text": "디바이스 없음",
-                    "assign-to-customer-text": "디바이스를 할당할 커스터머를 선택하세요.",
-                    "device-details": "디바이스 상세정보",
-                    "add-device-text": "디바이스 추가",
-                    "credentials": "크리덴셜",
-                    "manage-credentials": "크리덴셜 관리",
-                    "delete": "디바이스 삭제",
-                    "assign-devices": "디바이스 할당",
-                    "assign-devices-text": "{ count, select, 1 {디바이스 1개} other {디바이스 #개} }를 커서터머에 할당",
-                    "delete-devices": "디바이스 삭제",
-                    "unassign-from-customer": "커스터머 할당 해제",
-                    "unassign-devices": "디바이스 할당 취소",
-                    "unassign-devices-action-title": "{ count, select, 1 {디바이스 1개} other {디바이스 #개} }를 커스터머에게서 할당 해제",
-                    "assign-new-device": "새로운 디바이스 할당",
-                    "view-credentials": "크리덴셜 보기",
-                    "delete-device-title": "'{{deviceName}}' 디바이스를 삭제하시겠습니까?",
-                    "delete-device-text": "디바이스 및 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "delete-devices-title": "{ count, select, 1 {디바이스 1개} other {디바이스 #개} }를 삭제하시겠습니까?",
-                    "delete-devices-action-title": "{ count, select, 1 {디바이스 1개} other {디바이스 #개} } 삭제",
-                    "delete-devices-text": "선택된 디바이스가 삭제되고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "unassign-device-title": "'{{deviceName}}' 디바이스 할당을 해제하시겠습니까?",
-                    "unassign-device-text": "디바이스가 할당 해제되고 커스터머는 액세스 할 수 없게됩니다.",
-                    "unassign-device": "디바이스 할당 취소",
-                    "unassign-devices-title": "{ count, select, 1 {디바이스 1개} other {디바이스 #개} }의  할당을 해제하시겠습니까??",
-                    "unassign-devices-text": "선택된 디바이스가 할당 해제되고 커스터머는 액세스 할 수 없게됩니다.",
-                    "device-credentials": "디바이스 크리덴셜",
-                    "credentials-type": "크리덴셜 타입",
-                    "access-token": "억세스 토큰",
-                    "access-token-required": "액세스 토큰을 입력하세요.",
-                    "access-token-invalid": "액세스 토큰 길이는 1 - 20 자 여야합니다.",
-                    "rsa-key": "RSA public key",
-                    "rsa-key-required": "RSA public key 를 입력하세요.",
-                    "secret": "시크릿",
-                    "secret-required": "시크릿을 입력하세요.",
-                    "name": "이름",
-                    "name-required": "이름을 입력하세요.",
-                    "description": "설명",
-                    "events": "이벤트",
-                    "details": "상세",
-                    "copyId": "디바이스 아이디 복사",
-                    "copyAccessToken": "억세스 토큰 복사",
-                    "idCopiedMessage": "디바이스 아이디가 클립보드에 복사되었습니다.",
-                    "accessTokenCopiedMessage": "디바이스 억세스 토큰이 클립보드에 복사되었습니다.",
-                    "assignedToCustomer": "커스터머에 할당됨",
-                    "unable-delete-device-alias-title": "디바이스 앨리어스를 삭제할 수 없습니다.",
-                    "unable-delete-device-alias-text": "'{{deviceAlias}}' 디바이스 앨리어스를 삭제할 수 없습니다. 다음 위젯에서 사용하고 있습니다.<br/>{{widgetsList}}",
-                    "is-gateway": "게이트웨이 여부"
-                },
-                "dialog": {
-                    "close": "다이얼로그 닫기"
-                },
-                "error": {
-                    "unable-to-connect": "서버에 연결할 수 없습니다! 인터넷 연결을 확인하십시오.",
-                    "unhandled-error-code": "처리되지 않은 오류 코드: {{errorCode}}",
-                    "unknown-error": "알 수 없는 오류"
-                },
-                "event": {
-                    "event-type": "이벤트 타입",
-                    "type-alarm": "알람",
-                    "type-error": "에러",
-                    "type-lc-event": "주기적 이벤트",
-                    "type-stats": "통계",
-                    "no-events-prompt": "이벤트 없음",
-                    "error": "에러",
-                    "alarm": "알람",
-                    "event-time": "이벤트 발생 시간",
-                    "server": "서버",
-                    "body": "Body",
-                    "method": "Method",
-                    "event": "이벤트",
-                    "status": "상태",
-                    "success": "성공",
-                    "failed": "실패",
-                    "messages-processed": "처리된 메시지",
-                    "errors-occurred": "오류가 발생했습니다"
-                },
-                "fullscreen": {
-                    "expand": "전체화면으로 확장",
-                    "exit": "전체화면 종료",
-                    "toggle": "전체화면 모드 전환",
-                    "fullscreen": "전체화면"
-                },
-                "function": {
-                    "function": "기능"
-                },
-                "grid": {
-                    "delete-item-title": "이 항목을 삭제 하시겠습니까?",
-                    "delete-item-text": "항목과 모든 관련 데이터를 복구 할 수 없으므로 주의하십시오.",
-                    "delete-items-title": "{ count, select, 1 {아이템 1개} other {아이템 #개} }를 삭제하시겠습니까?",
-                    "delete-items-action-title": "{ count, select, 1 {아이템 1개} other {아이템 #개} } 삭제",
-                    "delete-items-text": "선택한 모든 아이템이 제거되고 관련된 모든 데이터는 복구 할 수 없으므로 주의하십시오.",
-                    "add-item-text": "새로운 아이템 추가",
-                    "no-items-text": "아이템이 없습니다.",
-                    "item-details": "아이템 상세",
-                    "delete-item": "아이템 삭제",
-                    "delete-items": "아이템 삭제",
-                    "scroll-to-top": "스크롤 맨 위로"
-                },
-                "help": {
-                    "goto-help-page": "도움"
-                },
-                "home": {
-                    "home": "홈",
-                    "profile": "프로파일",
-                    "logout": "로그아웃",
-                    "menu": "메뉴",
-                    "avatar": "Avatar",
-                    "open-user-menu": "사용자 메뉴 열기"
-                },
-                "import": {
-                    "no-file": "선택된 파일이 없습니다.",
-                    "drop-file": "JSON 파일을 끌어다 놓거나 클릭하여 업로드 할 파일을 선택하십시오."
-                },
-                "item": {
-                    "selected": "선택됨"
-                },
-                "js-func": {
-                    "no-return-error": "함수는 값을 반환해야 합니다!",
-                    "return-type-mismatch": "함수는 '{{type}}' 유형의 값을 반환해야 합니다!"
-                },
-                "legend": {
-                    "position": "범례 위치",
-                    "show-max": "최대값 표시",
-                    "show-min": "최소값 표시",
-                    "show-avg": "평균값 표시",
-                    "show-total": "총합 표시",
-                    "settings": "범례 설정",
-                    "min": "최소",
-                    "max": "최대",
-                    "avg": "평균",
-                    "total": "합계"
-                },
-                "login": {
-                    "login": "로그인",
-                    "request-password-reset": "비밀번호 재설정",
-                    "reset-password": "비밀번호 재설정",
-                    "create-password": "비밀번호 생성",
-                    "passwords-mismatch-error": "입력된 비밀번호는 같아야 합니다!",
-                    "password-again": "비밀번호 확인",
-                    "sign-in": "로그인",
-                    "username": "사용자명 (이메일)",
-                    "remember-me": "아이디 저장",
-                    "forgot-password": "비밀번호찾기",
-                    "password-reset": "비밀번호 재설정",
-                    "new-password": "새 비밀번호",
-                    "new-password-again": "새 비밀번호 확인",
-                    "password-link-sent-message": "비밀번호 재설정 링크가 성공적으로 전송되었습니다!",
-                    "email": "이메일"
-                },
-                "plugin": {
-                    "plugins": "플러그인",
-                    "delete": "플러그인 삭제",
-                    "activate": "플러그인 활성화",
-                    "suspend": "플러그인 비활성화",
-                    "active": "활성화",
-                    "suspended": "비활성화",
-                    "name": "이름",
-                    "name-required": "이름을 입력하세요.",
-                    "description": "설명",
-                    "add": "플러그인 추가",
-                    "delete-plugin-title": "'{{pluginName}}' 플러그인을 삭제하시겠습니까?",
-                    "delete-plugin-text": "플러그인과 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "delete-plugins-title": "{ count, select, 1 {플러그인 1개} other {플러그인 #개} }를 삭제하시겠습니까?",
-                    "delete-plugins-action-title": "{ count, select, 1 {플러그인 1개} other {플러그인 #개} } 삭제",
-                    "delete-plugins-text": "선택된 플러그인이 삭제되고 관련된 모든 데이터가 없어지므로 주의하십시오.",
-                    "add-plugin-text": "새로운 플러그인 추가",
-                    "no-plugins-text": "플러그인이 없습니다.",
-                    "plugin-details": "플러그인 상세정보",
-                    "api-token": "API 토큰",
-                    "api-token-required": "API 토큰을 입력하세요.",
-                    "type": "플러그인 종류",
-                    "type-required": "플러그인 종류를 선택해주세요.",
-                    "configuration": "플러그인 구성",
-                    "system": "시스템",
-                    "select-plugin": "플러그인 선택",
-                    "plugin": "플러그인",
-                    "no-plugins-matching": "'{{plugin}}'과 일치하는 플러그인을 찾을 수 없습니다.",
-                    "plugin-required": "플러그인을 입력하세요.",
-                    "plugin-require-match": "기존의 플러그인을 선택해주세요.",
-                    "events": "이벤트",
-                    "details": "상세",
-                    "import": "플러그인 가져오기",
-                    "export": "플러그인 내보내기",
-                    "export-failed-error": "플러그인을 내보내기 할 수 없습니다.: {{error}}",
-                    "create-new-plugin": "새로운 플러그인 생성",
-                    "plugin-file": "플러그인 파일",
-                    "invalid-plugin-file-error": "플러그인을 가져오기 할 수 없습니다.: 잘못된 플러그인 데이터 구조입니다."
-                },
-                "position": {
-                    "top": "상단",
-                    "bottom": "하단",
-                    "left": "왼쪽",
-                    "right": "오른쪽"
-                },
-                "profile": {
-                    "profile": "프로파일",
-                    "change-password": "비밀번호 변경",
-                    "current-password": "현재 비밀번호"
-                },
-                "rule": {
-                    "rules": "규칙",
-                    "delete": "규칙 삭제",
-                    "activate": "규칙 활성화",
-                    "suspend": "규칙 비활성화",
-                    "active": "활성화",
-                    "suspended": "비활성화",
-                    "name": "이름",
-                    "name-required": "이름을 입력하세요.",
-                    "description": "설명",
-                    "add": "규칙 추가",
-                    "delete-rule-title": "'{{ruleName}}' 규칙을 삭제하시겠습니까?",
-                    "delete-rule-text": "규칙과 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "delete-rules-title": "{ count, select, 1 {규칙 1개} other {규칙 #개} }를 삭제하시겠습니까?",
-                    "delete-rules-action-title": "{ count, select, 1 {규칙 1개} other {규칙 #개} } 삭제",
-                    "delete-rules-text": "선택된 규칙이 삭제되고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "add-rule-text": "규칙 추가",
-                    "no-rules-text": "규칙이 없습니다.",
-                    "rule-details": "규칙 상세정보",
-                    "filters": "필터",
-                    "filter": "필터",
-                    "add-filter-prompt": "필터를 추가해 주세요.",
-                    "remove-filter": "필터 삭제",
-                    "add-filter": "필터 추가",
-                    "filter-name": "필터 이름",
-                    "filter-type": "필터 종류",
-                    "edit-filter": "필터 수정",
-                    "view-filter": "필터 보기",
-                    "component-name": "이름",
-                    "component-name-required": "이름을 입력하세요.",
-                    "component-type": "종류",
-                    "component-type-required": "타입을 입력하세요.",
-                    "processor": "프로세서",
-                    "no-processor-configured": "프로세서가 구성되지 않았습니다.",
-                    "create-processor": "프로세서 생성",
-                    "processor-name": "프로세서 이름",
-                    "processor-type": "프로세서 종류",
-                    "plugin-action": "플러그인 액션",
-                    "action-name": "액션 이름",
-                    "action-type": "액션 종류",
-                    "create-action-prompt": "액션을 만들어 주세요",
-                    "create-action": "액션 생성",
-                    "details": "상세",
-                    "events": "이벤트",
-                    "system": "시스템",
-                    "import": "규칙 가져오기",
-                    "export": "규칙 내보내기",
-                    "export-failed-error": "규칙을 내보내기 할 수 없습니다.: {{error}}",
-                    "create-new-rule": "새로운 규칙 생성",
-                    "rule-file": "규칙 파일",
-                    "invalid-rule-file-error": "규칙을 가져오기 할 수 없습니다.: 잘못된 데이터 구조입니다."
-                },
-                "rule-plugin": {
-                    "management": "규칙 및 플러그인 관리"
-                },
-                "tenant": {
-                    "tenants": "테넌트",
-                    "management": "테넌트 관리",
-                    "add": "테넌트 추가",
-                    "admins": "Admins",
-                    "manage-tenant-admins": "테넌트 관리자 관리",
-                    "delete": "테넌트 삭제",
-                    "add-tenant-text": "테넌트 추가",
-                    "no-tenants-text": "테넌트가 없습니다.",
-                    "tenant-details": "테넌트 상세정보",
-                    "delete-tenant-title": "'{{tenantTitle}}' 테넌트를 삭제하시겠습니까?",
-                    "delete-tenant-text": "테넌트와 관련된 모든 정보를 복구할 수 없으므로 주의하십시오.",
-                    "delete-tenants-title": "{ count, select, 1 {테넌트 1개} other {테넌트 #개} }를 삭제하시겠습니까?",
-                    "delete-tenants-action-title": "{ count, select, 1 {테넌트 1개} other {테넌트 #개} } 삭제",
-                    "delete-tenants-text": "선택된 테넌트가 삭제되고 관련된 모든 정보를 복구할 수 없으므로 주의하십시오.",
-                    "title": "타이틀",
-                    "title-required": "타이틀을 입력하세요.",
-                    "description": "설명"
-                },
-                "timeinterval": {
-                    "seconds-interval": "{ seconds, select, 1 {1 second} other {# seconds} }",
-                    "minutes-interval": "{ minutes, select, 1 {1 minute} other {# minutes} }",
-                    "hours-interval": "{ hours, select, 1 {1 hour} other {# hours} }",
-                    "days-interval": "{ days, select, 1 {1 day} other {# days} }",
-                    "days": "Days",
-                    "hours": "Hours",
-                    "minutes": "Minutes",
-                    "seconds": "Seconds",
-                    "advanced": "고급"
-                },
-                "timewindow": {
-                    "days": "{ days, select, 1 { day } other {# days } }",
-                    "hours": "{ hours, select, 0 { hour } 1 {1 hour } other {# hours } }",
-                    "minutes": "{ minutes, select, 0 { minute } 1 {1 minute } other {# minutes } }",
-                    "seconds": "{ seconds, select, 0 { second } 1 {1 second } other {# seconds } }",
-                    "realtime": "Realtime",
-                    "history": "History",
-                    "last-prefix": "last",
-                    "period": "from {{ startTime }} to {{ endTime }}",
-                    "edit": "타임윈도우 편집",
-                    "date-range": "날짜 범위",
-                    "last": "Last",
-                    "time-period": "기간"
-                },
-                "user": {
-                    "users": "사용자",
-                    "customer-users": "커스터머 사용자",
-                    "tenant-admins": "테넌트 관리자",
-                    "sys-admin": "시스템 관리자",
-                    "tenant-admin": "테넌트 관리자",
-                    "customer": "커스터머",
-                    "anonymous": "Anonymous",
-                    "add": "사용자 추가",
-                    "delete": "사용자 삭제",
-                    "add-user-text": "새로운 사용자 추가",
-                    "no-users-text": "사용자가 없습니다.",
-                    "user-details": "사용자 상세정보",
-                    "delete-user-title": "'{{userEmail}}' 사용자를 삭제하시겠습니까?",
-                    "delete-user-text": "사용자와 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "delete-users-title": "{ count, select, 1 {사용자 1명} other {사용자 #명} }을 삭제하시겠니까?",
-                    "delete-users-action-title": "{ count, select, 1 {사용자 1명} other {사용자 #명} } 삭제",
-                    "delete-users-text": "선택된 사용자가 삭제된고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "activation-email-sent-message": "활성화 이메일을 보냈습니다!",
-                    "resend-activation": "활성화 재전송",
-                    "email": "Email",
-                    "email-required": "Email을 입력하세요.",
-                    "first-name": "이름",
-                    "last-name": "성",
-                    "description": "설명",
-                    "default-dashboard": "기본 대시보드",
-                    "always-fullscreen": "항상 전체화면"
-                },
-                "value": {
-                    "type": "Value type",
-                    "string": "String",
-                    "string-value": "String value",
-                    "integer": "Integer",
-                    "integer-value": "Integer value",
-                    "invalid-integer-value": "Invalid integer value",
-                    "double": "Double",
-                    "double-value": "Double value",
-                    "boolean": "Boolean",
-                    "boolean-value": "Boolean value",
-                    "false": "False",
-                    "true": "True"
-                },
-                "widget": {
-                    "widget-library": "위젯 저장소",
-                    "widget-bundle": "위젯 번들",
-                    "select-widgets-bundle": "위젯 번들 선택",
-                    "management": "위젯 관리",
-                    "editor": "위젯 편집기",
-                    "widget-type-not-found": "위젯 구성을 로드하는 중 문제가 발생했습니다.<br>연결된 위젯 타입이 삭제되었습니다.",
-                    "widget-type-load-error": "다음과 같은 오류로 인해 위젯이로드되지 않았습니다:",
-                    "remove": "위젯 삭제",
-                    "edit": "위젯 수정",
-                    "remove-widget-title": "'{{widgetTitle}}' 위젯을 삭제하시겠습니까?",
-                    "remove-widget-text": "위젯과 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "timeseries": "Time series",
-                    "latest-values": "Latest values",
-                    "rpc": "Control 위젯",
-                    "static": "Static 위젯",
-                    "select-widget-type": "위젯 타입 선택",
-                    "missing-widget-title-error": "위젯 타이틀을 입력하세요!",
-                    "widget-saved": "위젯이 저장되었습니다.",
-                    "unable-to-save-widget-error": "위젯을 저장할 수 없습니다! 위젯에 오류가 있습니다!",
-                    "save": "위젯 저장",
-                    "saveAs": "다른 이름으로 위젯 저장",
-                    "save-widget-type-as": "다른 이름으로 위젯 타입 저장",
-                    "save-widget-type-as-text": "새로운 위젯 이름과 위젯 번들을 선택하세요.",
-                    "toggle-fullscreen": "전체화면 전환",
-                    "run": "위젯 실행",
-                    "title": "위젯 타이틀",
-                    "title-required": "위젯 타이틀을 입력하세요.",
-                    "type": "위젯 타입",
-                    "resources": "리소스",
-                    "resource-url": "JavaScript/CSS URI",
-                    "remove-resource": "리소스 삭제",
-                    "add-resource": "리소스 추가",
-                    "html": "HTML",
-                    "tidy": "Tidy",
-                    "css": "CSS",
-                    "settings-schema": "스키마 설정",
-                    "datakey-settings-schema": "데이터 키 설정 스키마",
-                    "javascript": "Javascript",
-                    "remove-widget-type-title": "'{{widgetName}}' 위젯 타입을 삭제하시겠습니까?",
-                    "remove-widget-type-text": "위젯 타입과 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "remove-widget-type": "위젯 타입 삭제",
-                    "add-widget-type": "새로운 위젯 타입 추가",
-                    "widget-type-load-failed-error": "위젯 타입을 로드하지 못했습니다!",
-                    "widget-template-load-failed-error": "위젯 템플릿을 로드하지 못했습니다!",
-                    "add": "위젯 추가",
-                    "undo": "위젯 변경사항 취소",
-                    "export": "위젯 내보내기"
-                },
-                "widgets-bundle": {
-                    "current": "현재 번들",
-                    "widgets-bundles": "위젯 번들",
-                    "add": "위젯 번들 추가",
-                    "delete": "위젯 번들 삭제",
-                    "title": "타이틀",
-                    "title-required": "타이틀을 입력하세요.",
-                    "add-widgets-bundle-text": "위젯 번들 추가",
-                    "no-widgets-bundles-text": "위젯 번들이 없습니다.",
-                    "empty": "위젯 번들이 비어있습니다.",
-                    "details": "상세",
-                    "widgets-bundle-details": "위젯 번들 상세정보",
-                    "delete-widgets-bundle-title": "'{{widgetsBundleTitle}}' 위젯 번들을 삭제하시겠습니까?",
-                    "delete-widgets-bundle-text": "위젯 번들과 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "delete-widgets-bundles-title": "{ count, select, 1 {위젯 번들 1개} other {위젯 번들 #개} }를 삭제하시겠습니까?",
-                    "delete-widgets-bundles-action-title": "{ count, select, 1 {위젯 번들 1개} other {위젯 번들 #개} } 삭제",
-                    "delete-widgets-bundles-text": "선택된 위젯 번들이 삭제되고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
-                    "no-widgets-bundles-matching": "'{{widgetsBundle}}' 와(과) 일치하는 위젯 번들을 찾을 수 없습니다.",
-                    "widgets-bundle-required": "위젯 번들을 입력하세요.",
-                    "system": "시스템",
-                    "import": "위젯 번들 가져오기",
-                    "export": "위젯 번들 내보내기",
-                    "export-failed-error": "위젯 번들을 내보내기 할 수 없습니다.: {{error}}",
-                    "create-new-widgets-bundle": "새로운 위젯 번들 생성",
-                    "widgets-bundle-file": "위젯 번들 파일",
-                    "invalid-widgets-bundle-file-error": "위젯 번들을 가져오기 할 수 없습니다.: 잘못된 위젯 번들 데이터 구조입니다."
-                },
-                "widget-config": {
-                    "data": "데이터",
-                    "settings": "설정",
-                    "advanced": "고급",
-                    "title": "타이틀",
-                    "general-settings": "일반 설정",
-                    "display-title": "타이틀 표시",
-                    "drop-shadow": "그림자",
-                    "enable-fullscreen": "전체화면 사용 ",
-                    "background-color": "배경 색",
-                    "text-color": "글자 색",
-                    "padding": "패딩",
-                    "title-style": "타이틀 스타일",
-                    "mobile-mode-settings": "모바일 모드 설정",
-                    "order": "순서",
-                    "height": "높이",
-                    "units": "값 옆에 표시할 특수 기호",
-                    "decimals": "소수점 이하 자릿수",
-                    "timewindow": "타임윈도우",
-                    "use-dashboard-timewindow": "대시보드 타임윈도우",
-                    "display-legend": "범례 표시",
-                    "datasources": "데이터소스",
-                    "datasource-type": "유형",
-                    "datasource-parameters": "파라미터",
-                    "remove-datasource": "데이터소스 삭제",
-                    "add-datasource": "데이터소스 추가",
-                    "target-device": "대상 디바이스"
-                },
-                "widget-type": {
-                    "import": "위젯 타입 가져오기",
-                    "export": "위젯 타입 내보내기",
-                    "export-failed-error": "위젯 타입을 내보내기 할 수 없습니다.: {{error}}",
-                    "create-new-widget-type": "새로운 위젯 타입 생성",
-                    "widget-type-file": "위젯 타입 파일",
-                    "invalid-widget-type-file-error": "위젯 타입을 가져오기 할 수 없습니다.: 잘못된 위젯 타입 데이터 구조입니다."
-                }
-            }
+export default function addLocaleKorean(locales) {
+    var ko_KR = {
+        "access": {
+            "unauthorized": "권한 없음.",
+            "unauthorized-access": "허가되지 않은 접근",
+            "unauthorized-access-text": "이 리소스에 접근하려면 로그인해야 합니다!",
+            "access-forbidden": "접근 금지",
+            "access-forbidden-text": "접근 권한이 없습니다.!<br> 만일 이 페이지에 계속 접근하려면 다른 사용자로 로그인 하세요.",
+            "refresh-token-expired": "세션이 만료되었습니다.",
+            "refresh-token-failed": "세션을 새로 고칠 수 없습니다."
+        },
+        "action": {
+            "activate": "활설화",
+            "suspend": "비활성화",
+            "save": "저장",
+            "saveAs": "다른 이름으로 저장",
+            "cancel": "취소",
+            "ok": "확인",
+            "delete": "삭제",
+            "add": "추가",
+            "yes": "네",
+            "no": "아니오",
+            "update": "업데이트",
+            "remove": "제거",
+            "search": "검색",
+            "assign": "할당",
+            "unassign": "비할당",
+            "apply": "적용",
+            "apply-changes": "변경사항 적용",
+            "edit-mode": "수정 모드",
+            "enter-edit-mode": "수정 모드 진입",
+            "decline-changes": "변경사항 포기",
+            "close": "닫기",
+            "back": "뒤로",
+            "run": "실행",
+            "sign-in": "로그인!",
+            "edit": "수정",
+            "view": "보기",
+            "create": "만들기",
+            "drag": "끌기",
+            "refresh": "새로고침",
+            "undo": "취소",
+            "copy": "복사",
+            "paste": "붙여넣기",
+            "import": "가져오기",
+            "export": "내보내기"
+        },
+        "aggregation": {
+            "aggregation": "집합",
+            "function": "데이터 집합 함수",
+            "limit": "최대 값",
+            "group-interval": "그룹 간격",
+            "min": "최소",
+            "max": "최대",
+            "avg": "평균",
+            "sum": "합계",
+            "count": "숫자",
+            "none": "없음"
+        },
+        "admin": {
+            "general": "일반",
+            "general-settings": "일반 설정",
+            "outgoing-mail": "메일 전송",
+            "outgoing-mail-settings": "메일 전송 설정",
+            "system-settings": "시스템 설정",
+            "test-mail-sent": "테스트 메일이 성공적으로 전송되었습니다!",
+            "base-url": "기본 URL",
+            "base-url-required": "기본 URL을 입력해야 합니다.",
+            "mail-from": "보내는 사람",
+            "mail-from-required": "보내는 사람을 입력해야 합니다.",
+            "smtp-protocol": "SMTP 프로토콜",
+            "smtp-host": "SMTP 호스트",
+            "smtp-host-required": "SMTP 호스트를 입력해야 합니다.",
+            "smtp-port": "SMTP 포트",
+            "smtp-port-required": "SMTP 포트를 입력해야 합니다.",
+            "smtp-port-invalid": "올바른 SMTP 포트가 아닙니다.",
+            "timeout-msec": "제한시간 (msec)",
+            "timeout-required": "제한시간을 입력해야 합니다.",
+            "timeout-invalid": "올바른 제한시간이 아닙니다.",
+            "enable-tls": "TLS 사용",
+            "send-test-mail": "테스트 메일 보내기"
+        },
+        "attribute": {
+            "attributes": "속성",
+            "latest-telemetry": "최근 데이터",
+            "attributes-scope": "디바이스 속성 범위",
+            "scope-latest-telemetry": "최근 데이터",
+            "scope-client": "클라이언트 속성",
+            "scope-server": "서버 속성",
+            "scope-shared": "공유 속성",
+            "add": "속성 추가",
+            "key": "Key",
+            "key-required": "속성 key를 입력하세요.",
+            "value": "Value",
+            "value-required": "속성 value를 입력하세요.",
+            "delete-attributes-title": "{ count, select, 1 {속성} other {여러 속성들을} } 삭제하시겠습니까??",
+            "delete-attributes-text": "모든 선택된 속성들이 제거 될 것이므로 주의하십시오.",
+            "delete-attributes": "속성 삭제",
+            "enter-attribute-value": "속성 값 입력",
+            "show-on-widget": "위젯 보기",
+            "widget-mode": "위젯 모드",
+            "next-widget": "다음 위젯",
+            "prev-widget": "이전 위젯",
+            "add-to-dashboard": "대시보드에 추가",
+            "add-widget-to-dashboard": "대시보드에 위젯 추가",
+            "selected-attributes": "{ count, select, 1 {속성 1개} other {속성 #개} } 선택됨",
+            "selected-telemetry": "{ count, select, 1 {최근 데이터 1개} other {최근 데이터 #개} } 선택됨"
+        },
+        "confirm-on-exit": {
+            "message": "변경 사항을 저장하지 않았습니다. 이 페이지를 나가시겠습니까?",
+            "html-message": "변경 사항을 저장하지 않았습니다.<br/>이 페이지를 나가시겠습니까?",
+            "title": "저장되지 않은 변경사항"
+        },
+        "contact": {
+            "country": "국가",
+            "city": "시",
+            "state": "도",
+            "postal-code": "우편 번호",
+            "postal-code-invalid": "숫자만 입력하세요.",
+            "address": "주소",
+            "address2": "상세주소",
+            "phone": "전화번호",
+            "email": "Email",
+            "no-address": "주소 정보 없음"
+        },
+        "common": {
+            "username": "사용자명",
+            "password": "비밀번호",
+            "enter-username": "사용자명을 입력하세요.",
+            "enter-password": "비밀번호를 입력하세요.",
+            "enter-search": "검색어 입력"
+        },
+        "customer": {
+            "customers": "커스터머",
+            "management": "커스터머 관리",
+            "dashboard": "커스터머 대시보드",
+            "dashboards": "커스터머 대시보드",
+            "devices": "커스터머 디바이스",
+            "add": "커스터머 추가",
+            "delete": "커스터머 삭제",
+            "manage-customer-users": "커스터머 사용자 관리",
+            "manage-customer-devices": "커스터머 디바이스 관리",
+            "manage-customer-dashboards": "커스터머 대시보드 관리",
+            "add-customer-text": "커스터머 추가",
+            "no-customers-text": "커스터머가 없습니다.",
+            "customer-details": "커스터머 상세정보",
+            "delete-customer-title": "'{{customerTitle}}' 커스터머를 삭제하시겠습니까?",
+            "delete-customer-text": "커스터머 및 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "delete-customers-title": "{ count, select, 1 {커스터머 1개} other {커스터머 #개} }를 삭제하시겠습니까?",
+            "delete-customers-action-title": "{ count, select, 1 {커스터머 1개} other {커스터머 #개} } 삭제",
+            "delete-customers-text": "선택된 커스터머는 삭제되고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "manage-users": "사용자 관리",
+            "manage-devices": "디바이스 관리",
+            "manage-dashboards": "대시보드 관리",
+            "title": "타이틀",
+            "title-required": "타이틀을 입력하세요.",
+            "description": "설명"
+        },
+        "datetime": {
+            "date-from": "시작 날짜",
+            "time-from": "시작 시간",
+            "date-to": "종료 날짜",
+            "time-to": "종료 시간"
+        },
+        "dashboard": {
+            "dashboard": "대시보드",
+            "dashboards": "대시보드",
+            "management": "대시보드 관리",
+            "view-dashboards": "대시보드 보기",
+            "add": "대시보드 추가",
+            "assign-dashboard-to-customer": "대시보드 커스터머 선택",
+            "assign-dashboard-to-customer-text": "대시보드 커스터머를 선택하세요.",
+            "assign-to-customer-text": "대시보드 커스터머를 선택하세요.",
+            "assign-to-customer": "커스터머 선택",
+            "unassign-from-customer": "커스터머 해제",
+            "no-dashboards-text": "대시보드가 없습니다",
+            "no-widgets": "설정된 위젯 없음",
+            "add-widget": "위젯 추가",
+            "title": "타이틀",
+            "select-widget-title": "위젯 선택",
+            "select-widget-subtitle": "사용가능한 위젯 타입 목록",
+            "delete": "대시보드 삭제",
+            "title-required": "타이틀을 입력하세요.",
+            "description": "설명",
+            "details": "상세",
+            "dashboard-details": "대시보드 상세정보",
+            "add-dashboard-text": "대시보드 추가",
+            "assign-dashboards": "대시보드 지정",
+            "assign-new-dashboard": "새 대시보드 할당",
+            "assign-dashboards-text": "{ count, select, 1 {대시보드 1개} other {대시보드 #개} }를 커스터머 할당",
+            "delete-dashboards": "대시보드 삭제",
+            "unassign-dashboards": "대시보드 할당 취소",
+            "unassign-dashboards-action-title": "{ count, select, 1 {대시보드 1개} other {대시보드 #개} }를 커스터머 할당 취소",
+            "delete-dashboard-title": "'{{dashboardTitle}}' 대시보드를 삭제하시겠습니까?",
+            "delete-dashboard-text": "대시보드 및 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "delete-dashboards-title": "{ count, select, 1 {대시보드 1개} other {대시보드 #개} }를 삭제하시겠습니까?",
+            "delete-dashboards-action-title": "{ count, select, 1 {대시보드 1개} other {대시보드 #개} } 삭제",
+            "delete-dashboards-text": "선택된 대시보드가 삭제되고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "unassign-dashboard-title": "'{{dashboardTitle}}' 대시보드 할당을 해제하시겠습니까?",
+            "unassign-dashboard-text": "대시보드가 할당 해제되고 커스터머는 액세스 할 수 없게됩니다.",
+            "unassign-dashboard": "대시보드 할달 취소",
+            "unassign-dashboards-title": "{ count, select, 1 {대시보드 1개} other {대시보드 #개} }의 할당을 취소하시겠습니까?",
+            "unassign-dashboards-text": "선택된 대시보드가 할당 해제되고 커스터머는 액세스 할 수 없게됩니다.",
+            "select-dashboard": "대시보드 선택",
+            "no-dashboards-matching": "'{{dashboard}}'와 일치하는 대시보드가 없습니다.",
+            "dashboard-required": "대시보드를 입력하세요.",
+            "select-existing": "기존 대시보드 선택",
+            "create-new": "대시보드 생성",
+            "new-dashboard-title": "새로운 대시보드 타이틀",
+            "open-dashboard": "대시보드 열기",
+            "set-background": "대시보드 설정",
+            "background-color": "배경색",
+            "background-image": "배경 이미지",
+            "background-size-mode": "배경 사이즈 모드",
+            "no-image": "이미지 없음",
+            "drop-image": "이곳에 이미지를 끌어다놓거나 이곳을 클릭하여 파일을 선택하고 업로드하세요.",
+            "settings": "설정",
+            "columns-count": "열 개수",
+            "columns-count-required": "열 개수를 입력하세요.",
+            "min-columns-count-message": "열 개수를 최소 10 이상 입력하세요.",
+            "max-columns-count-message": "열 개수를 최대 100 이하로 입력하세요.",
+            "widgets-margins": "위젯 사이 여백 크기",
+            "horizontal-margin": "세로 여백",
+            "horizontal-margin-required": "세로 여백 값을 입력하세요.",
+            "min-horizontal-margin-message": "세로 여백 값을 최소 0 이상 입력하세요.",
+            "max-horizontal-margin-message": "세로 여백 값을 최대 50 이하로 입력하세요.",
+            "vertical-margin": "가로 여백",
+            "vertical-margin-required": "가로 여백 값을 입력하세요.",
+            "min-vertical-margin-message": "가로 여백 값을 최소 0 이상 입력하세요.",
+            "max-vertical-margin-message": "가로 여백 값을 최대 50 이하로 입력하세요.",
+            "display-title": "대시보드 타이틀 표시",
+            "title-color": "타이틀 색상",
+            "import": "대시보드 가져오기",
+            "export": "대시보드 내보내기",
+            "export-failed-error": "대시보드 내보내기를 할 수 없습니다.: {error}",
+            "create-new-dashboard": "대시보드 생성",
+            "dashboard-file": "대시보드 파일",
+            "invalid-dashboard-file-error": "대시보드 가져오기를 할 수 없습니다.: 대시보드 데이터 구조가 잘못되었습니다.",
+            "dashboard-import-missing-aliases-title": "대시보드 앨리어스를 위해 누락 된 디바이스 선택",
+            "create-new-widget": "새로운 위젯 생성",
+            "import-widget": "위젯 가져오기",
+            "widget-file": "위젯 파일",
+            "invalid-widget-file-error": "위젯 가져오기를 할 수 없습니다: 위젯 데이터 구조가 잘못되었습니다.",
+            "widget-import-missing-aliases-title": "위젯에서 사용하는 누락 된 디바이스 선택",
+            "open-toolbar": "대시보드 툴바 열기",
+            "close-toolbar": "툴바 닫기",
+            "configuration-error": "구성 오류",
+            "alias-resolution-error-title": "대시보드 앨리어스 구성 오류",
+            "invalid-aliases-config": "일부 앨리어스 필터와 일치하는 디바이스를 찾을 수 없습니다.<br>이 문제를 해결하려면 관리자에게 문의하십시오.",
+            "select-devices": "디바이스 선택",
+            "assignedToCustomer": "커스터머에 할당됨"
+        },
+        "datakey": {
+            "settings": "설정",
+            "advanced": "고급",
+            "label": "Label",
+            "color": "색상",
+            "data-generation-func": "데이터 생성 기능",
+            "use-data-post-processing-func": "데이터 후처리 기능 사용",
+            "configuration": "데이터 key 구성",
+            "timeseries": "Timeseries",
+            "attributes": "Attributes",
+            "timeseries-required": "디바이스 timeseries 를 입력하세요.",
+            "timeseries-or-attributes-required": "디바이스 timeseries/attributes 를 입력하세요.",
+            "function-types": "함수 유형",
+            "function-types-required": "함수 유형을 입력하세요."
+        },
+        "datasource": {
+            "type": "데이터소스 유형",
+            "add-datasource-prompt": "데이터소스를 추가하세요."
+        },
+        "details": {
+            "edit-mode": "편집 모드",
+            "toggle-edit-mode": "편집 모드 전환"
+        },
+        "device": {
+            "device": "디바이스",
+            "device-required": "디바이스를 입력하세요.",
+            "devices": "디바이스",
+            "management": "디바이스 관리",
+            "view-devices": "디바이스 보기",
+            "device-alias": "디바이스 앨리어스",
+            "aliases": "디바이스 앨리어스",
+            "no-alias-matching": "'{{alias}}' 를 찾을 수 없습니다.",
+            "no-aliases-found": "앨리어스가 없습니다.",
+            "no-key-matching": "'{{key}}' 를 찾을 수 없습니다.",
+            "no-keys-found": "Key가 없습니다.",
+            "create-new-alias": "새로 만들기!",
+            "create-new-key": "새로 만들기!",
+            "duplicate-alias-error": "중복된 '{{alias}}' 앨리어스가 있습니다.<br> 디바이스 앨리어스는 대시보드 내에서 고유해야 합니다.",
+            "configure-alias": "'{{alias}}' 앨리어스 구성",
+            "no-devices-matching": "'{{device}}'와 일치하는 디바이스를 찾을 수 없습니다.",
+            "alias": "앨리어스",
+            "alias-required": "디바이스 앨리어스를 입력하세요.",
+            "remove-alias": "디바이스 앨리어스 삭제",
+            "add-alias": "디바이스 앨리어스 추가",
+            "name-starts-with": "시작되는 이름",
+            "device-list": "디바이스 리스트",
+            "use-device-name-filter": "필터 사용",
+            "device-list-empty": "선택된 디바이스가 없습니다.",
+            "device-name-filter-required": "디바이스 필터 이름을 입력하세요.",
+            "device-name-filter-no-device-matched": "'{{device}}' 로 시작되는 디바이스를 찾을 수 없습니다.",
+            "add": "디바이스 추가",
+            "assign-to-customer": "커스터머에게 할당",
+            "assign-device-to-customer": "디바이스를 커스터머에게 할당",
+            "assign-device-to-customer-text": "고객에게 할당할 디바이스를 선택하십시오.",
+            "no-devices-text": "디바이스 없음",
+            "assign-to-customer-text": "디바이스를 할당할 커스터머를 선택하세요.",
+            "device-details": "디바이스 상세정보",
+            "add-device-text": "디바이스 추가",
+            "credentials": "크리덴셜",
+            "manage-credentials": "크리덴셜 관리",
+            "delete": "디바이스 삭제",
+            "assign-devices": "디바이스 할당",
+            "assign-devices-text": "{ count, select, 1 {디바이스 1개} other {디바이스 #개} }를 커서터머에 할당",
+            "delete-devices": "디바이스 삭제",
+            "unassign-from-customer": "커스터머 할당 해제",
+            "unassign-devices": "디바이스 할당 취소",
+            "unassign-devices-action-title": "{ count, select, 1 {디바이스 1개} other {디바이스 #개} }를 커스터머에게서 할당 해제",
+            "assign-new-device": "새로운 디바이스 할당",
+            "view-credentials": "크리덴셜 보기",
+            "delete-device-title": "'{{deviceName}}' 디바이스를 삭제하시겠습니까?",
+            "delete-device-text": "디바이스 및 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "delete-devices-title": "{ count, select, 1 {디바이스 1개} other {디바이스 #개} }를 삭제하시겠습니까?",
+            "delete-devices-action-title": "{ count, select, 1 {디바이스 1개} other {디바이스 #개} } 삭제",
+            "delete-devices-text": "선택된 디바이스가 삭제되고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "unassign-device-title": "'{{deviceName}}' 디바이스 할당을 해제하시겠습니까?",
+            "unassign-device-text": "디바이스가 할당 해제되고 커스터머는 액세스 할 수 없게됩니다.",
+            "unassign-device": "디바이스 할당 취소",
+            "unassign-devices-title": "{ count, select, 1 {디바이스 1개} other {디바이스 #개} }의  할당을 해제하시겠습니까??",
+            "unassign-devices-text": "선택된 디바이스가 할당 해제되고 커스터머는 액세스 할 수 없게됩니다.",
+            "device-credentials": "디바이스 크리덴셜",
+            "credentials-type": "크리덴셜 타입",
+            "access-token": "억세스 토큰",
+            "access-token-required": "액세스 토큰을 입력하세요.",
+            "access-token-invalid": "액세스 토큰 길이는 1 - 20 자 여야합니다.",
+            "rsa-key": "RSA public key",
+            "rsa-key-required": "RSA public key 를 입력하세요.",
+            "secret": "시크릿",
+            "secret-required": "시크릿을 입력하세요.",
+            "name": "이름",
+            "name-required": "이름을 입력하세요.",
+            "description": "설명",
+            "events": "이벤트",
+            "details": "상세",
+            "copyId": "디바이스 아이디 복사",
+            "copyAccessToken": "억세스 토큰 복사",
+            "idCopiedMessage": "디바이스 아이디가 클립보드에 복사되었습니다.",
+            "accessTokenCopiedMessage": "디바이스 억세스 토큰이 클립보드에 복사되었습니다.",
+            "assignedToCustomer": "커스터머에 할당됨",
+            "unable-delete-device-alias-title": "디바이스 앨리어스를 삭제할 수 없습니다.",
+            "unable-delete-device-alias-text": "'{{deviceAlias}}' 디바이스 앨리어스를 삭제할 수 없습니다. 다음 위젯에서 사용하고 있습니다.<br/>{{widgetsList}}",
+            "is-gateway": "게이트웨이 여부"
+        },
+        "dialog": {
+            "close": "다이얼로그 닫기"
+        },
+        "error": {
+            "unable-to-connect": "서버에 연결할 수 없습니다! 인터넷 연결을 확인하십시오.",
+            "unhandled-error-code": "처리되지 않은 오류 코드: {{errorCode}}",
+            "unknown-error": "알 수 없는 오류"
+        },
+        "event": {
+            "event-type": "이벤트 타입",
+            "type-alarm": "알람",
+            "type-error": "에러",
+            "type-lc-event": "주기적 이벤트",
+            "type-stats": "통계",
+            "no-events-prompt": "이벤트 없음",
+            "error": "에러",
+            "alarm": "알람",
+            "event-time": "이벤트 발생 시간",
+            "server": "서버",
+            "body": "Body",
+            "method": "Method",
+            "event": "이벤트",
+            "status": "상태",
+            "success": "성공",
+            "failed": "실패",
+            "messages-processed": "처리된 메시지",
+            "errors-occurred": "오류가 발생했습니다"
+        },
+        "fullscreen": {
+            "expand": "전체화면으로 확장",
+            "exit": "전체화면 종료",
+            "toggle": "전체화면 모드 전환",
+            "fullscreen": "전체화면"
+        },
+        "function": {
+            "function": "기능"
+        },
+        "grid": {
+            "delete-item-title": "이 항목을 삭제 하시겠습니까?",
+            "delete-item-text": "항목과 모든 관련 데이터를 복구 할 수 없으므로 주의하십시오.",
+            "delete-items-title": "{ count, select, 1 {아이템 1개} other {아이템 #개} }를 삭제하시겠습니까?",
+            "delete-items-action-title": "{ count, select, 1 {아이템 1개} other {아이템 #개} } 삭제",
+            "delete-items-text": "선택한 모든 아이템이 제거되고 관련된 모든 데이터는 복구 할 수 없으므로 주의하십시오.",
+            "add-item-text": "새로운 아이템 추가",
+            "no-items-text": "아이템이 없습니다.",
+            "item-details": "아이템 상세",
+            "delete-item": "아이템 삭제",
+            "delete-items": "아이템 삭제",
+            "scroll-to-top": "스크롤 맨 위로"
+        },
+        "help": {
+            "goto-help-page": "도움"
+        },
+        "home": {
+            "home": "홈",
+            "profile": "프로파일",
+            "logout": "로그아웃",
+            "menu": "메뉴",
+            "avatar": "Avatar",
+            "open-user-menu": "사용자 메뉴 열기"
+        },
+        "import": {
+            "no-file": "선택된 파일이 없습니다.",
+            "drop-file": "JSON 파일을 끌어다 놓거나 클릭하여 업로드 할 파일을 선택하십시오."
+        },
+        "item": {
+            "selected": "선택됨"
+        },
+        "js-func": {
+            "no-return-error": "함수는 값을 반환해야 합니다!",
+            "return-type-mismatch": "함수는 '{{type}}' 유형의 값을 반환해야 합니다!"
+        },
+        "legend": {
+            "position": "범례 위치",
+            "show-max": "최대값 표시",
+            "show-min": "최소값 표시",
+            "show-avg": "평균값 표시",
+            "show-total": "총합 표시",
+            "settings": "범례 설정",
+            "min": "최소",
+            "max": "최대",
+            "avg": "평균",
+            "total": "합계"
+        },
+        "login": {
+            "login": "로그인",
+            "request-password-reset": "비밀번호 재설정",
+            "reset-password": "비밀번호 재설정",
+            "create-password": "비밀번호 생성",
+            "passwords-mismatch-error": "입력된 비밀번호는 같아야 합니다!",
+            "password-again": "비밀번호 확인",
+            "sign-in": "로그인",
+            "username": "사용자명 (이메일)",
+            "remember-me": "아이디 저장",
+            "forgot-password": "비밀번호찾기",
+            "password-reset": "비밀번호 재설정",
+            "new-password": "새 비밀번호",
+            "new-password-again": "새 비밀번호 확인",
+            "password-link-sent-message": "비밀번호 재설정 링크가 성공적으로 전송되었습니다!",
+            "email": "이메일"
+        },
+        "plugin": {
+            "plugins": "플러그인",
+            "delete": "플러그인 삭제",
+            "activate": "플러그인 활성화",
+            "suspend": "플러그인 비활성화",
+            "active": "활성화",
+            "suspended": "비활성화",
+            "name": "이름",
+            "name-required": "이름을 입력하세요.",
+            "description": "설명",
+            "add": "플러그인 추가",
+            "delete-plugin-title": "'{{pluginName}}' 플러그인을 삭제하시겠습니까?",
+            "delete-plugin-text": "플러그인과 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "delete-plugins-title": "{ count, select, 1 {플러그인 1개} other {플러그인 #개} }를 삭제하시겠습니까?",
+            "delete-plugins-action-title": "{ count, select, 1 {플러그인 1개} other {플러그인 #개} } 삭제",
+            "delete-plugins-text": "선택된 플러그인이 삭제되고 관련된 모든 데이터가 없어지므로 주의하십시오.",
+            "add-plugin-text": "새로운 플러그인 추가",
+            "no-plugins-text": "플러그인이 없습니다.",
+            "plugin-details": "플러그인 상세정보",
+            "api-token": "API 토큰",
+            "api-token-required": "API 토큰을 입력하세요.",
+            "type": "플러그인 종류",
+            "type-required": "플러그인 종류를 선택해주세요.",
+            "configuration": "플러그인 구성",
+            "system": "시스템",
+            "select-plugin": "플러그인 선택",
+            "plugin": "플러그인",
+            "no-plugins-matching": "'{{plugin}}'과 일치하는 플러그인을 찾을 수 없습니다.",
+            "plugin-required": "플러그인을 입력하세요.",
+            "plugin-require-match": "기존의 플러그인을 선택해주세요.",
+            "events": "이벤트",
+            "details": "상세",
+            "import": "플러그인 가져오기",
+            "export": "플러그인 내보내기",
+            "export-failed-error": "플러그인을 내보내기 할 수 없습니다.: {{error}}",
+            "create-new-plugin": "새로운 플러그인 생성",
+            "plugin-file": "플러그인 파일",
+            "invalid-plugin-file-error": "플러그인을 가져오기 할 수 없습니다.: 잘못된 플러그인 데이터 구조입니다."
+        },
+        "position": {
+            "top": "상단",
+            "bottom": "하단",
+            "left": "왼쪽",
+            "right": "오른쪽"
+        },
+        "profile": {
+            "profile": "프로파일",
+            "change-password": "비밀번호 변경",
+            "current-password": "현재 비밀번호"
+        },
+        "rule": {
+            "rules": "규칙",
+            "delete": "규칙 삭제",
+            "activate": "규칙 활성화",
+            "suspend": "규칙 비활성화",
+            "active": "활성화",
+            "suspended": "비활성화",
+            "name": "이름",
+            "name-required": "이름을 입력하세요.",
+            "description": "설명",
+            "add": "규칙 추가",
+            "delete-rule-title": "'{{ruleName}}' 규칙을 삭제하시겠습니까?",
+            "delete-rule-text": "규칙과 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "delete-rules-title": "{ count, select, 1 {규칙 1개} other {규칙 #개} }를 삭제하시겠습니까?",
+            "delete-rules-action-title": "{ count, select, 1 {규칙 1개} other {규칙 #개} } 삭제",
+            "delete-rules-text": "선택된 규칙이 삭제되고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "add-rule-text": "규칙 추가",
+            "no-rules-text": "규칙이 없습니다.",
+            "rule-details": "규칙 상세정보",
+            "filters": "필터",
+            "filter": "필터",
+            "add-filter-prompt": "필터를 추가해 주세요.",
+            "remove-filter": "필터 삭제",
+            "add-filter": "필터 추가",
+            "filter-name": "필터 이름",
+            "filter-type": "필터 종류",
+            "edit-filter": "필터 수정",
+            "view-filter": "필터 보기",
+            "component-name": "이름",
+            "component-name-required": "이름을 입력하세요.",
+            "component-type": "종류",
+            "component-type-required": "타입을 입력하세요.",
+            "processor": "프로세서",
+            "no-processor-configured": "프로세서가 구성되지 않았습니다.",
+            "create-processor": "프로세서 생성",
+            "processor-name": "프로세서 이름",
+            "processor-type": "프로세서 종류",
+            "plugin-action": "플러그인 액션",
+            "action-name": "액션 이름",
+            "action-type": "액션 종류",
+            "create-action-prompt": "액션을 만들어 주세요",
+            "create-action": "액션 생성",
+            "details": "상세",
+            "events": "이벤트",
+            "system": "시스템",
+            "import": "규칙 가져오기",
+            "export": "규칙 내보내기",
+            "export-failed-error": "규칙을 내보내기 할 수 없습니다.: {{error}}",
+            "create-new-rule": "새로운 규칙 생성",
+            "rule-file": "규칙 파일",
+            "invalid-rule-file-error": "규칙을 가져오기 할 수 없습니다.: 잘못된 데이터 구조입니다."
+        },
+        "rule-plugin": {
+            "management": "규칙 및 플러그인 관리"
+        },
+        "tenant": {
+            "tenants": "테넌트",
+            "management": "테넌트 관리",
+            "add": "테넌트 추가",
+            "admins": "Admins",
+            "manage-tenant-admins": "테넌트 관리자 관리",
+            "delete": "테넌트 삭제",
+            "add-tenant-text": "테넌트 추가",
+            "no-tenants-text": "테넌트가 없습니다.",
+            "tenant-details": "테넌트 상세정보",
+            "delete-tenant-title": "'{{tenantTitle}}' 테넌트를 삭제하시겠습니까?",
+            "delete-tenant-text": "테넌트와 관련된 모든 정보를 복구할 수 없으므로 주의하십시오.",
+            "delete-tenants-title": "{ count, select, 1 {테넌트 1개} other {테넌트 #개} }를 삭제하시겠습니까?",
+            "delete-tenants-action-title": "{ count, select, 1 {테넌트 1개} other {테넌트 #개} } 삭제",
+            "delete-tenants-text": "선택된 테넌트가 삭제되고 관련된 모든 정보를 복구할 수 없으므로 주의하십시오.",
+            "title": "타이틀",
+            "title-required": "타이틀을 입력하세요.",
+            "description": "설명"
+        },
+        "timeinterval": {
+            "seconds-interval": "{ seconds, select, 1 {1 second} other {# seconds} }",
+            "minutes-interval": "{ minutes, select, 1 {1 minute} other {# minutes} }",
+            "hours-interval": "{ hours, select, 1 {1 hour} other {# hours} }",
+            "days-interval": "{ days, select, 1 {1 day} other {# days} }",
+            "days": "Days",
+            "hours": "Hours",
+            "minutes": "Minutes",
+            "seconds": "Seconds",
+            "advanced": "고급"
+        },
+        "timewindow": {
+            "days": "{ days, select, 1 { day } other {# days } }",
+            "hours": "{ hours, select, 0 { hour } 1 {1 hour } other {# hours } }",
+            "minutes": "{ minutes, select, 0 { minute } 1 {1 minute } other {# minutes } }",
+            "seconds": "{ seconds, select, 0 { second } 1 {1 second } other {# seconds } }",
+            "realtime": "Realtime",
+            "history": "History",
+            "last-prefix": "last",
+            "period": "from {{ startTime }} to {{ endTime }}",
+            "edit": "타임윈도우 편집",
+            "date-range": "날짜 범위",
+            "last": "Last",
+            "time-period": "기간"
+        },
+        "user": {
+            "users": "사용자",
+            "customer-users": "커스터머 사용자",
+            "tenant-admins": "테넌트 관리자",
+            "sys-admin": "시스템 관리자",
+            "tenant-admin": "테넌트 관리자",
+            "customer": "커스터머",
+            "anonymous": "Anonymous",
+            "add": "사용자 추가",
+            "delete": "사용자 삭제",
+            "add-user-text": "새로운 사용자 추가",
+            "no-users-text": "사용자가 없습니다.",
+            "user-details": "사용자 상세정보",
+            "delete-user-title": "'{{userEmail}}' 사용자를 삭제하시겠습니까?",
+            "delete-user-text": "사용자와 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "delete-users-title": "{ count, select, 1 {사용자 1명} other {사용자 #명} }을 삭제하시겠니까?",
+            "delete-users-action-title": "{ count, select, 1 {사용자 1명} other {사용자 #명} } 삭제",
+            "delete-users-text": "선택된 사용자가 삭제된고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "activation-email-sent-message": "활성화 이메일을 보냈습니다!",
+            "resend-activation": "활성화 재전송",
+            "email": "Email",
+            "email-required": "Email을 입력하세요.",
+            "first-name": "이름",
+            "last-name": "성",
+            "description": "설명",
+            "default-dashboard": "기본 대시보드",
+            "always-fullscreen": "항상 전체화면"
+        },
+        "value": {
+            "type": "Value type",
+            "string": "String",
+            "string-value": "String value",
+            "integer": "Integer",
+            "integer-value": "Integer value",
+            "invalid-integer-value": "Invalid integer value",
+            "double": "Double",
+            "double-value": "Double value",
+            "boolean": "Boolean",
+            "boolean-value": "Boolean value",
+            "false": "False",
+            "true": "True"
+        },
+        "widget": {
+            "widget-library": "위젯 저장소",
+            "widget-bundle": "위젯 번들",
+            "select-widgets-bundle": "위젯 번들 선택",
+            "management": "위젯 관리",
+            "editor": "위젯 편집기",
+            "widget-type-not-found": "위젯 구성을 로드하는 중 문제가 발생했습니다.<br>연결된 위젯 타입이 삭제되었습니다.",
+            "widget-type-load-error": "다음과 같은 오류로 인해 위젯이로드되지 않았습니다:",
+            "remove": "위젯 삭제",
+            "edit": "위젯 수정",
+            "remove-widget-title": "'{{widgetTitle}}' 위젯을 삭제하시겠습니까?",
+            "remove-widget-text": "위젯과 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "timeseries": "Time series",
+            "latest-values": "Latest values",
+            "rpc": "Control 위젯",
+            "static": "Static 위젯",
+            "select-widget-type": "위젯 타입 선택",
+            "missing-widget-title-error": "위젯 타이틀을 입력하세요!",
+            "widget-saved": "위젯이 저장되었습니다.",
+            "unable-to-save-widget-error": "위젯을 저장할 수 없습니다! 위젯에 오류가 있습니다!",
+            "save": "위젯 저장",
+            "saveAs": "다른 이름으로 위젯 저장",
+            "save-widget-type-as": "다른 이름으로 위젯 타입 저장",
+            "save-widget-type-as-text": "새로운 위젯 이름과 위젯 번들을 선택하세요.",
+            "toggle-fullscreen": "전체화면 전환",
+            "run": "위젯 실행",
+            "title": "위젯 타이틀",
+            "title-required": "위젯 타이틀을 입력하세요.",
+            "type": "위젯 타입",
+            "resources": "리소스",
+            "resource-url": "JavaScript/CSS URI",
+            "remove-resource": "리소스 삭제",
+            "add-resource": "리소스 추가",
+            "html": "HTML",
+            "tidy": "Tidy",
+            "css": "CSS",
+            "settings-schema": "스키마 설정",
+            "datakey-settings-schema": "데이터 키 설정 스키마",
+            "javascript": "Javascript",
+            "remove-widget-type-title": "'{{widgetName}}' 위젯 타입을 삭제하시겠습니까?",
+            "remove-widget-type-text": "위젯 타입과 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "remove-widget-type": "위젯 타입 삭제",
+            "add-widget-type": "새로운 위젯 타입 추가",
+            "widget-type-load-failed-error": "위젯 타입을 로드하지 못했습니다!",
+            "widget-template-load-failed-error": "위젯 템플릿을 로드하지 못했습니다!",
+            "add": "위젯 추가",
+            "undo": "위젯 변경사항 취소",
+            "export": "위젯 내보내기"
+        },
+        "widgets-bundle": {
+            "current": "현재 번들",
+            "widgets-bundles": "위젯 번들",
+            "add": "위젯 번들 추가",
+            "delete": "위젯 번들 삭제",
+            "title": "타이틀",
+            "title-required": "타이틀을 입력하세요.",
+            "add-widgets-bundle-text": "위젯 번들 추가",
+            "no-widgets-bundles-text": "위젯 번들이 없습니다.",
+            "empty": "위젯 번들이 비어있습니다.",
+            "details": "상세",
+            "widgets-bundle-details": "위젯 번들 상세정보",
+            "delete-widgets-bundle-title": "'{{widgetsBundleTitle}}' 위젯 번들을 삭제하시겠습니까?",
+            "delete-widgets-bundle-text": "위젯 번들과 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "delete-widgets-bundles-title": "{ count, select, 1 {위젯 번들 1개} other {위젯 번들 #개} }를 삭제하시겠습니까?",
+            "delete-widgets-bundles-action-title": "{ count, select, 1 {위젯 번들 1개} other {위젯 번들 #개} } 삭제",
+            "delete-widgets-bundles-text": "선택된 위젯 번들이 삭제되고 관련된 모든 데이터를 복구할 수 없으므로 주의하십시오.",
+            "no-widgets-bundles-matching": "'{{widgetsBundle}}' 와(과) 일치하는 위젯 번들을 찾을 수 없습니다.",
+            "widgets-bundle-required": "위젯 번들을 입력하세요.",
+            "system": "시스템",
+            "import": "위젯 번들 가져오기",
+            "export": "위젯 번들 내보내기",
+            "export-failed-error": "위젯 번들을 내보내기 할 수 없습니다.: {{error}}",
+            "create-new-widgets-bundle": "새로운 위젯 번들 생성",
+            "widgets-bundle-file": "위젯 번들 파일",
+            "invalid-widgets-bundle-file-error": "위젯 번들을 가져오기 할 수 없습니다.: 잘못된 위젯 번들 데이터 구조입니다."
+        },
+        "widget-config": {
+            "data": "데이터",
+            "settings": "설정",
+            "advanced": "고급",
+            "title": "타이틀",
+            "general-settings": "일반 설정",
+            "display-title": "타이틀 표시",
+            "drop-shadow": "그림자",
+            "enable-fullscreen": "전체화면 사용 ",
+            "background-color": "배경 색",
+            "text-color": "글자 색",
+            "padding": "패딩",
+            "title-style": "타이틀 스타일",
+            "mobile-mode-settings": "모바일 모드 설정",
+            "order": "순서",
+            "height": "높이",
+            "units": "값 옆에 표시할 특수 기호",
+            "decimals": "소수점 이하 자릿수",
+            "timewindow": "타임윈도우",
+            "use-dashboard-timewindow": "대시보드 타임윈도우",
+            "display-legend": "범례 표시",
+            "datasources": "데이터소스",
+            "datasource-type": "유형",
+            "datasource-parameters": "파라미터",
+            "remove-datasource": "데이터소스 삭제",
+            "add-datasource": "데이터소스 추가",
+            "target-device": "대상 디바이스"
+        },
+        "widget-type": {
+            "import": "위젯 타입 가져오기",
+            "export": "위젯 타입 내보내기",
+            "export-failed-error": "위젯 타입을 내보내기 할 수 없습니다.: {{error}}",
+            "create-new-widget-type": "새로운 위젯 타입 생성",
+            "widget-type-file": "위젯 타입 파일",
+            "invalid-widget-type-file-error": "위젯 타입을 가져오기 할 수 없습니다.: 잘못된 위젯 타입 데이터 구조입니다."
+        },
+        "language": {
+            "language": "언어",
+            "en_US": "영어",
+            "ko_KR": "한글"
         }
-    ).name;
\ No newline at end of file
+    };
+    angular.extend(locales, {'ko_KR': ko_KR});
+}
\ No newline at end of file
diff --git a/ui/src/app/profile/profile.controller.js b/ui/src/app/profile/profile.controller.js
index ee0db22..19a16da 100644
--- a/ui/src/app/profile/profile.controller.js
+++ b/ui/src/app/profile/profile.controller.js
@@ -20,25 +20,29 @@ import changePasswordTemplate from './change-password.tpl.html';
 /* eslint-enable import/no-unresolved, import/default */
 
 /*@ngInject*/
-export default function ProfileController(userService, $scope, $document, $mdDialog) {
+export default function ProfileController(userService, $scope, $document, $mdDialog, $translate) {
     var vm = this;
 
     vm.profileUser = {};
 
     vm.save = save;
     vm.changePassword = changePassword;
+    vm.languageList = {en_US: {value: "en_US", name: "language.en_US"}, ko_KR: {value : "ko_KR", name: "language.ko_KR"}};
 
     loadProfile();
 
     function loadProfile() {
         userService.getUser(userService.getCurrentUser().userId).then(function success(user) {
             vm.profileUser = user;
+            vm.profileUser.lang = $translate.use();
         });
     }
 
     function save() {
         userService.saveUser(vm.profileUser).then(function success(user) {
+            $translate.use(vm.profileUser.lang);
             vm.profileUser = user;
+            vm.profileUser.lang = $translate.use();
             $scope.theForm.$setPristine();
         });
     }
diff --git a/ui/src/app/profile/profile.tpl.html b/ui/src/app/profile/profile.tpl.html
index c636cc9..e9445ce 100644
--- a/ui/src/app/profile/profile.tpl.html
+++ b/ui/src/app/profile/profile.tpl.html
@@ -40,6 +40,14 @@
                         <label translate>user.last-name</label>
                         <input name="lastName" ng-model="vm.profileUser.lastName">
                     </md-input-container>
+                    <md-input-container class="md-block">
+                        <label translate>language.language</label>
+                        <md-select name="language" ng-model="vm.profileUser.lang">
+                            <md-option ng-repeat="lang in vm.languageList" ng-value="lang.value">
+                                {{lang.name | translate}}
+                            </md-option>
+                        </md-select>
+                    </md-input-container>
                     <md-button ng-disabled="loading" ng-click="vm.changePassword($event)"
                                class="md-raised md-primary">{{ 'profile.change-password' | translate }}
                     </md-button>