Commit 930408d581e973c7434cdd3fc3c1eeb044dc39b2

Authored by DK
1 parent 6a51eda9

Add russian localization.

... ... @@ -17,6 +17,7 @@ import injectTapEventPlugin from 'react-tap-event-plugin';
17 17 import UrlHandler from './url.handler';
18 18 import addLocaleKorean from './locale/locale.constant-ko';
19 19 import addLocaleChinese from './locale/locale.constant-zh';
  20 +import addLocaleRussian from './locale/locale.constant-ru';
20 21
21 22 /* eslint-disable import/no-unresolved, import/default */
22 23
... ... @@ -52,6 +53,8 @@ export default function AppConfig($provide,
52 53
53 54 addLocaleKorean(locales);
54 55 addLocaleChinese(locales);
  56 + addLocaleRussian(locales);
  57 +
55 58 var $window = angular.injector(['ng']).get('$window');
56 59 var lang = $window.navigator.language || $window.navigator.userLanguage;
57 60 if (lang === 'ko') {
... ...
... ... @@ -776,7 +776,8 @@ export default function addLocaleKorean(locales) {
776 776 "language": "언어",
777 777 "en_US": "영어",
778 778 "ko_KR": "한글",
779   - "zh_CN": "중국어"
  779 + "zh_CN": "중국어",
  780 + "ru_RU": "러시아어"
780 781 }
781 782 };
782 783 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 addLocaleRussian(locales) {
  18 + var ru_RU = {
  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": "Maкс",
  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": "Таймаут (мс)",
  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, plural, one {1 атрибут} few {# атрибута} other {# атрибутов} }? ",
  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, plural, 1 {Выбран} other {Выбраны} } { count, plural, one {1 атрибут} few {# атрибута} other {# атрибутов} }",
  126 + "selected-telemetry": "{ count, plural, 1 {Выбран} other {Выбраны} } { count, plural, 1 {1 параметр} few {# параметра} other {# параметров} } телеметрии"
  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, plural, one {1 клиента} other {# клиентов} }?",
  173 + "delete-customers-action-title": "Удалить { count, plural, one {1 клиента} other {# клиентов} } }",
  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, plural, 1 {1 дашборд} other {# дашборда} } к клиенту",
  216 + "delete-dashboards": "Удалить дашборды",
  217 + "unassign-dashboards": "Открепить дашборды",
  218 + "unassign-dashboards-action-title": "Открепить { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} } от клиента",
  219 + "delete-dashboard-title": "Вы точно хотите удалить дашборд '{{dashboardTitle}}'?",
  220 + "delete-dashboard-text": "Внимание, после подтверждения дашборд и все связанные с ним данные будут безвозвратно утеряны.",
  221 + "delete-dashboards-title": "Вы точно хотите удалить { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} }?",
  222 + "delete-dashboards-action-title": "Удалить { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} }",
  223 + "delete-dashboards-text": "Внимание, после подтверждения дашборды и все связанные с ними данные будут безвозвратно утеряны.",
  224 + "unassign-dashboard-title": "Вы точно хотите открепить дашборд '{{dashboardTitle}}'?",
  225 + "unassign-dashboard-text": "После подтверждения дашборд не будет доступен клиенту.",
  226 + "unassign-dashboard": "Открепить дашборд",
  227 + "unassign-dashboards-title": "Вы точно хотите открепить { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} }?",
  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, plural, one {1 устройство} few {# устройства} other {# устройств} } клиенту",
  359 + "delete-devices": "Удалить устройства",
  360 + "unassign-from-customer": "Отменить присвоение клиенту",
  361 + "unassign-devices": "Отменить присвоение устройств",
  362 + "unassign-devices-action-title": "Отменить присвоение { count, plural, one {1 устройства} few {# устройств} other {# устройств} } клиенту",
  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, plural, one {1 устройство} few {# устройства} other {# устройств} }?",
  372 + "delete-devices-action-title": "Удалить { count, plural, one {1 устройство} few {# устройства} other {# устройств} } }",
  373 + "delete-devices-text": "Внимание, после подтверждения выбранные устройства и все связанные с ними данные будут безвозвратно утеряны..",
  374 + "unassign-device-title": "Вы точно хотите отменить присвоение устройства '{{deviceName}}'?",
  375 + "unassign-device-text": "После подтверждения устройство будет недоступно клиенту.",
  376 + "unassign-device": "Отменить присвоение устройства",
  377 + "unassign-devices-title": "Вы точно хотите отменить присвоение { count, plural, one {1 устройство} few {# устройства} other {# устройств} } }?",
  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": "Копировать идентификатор устройства",
  394 + "copyAccessToken": "Копировать токен",
  395 + "idCopiedMessage": "Идентификатор устройства скопирован в буфер обмена",
  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, plural, one {1 объект} few {# объекта} other {# объектов} }?",
  445 + "delete-items-action-title": "Удалить { count, plural, one {1 объект} few {# объекта} other {# объектов}",
  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, plural, one {1 плагин} few {# плагина} other {# плагинов} }?",
  519 + "delete-plugins-action-title": "Удалить { count, plural, one {1 плагин} few {# плагина} other {# плагинов} } }",
  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, plural, one {1 правило} few {# правила} other {# правил} }?",
  569 + "delete-rules-action-title": "Удалить { count, plural, one {1 правило} few {# правила} other {# правил} }",
  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, plural, one {1 владельца} other {# владельцев} }?",
  623 + "delete-tenants-action-title": "Удалить { count, plural, one {1 владельца} other {# владельцев} }",
  624 + "delete-tenants-text": "Внимание, после подтверждения выбранные Владельцы и все связанные с ними данные будут безвозвратно утеряны.",
  625 + "title": "Имя",
  626 + "title-required": "Имя обязательно.",
  627 + "description": "Описание"
  628 + },
  629 + "timeinterval": {
  630 + "seconds-interval": "{ seconds, plural, one {1 секунда} few {# секунды} other {# секунд} }",
  631 + "minutes-interval": "{ minutes, plural, one {1 минута} few {# минуты} other {# минут} }",
  632 + "hours-interval": "{ hours, plural, one {1 час} few {# часа} other {# часов} }",
  633 + "days-interval": "{ days, plural, one {1 день} few {# дня} other {# дней} }",
  634 + "days": "Дни",
  635 + "hours": "Часы",
  636 + "minutes": "Минуты",
  637 + "seconds": "Секунды",
  638 + "advanced": "Дополнительно"
  639 + },
  640 + "timewindow": {
  641 + "days": "{ days, plural, one {1 день} few {# дня} other {# дней} }",
  642 + "hours": "{ hours, plural, one {1 час} few {# часа} other {# часов} }",
  643 + "minutes": "{ minutes, plural, one {1 минута} few {# минуты} other {# минут} }",
  644 + "seconds": "{ seconds, plural, one {1 секунда} few {# секунды} other {# секунд} }",
  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, plural, one {1 пользователя} other {# пользователей} }?",
  670 + "delete-users-action-title": "Удалить { count, plural, one {1 пользователя} other {# пользователей} }",
  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, plural, one {1 набор виджетов} few {# набора виджетов} other {# наборов виджетов} }?",
  760 + "delete-widgets-bundles-action-title": "Удалить { count, plural, one {1 набор виджетов} few {# набора виджетов} other {# наборов виджетов} }",
  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 + "ru_RU": "Русский"
  814 + }
  815 + };
  816 + angular.extend(locales, {'ru_RU': ru_RU});
  817 +}
\ No newline at end of file
... ...
... ... @@ -809,7 +809,8 @@ export default function addLocaleChinese(locales) {
809 809 "language" : "语言",
810 810 "en_US" : "英语",
811 811 "ko_KR" : "韩语",
812   - "zh_CN" : "汉语"
  812 + "zh_CN" : "汉语",
  813 + "ru_RU" : "俄语"
813 814 }
814 815 };
815 816 angular.extend(locales, {
... ...
... ... @@ -811,7 +811,8 @@ export default angular.module('thingsboard.locale', [])
811 811 "language": "Language",
812 812 "en_US": "English",
813 813 "ko_KR": "Korean",
814   - "zh_CN": "Chinese"
  814 + "zh_CN": "Chinese",
  815 + "ru_RU": "Russian"
815 816 }
816 817 }
817 818 }
... ...
... ... @@ -30,7 +30,8 @@ export default function ProfileController(userService, $scope, $document, $mdDia
30 30 vm.languageList = {
31 31 en_US: {value : "en_US", name: "language.en_US"},
32 32 ko_KR: {value : "ko_KR", name: "language.ko_KR"},
33   - zh_CN: {value : "zh_CN", name: "language.zh_CN"}
  33 + zh_CN: {value : "zh_CN", name: "language.zh_CN"},
  34 + ru_RU: {value : "ru_RU", name: "language.ru_RU"}
34 35 };
35 36
36 37 loadProfile();
... ...