diff --git a/acore/urls.py b/acore/urls.py index d7b8ab0..8971b6c 100644 --- a/acore/urls.py +++ b/acore/urls.py @@ -19,11 +19,13 @@ from django.urls import path, include from django.conf import settings from django.conf.urls.static import static from django.contrib.staticfiles.urls import staticfiles_urlpatterns +from django.views.i18n import JavaScriptCatalog from core import views urlpatterns = [ path('admin/', admin.site.urls), path('i18n/', include('django.conf.urls.i18n')), # set_language для переключателя мов + path('jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'), # переводы для JS path('api/attendance/', include('apps.visit_manager.api.urls')), path('', include('apps.employees.urls')), path('', include('apps.ad_connector.urls')), diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index 1584cce..d5f4736 100644 Binary files a/locale/en/LC_MESSAGES/django.mo and b/locale/en/LC_MESSAGES/django.mo differ diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 1ff1c04..89f0d61 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-28 10:22+0300\n" +"POT-Creation-Date: 2026-07-28 21:52+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,21 +17,29 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: apps/ad_connector/models.py:10 apps/employees/models/base.py:186 -#: apps/employees/models/permissions.py:47 templates/pages/employees.html:103 -#: templates/pages/hr-portal.html:215 templates/pages/timetrack.html:58 +#: apps/ad_connector/models.py:10 apps/employees/models/base.py:198 +#: apps/employees/models/permissions.py:47 osc/apps/ad_connector/models.py:10 +#: osc/apps/employees/models.py:130 osc/apps/mattermost_connector/models.py:10 +#: templates/pages/employees.html:103 templates/pages/hr-portal.html:215 +#: templates/pages/timetrack.html:58 msgid "Сотрудник" msgstr "Employee" #: apps/ad_connector/models.py:13 apps/mail_connector/models.py:15 +#: apps/nextcloud_connector/models.py:34 osc/apps/ad_connector/models.py:13 +#: osc/apps/mattermost_connector/models.py:13 msgid "Действие" msgstr "" #: apps/ad_connector/models.py:15 apps/mail_connector/models.py:17 +#: osc/apps/ad_connector/models.py:14 +#: osc/apps/mattermost_connector/models.py:14 msgid "Создание" msgstr "" #: apps/ad_connector/models.py:16 apps/mail_connector/models.py:18 +#: osc/apps/ad_connector/models.py:14 +#: osc/apps/mattermost_connector/models.py:14 msgid "Обновление" msgstr "" @@ -47,43 +55,54 @@ msgstr "" #: apps/it_manager/admin.py:168 apps/it_manager/admin.py:263 #: apps/it_manager/admin.py:352 apps/it_manager/admin.py:498 #: apps/locations/models/pharmacies.py:128 apps/mail_connector/models.py:24 -#: apps/tasks/models.py:40 apps/visit_manager/admin.py:199 core/admin.py:32 +#: apps/nextcloud_connector/models.py:35 apps/tasks/models.py:40 +#: apps/visit_manager/admin.py:199 core/admin.py:32 +#: osc/apps/ad_connector/models.py:17 +#: osc/apps/mattermost_connector/models.py:17 #: templates/pages/dislocation.html:122 templates/pages/employees.html:107 #: templates/pages/hr-portal.html:535 templates/pages/it-manager.html:237 #: templates/pages/it-manager.html:273 templates/pages/it-manager.html:350 #: templates/pages/it-manager.html:403 templates/pages/it-manager.html:696 #: templates/pages/it-manager.html:724 templates/pages/it-manager.html:973 #: templates/pages/it-manager.html:1002 templates/pages/pharmacies.html:119 -#: templates/pages/pharmacy-detail.html:195 -#: templates/pages/pharmacy-detail.html:245 templates/pages/structure.html:63 +#: templates/pages/pharmacy-detail.html:197 +#: templates/pages/pharmacy-detail.html:247 templates/pages/structure.html:63 msgid "Статус" msgstr "Status" #: apps/ad_connector/models.py:23 apps/mail_connector/models.py:25 +#: apps/nextcloud_connector/models.py:25 osc/apps/ad_connector/models.py:18 +#: osc/apps/mattermost_connector/models.py:18 msgid "Успех" msgstr "" -#: apps/ad_connector/models.py:23 apps/employees/models/base.py:144 -#: apps/employees/models/base.py:159 apps/locations/models/pharmacies.py:152 -#: apps/mail_connector/models.py:25 templates/pages/employee-detail.html:146 +#: apps/ad_connector/models.py:23 apps/employees/models/base.py:145 +#: apps/employees/models/base.py:160 apps/locations/models/pharmacies.py:152 +#: apps/mail_connector/models.py:25 apps/nextcloud_connector/models.py:26 +#: osc/apps/ad_connector/models.py:18 osc/apps/employees/models.py:97 +#: osc/apps/employees/models.py:115 osc/apps/mattermost_connector/models.py:18 #: templates/pages/employee-detail.html:153 +#: templates/pages/employee-detail.html:160 msgid "Ошибка" msgstr "Error" #: apps/ad_connector/models.py:25 apps/mail_connector/models.py:27 +#: apps/nextcloud_connector/models.py:36 osc/apps/ad_connector/models.py:20 +#: osc/apps/mattermost_connector/models.py:20 msgid "Сообщение" msgstr "" -#: apps/ad_connector/models.py:28 +#: apps/ad_connector/models.py:28 osc/apps/ad_connector/models.py:23 msgid "Запись синхронизации AD" msgstr "" -#: apps/ad_connector/models.py:29 +#: apps/ad_connector/models.py:29 osc/apps/ad_connector/models.py:24 msgid "Журнал синхронизации AD" msgstr "" -#: apps/employees/admin.py:37 apps/employees/admin.py:244 -#: apps/employees/models/base.py:112 templates/pages/hr-portal.html:446 +#: apps/employees/admin.py:37 apps/employees/admin.py:259 +#: apps/employees/models/base.py:113 apps/nextcloud_connector/models.py:16 +#: osc/apps/employees/models.py:72 templates/pages/hr-portal.html:446 #: templates/pages/structure.html:59 msgid "Отдел" msgstr "Department" @@ -100,319 +119,351 @@ msgstr "" msgid "— Выберите офис или склад —" msgstr "" -#: apps/employees/admin.py:50 apps/employees/models/base.py:106 +#: apps/employees/admin.py:50 apps/employees/models/base.py:107 msgid "Локация (офис/склад)" msgstr "" -#: apps/employees/admin.py:51 apps/employees/models/base.py:107 +#: apps/employees/admin.py:51 apps/employees/models/base.py:108 msgid "Заполняется для location_type=office или warehouse" msgstr "" -#: apps/employees/admin.py:118 core/admin.py:259 +#: apps/employees/admin.py:133 core/admin.py:259 msgid "Аутентификация" msgstr "" -#: apps/employees/admin.py:122 +#: apps/employees/admin.py:137 msgid "ФИО" msgstr "" -#: apps/employees/admin.py:126 +#: apps/employees/admin.py:141 msgid "Рабочая информация" msgstr "" -#: apps/employees/admin.py:134 apps/it_manager/admin.py:307 +#: apps/employees/admin.py:149 apps/it_manager/admin.py:307 msgid "Даты" msgstr "" -#: apps/employees/admin.py:138 templates/pages/employee-detail.html:119 +#: apps/employees/admin.py:153 templates/pages/employee-detail.html:126 msgid "Личные данные" msgstr "Personal data" -#: apps/employees/admin.py:142 apps/it_manager/admin.py:421 -#: apps/locations/admin.py:291 templates/pages/employee-detail.html:60 -#: templates/pages/pharmacy-detail.html:104 +#: apps/employees/admin.py:157 apps/it_manager/admin.py:421 +#: apps/locations/admin.py:291 templates/pages/employee-detail.html:67 +#: templates/pages/pharmacy-detail.html:106 msgid "Контакты" msgstr "Contacts" -#: apps/employees/admin.py:158 +#: apps/employees/admin.py:173 msgid "Графік та відвідуваність" msgstr "" -#: apps/employees/admin.py:161 +#: apps/employees/admin.py:176 msgid "Графіки роботи та записи відвідуваності відображаються нижче." msgstr "" -#: apps/employees/admin.py:169 +#: apps/employees/admin.py:184 msgid "Системный доступ" msgstr "" -#: apps/employees/admin.py:173 +#: apps/employees/admin.py:188 msgid "Только для IT-администраторов. is_staff — вход в Django admin." msgstr "" -#: apps/employees/admin.py:217 +#: apps/employees/admin.py:232 msgid "Предпросмотр" msgstr "" -#: apps/employees/admin.py:224 +#: apps/employees/admin.py:239 msgid "Группы" msgstr "" -#: apps/employees/models/base.py:33 core/models/connector_config.py:28 +#: apps/employees/models/base.py:34 core/models/connector_config.py:29 +#: osc/apps/employees/models.py:33 msgid "Логин" msgstr "" -#: apps/employees/models/base.py:34 +#: apps/employees/models/base.py:35 msgid "Уникальный логин для входа в систему" msgstr "" -#: apps/employees/models/base.py:37 +#: apps/employees/models/base.py:38 osc/apps/employees/models.py:37 msgid "Email адрес" msgstr "" -#: apps/employees/models/base.py:38 +#: apps/employees/models/base.py:39 osc/apps/employees/models.py:38 msgid "Рабочий email. Если не указан — генерируется из username@local.domain" msgstr "" -#: apps/employees/models/base.py:41 +#: apps/employees/models/base.py:42 osc/apps/employees/models.py:41 msgid "Фамилия" msgstr "" -#: apps/employees/models/base.py:42 templates/pages/profile.html:76 +#: apps/employees/models/base.py:43 osc/apps/employees/models.py:42 +#: templates/pages/profile.html:76 msgid "Имя" msgstr "First name" -#: apps/employees/models/base.py:43 templates/pages/hr-portal.html:430 +#: apps/employees/models/base.py:44 osc/apps/employees/models.py:43 +#: templates/pages/hr-portal.html:430 msgid "Отчество" msgstr "Patronymic" -#: apps/employees/models/base.py:45 +#: apps/employees/models/base.py:46 osc/apps/employees/models.py:46 msgid "Доступ к панели администратора" msgstr "" -#: apps/employees/models/base.py:46 +#: apps/employees/models/base.py:47 osc/apps/employees/models.py:47 msgid "Разрешает вход в Django admin. Только для IT-администраторов системы." msgstr "" -#: apps/employees/models/base.py:47 core/models/directories.py:29 -#: core/models/directories.py:121 templates/pages/employee-detail.html:38 +#: apps/employees/models/base.py:48 core/models/directories.py:29 +#: core/models/directories.py:121 templates/pages/employee-detail.html:45 #: templates/pages/employees.html:148 templates/pages/hr-portal.html:174 #: templates/pages/structure.html:89 msgid "Активный" msgstr "Active" -#: apps/employees/models/base.py:48 +#: apps/employees/models/base.py:49 osc/apps/employees/models.py:49 msgid "Работает ли сотрудник сейчас" msgstr "" -#: apps/employees/models/base.py:49 +#: apps/employees/models/base.py:50 osc/apps/employees/models.py:50 msgid "Дата создания аккаунта" msgstr "" -#: apps/employees/models/base.py:52 templates/pages/employee-detail.html:122 +#: apps/employees/models/base.py:53 osc/apps/employees/models.py:52 +#: templates/pages/employee-detail.html:129 msgid "Дата рождения" msgstr "Date of birth" -#: apps/employees/models/base.py:56 templates/pages/employee-detail.html:126 +#: apps/employees/models/base.py:57 osc/apps/employees/models.py:54 +#: templates/pages/employee-detail.html:133 msgid "ИНН" msgstr "Tax ID" -#: apps/employees/models/base.py:57 +#: apps/employees/models/base.py:58 osc/apps/employees/models.py:55 msgid "Идентификационный номер налогоплательщика" msgstr "" -#: apps/employees/models/base.py:62 templates/pages/employee-detail.html:67 -#: templates/pages/profile.html:57 +#: apps/employees/models/base.py:63 osc/apps/employees/models.py:59 +#: templates/pages/employee-detail.html:74 templates/pages/profile.html:57 msgid "Рабочий телефон" msgstr "Work phone" -#: apps/employees/models/base.py:66 +#: apps/employees/models/base.py:67 msgid "Внутрішній номер" msgstr "" -#: apps/employees/models/base.py:67 +#: apps/employees/models/base.py:68 msgid "Короткий внутрішній (додатковий) номер АТС" msgstr "" -#: apps/employees/models/base.py:70 templates/pages/employee-detail.html:76 -#: templates/pages/profile.html:61 +#: apps/employees/models/base.py:71 osc/apps/employees/models.py:60 +#: templates/pages/employee-detail.html:83 templates/pages/profile.html:61 msgid "Личный телефон" msgstr "Personal phone" -#: apps/employees/models/base.py:73 templates/pages/employee-detail.html:80 -#: templates/pages/profile.html:65 +#: apps/employees/models/base.py:74 osc/apps/employees/models.py:61 +#: templates/pages/employee-detail.html:87 templates/pages/profile.html:65 msgid "Личный email" msgstr "Personal email" -#: apps/employees/models/base.py:75 +#: apps/employees/models/base.py:76 osc/apps/employees/models.py:63 msgid "Контакт в экстренных случаях" msgstr "" -#: apps/employees/models/base.py:76 +#: apps/employees/models/base.py:77 osc/apps/employees/models.py:65 msgid "Телефон экстренного контакта" msgstr "" -#: apps/employees/models/base.py:78 templates/pages/profile.html:84 +#: apps/employees/models/base.py:79 osc/apps/employees/models.py:67 +#: templates/pages/profile.html:84 msgid "Степень родства" msgstr "Relationship" -#: apps/employees/models/base.py:81 apps/employees/models/base.py:100 +#: apps/employees/models/base.py:82 apps/employees/models/base.py:101 #: apps/hiring/models.py:34 apps/hiring/models.py:50 #: apps/locations/admin.py:347 apps/locations/models/base.py:29 #: apps/locations/models/pharmacies.py:210 #: apps/locations/models/pharmacies.py:349 apps/mail_connector/models.py:12 -#: apps/utilities/models.py:17 templates/pages/dislocation.html:116 -#: templates/pages/employees.html:64 templates/pages/employees.html:90 -#: templates/pages/hr-portal.html:126 templates/pages/hr-portal.html:441 -#: templates/pages/hr-portal.html:455 templates/pages/hr-portal.html:459 +#: apps/nextcloud_connector/models.py:17 apps/utilities/models.py:17 +#: templates/pages/dislocation.html:116 templates/pages/employees.html:64 +#: templates/pages/employees.html:90 templates/pages/hr-portal.html:126 +#: templates/pages/hr-portal.html:441 templates/pages/hr-portal.html:455 +#: templates/pages/hr-portal.html:459 msgid "Аптека" msgstr "Pharmacy" -#: apps/employees/models/base.py:82 apps/hiring/models.py:35 +#: apps/employees/models/base.py:83 apps/hiring/models.py:35 #: apps/locations/models/base.py:30 templates/pages/hr-portal.html:128 #: templates/pages/hr-portal.html:442 msgid "Склад" msgstr "Warehouse" -#: apps/employees/models/base.py:83 apps/locations/models/base.py:31 +#: apps/employees/models/base.py:84 apps/locations/models/base.py:31 #: templates/pages/employees.html:56 templates/pages/hr-portal.html:124 #: templates/pages/hr-portal.html:440 templates/pages/timetrack.html:47 msgid "Офис" msgstr "Office" -#: apps/employees/models/base.py:86 apps/locations/models/base.py:28 +#: apps/employees/models/base.py:87 apps/locations/models/base.py:28 msgid "Тип локации" msgstr "" -#: apps/employees/models/base.py:87 +#: apps/employees/models/base.py:88 msgid "Где работает: аптека / склад / офис" msgstr "" -#: apps/employees/models/base.py:94 apps/locations/models/pharmacies.py:88 +#: apps/employees/models/base.py:95 apps/locations/models/pharmacies.py:88 #: templates/pages/dislocation.html:117 templates/pages/pharmacies.html:113 -#: templates/pages/pharmacy-detail.html:85 +#: templates/pages/pharmacy-detail.html:87 msgid "Организация" msgstr "Organization" -#: apps/employees/models/base.py:95 apps/locations/models/pharmacies.py:89 +#: apps/employees/models/base.py:96 apps/locations/models/pharmacies.py:89 msgid "Юрлицо: АКС, АКС Одесса, Тира, Пентальфа..." msgstr "" -#: apps/employees/models/base.py:101 +#: apps/employees/models/base.py:102 msgid "Заполняется только для location_type=pharmacy" msgstr "" -#: apps/employees/models/base.py:114 +#: apps/employees/models/base.py:115 msgid "Заполняется для office / warehouse" msgstr "" -#: apps/employees/models/base.py:119 templates/pages/dislocation.html:297 -#: templates/pages/employees.html:104 templates/pages/hr-portal.html:216 -#: templates/pages/hr-portal.html:467 +#: apps/employees/models/base.py:120 osc/apps/employees/models.py:77 +#: templates/pages/dislocation.html:297 templates/pages/employees.html:104 +#: templates/pages/hr-portal.html:216 templates/pages/hr-portal.html:467 msgid "Должность" msgstr "Position" -#: apps/employees/models/base.py:125 templates/pages/employee-detail.html:92 -#: templates/pages/structure.html:60 +#: apps/employees/models/base.py:126 osc/apps/employees/models.py:81 +#: templates/pages/employee-detail.html:99 templates/pages/structure.html:60 msgid "Руководитель" msgstr "Manager" -#: apps/employees/models/base.py:128 +#: apps/employees/models/base.py:129 osc/apps/employees/models.py:84 msgid "Дата приёма на работу" msgstr "" -#: apps/employees/models/base.py:129 templates/pages/employee-detail.html:109 +#: apps/employees/models/base.py:130 osc/apps/employees/models.py:85 +#: templates/pages/employee-detail.html:116 msgid "Дата увольнения" msgstr "Termination date" -#: apps/employees/models/base.py:130 +#: apps/employees/models/base.py:131 osc/apps/employees/models.py:86 msgid "Конец испытательного срока" msgstr "" -#: apps/employees/models/base.py:133 apps/visit_manager/admin.py:262 -#: apps/visit_manager/admin.py:289 templates/pages/hr-portal.html:165 -#: templates/pages/hr-portal.html:234 +#: apps/employees/models/base.py:134 apps/visit_manager/admin.py:262 +#: apps/visit_manager/admin.py:289 osc/apps/employees/models.py:88 +#: templates/pages/hr-portal.html:165 templates/pages/hr-portal.html:234 msgid "Фото" msgstr "Photo" -#: apps/employees/models/base.py:137 +#: apps/employees/models/base.py:138 osc/apps/employees/models.py:90 msgid "ID Mattermost" msgstr "" -#: apps/employees/models/base.py:138 +#: apps/employees/models/base.py:139 osc/apps/employees/models.py:91 msgid "Логин Mattermost" msgstr "" -#: apps/employees/models/base.py:140 +#: apps/employees/models/base.py:141 osc/apps/employees/models.py:93 msgid "Статус синхронизации Mattermost" msgstr "" -#: apps/employees/models/base.py:142 apps/tasks/models.py:24 -#: templates/pages/employee-detail.html:148 templates/pages/task-detail.html:25 -#: templates/pages/tasks.html:64 templates/pages/tasks.html:116 +#: apps/employees/models/base.py:143 apps/tasks/models.py:24 +#: osc/apps/employees/models.py:95 templates/pages/employee-detail.html:155 +#: templates/pages/task-detail.html:25 templates/pages/tasks.html:64 +#: templates/pages/tasks.html:116 msgid "Ожидает" msgstr "Pending" -#: apps/employees/models/base.py:143 apps/employees/models/base.py:158 -#: apps/locations/models/pharmacies.py:151 +#: apps/employees/models/base.py:144 apps/employees/models/base.py:159 +#: apps/locations/models/pharmacies.py:151 osc/apps/employees/models.py:96 +#: osc/apps/employees/models.py:114 msgid "Синхронизирован" msgstr "" -#: apps/employees/models/base.py:145 apps/employees/models/base.py:160 +#: apps/employees/models/base.py:146 apps/employees/models/base.py:161 +#: osc/apps/employees/models.py:98 osc/apps/employees/models.py:116 msgid "Отключена" msgstr "" -#: apps/employees/models/base.py:149 +#: apps/employees/models/base.py:150 osc/apps/employees/models.py:102 msgid "Последняя синхронизация Mattermost" msgstr "" -#: apps/employees/models/base.py:150 +#: apps/employees/models/base.py:151 osc/apps/employees/models.py:103 msgid "Синхронизация Mattermost" msgstr "" -#: apps/employees/models/base.py:155 +#: apps/employees/models/base.py:156 osc/apps/employees/models.py:111 msgid "Статус синхронизации AD" msgstr "" -#: apps/employees/models/base.py:157 +#: apps/employees/models/base.py:158 osc/apps/employees/models.py:113 msgid "Не синхронизирован" msgstr "" -#: apps/employees/models/base.py:164 +#: apps/employees/models/base.py:165 osc/apps/employees/models.py:120 msgid "Ошибка синхронизации AD" msgstr "" -#: apps/employees/models/base.py:165 +#: apps/employees/models/base.py:166 osc/apps/employees/models.py:121 msgid "Последняя синхронизация AD" msgstr "" -#: apps/employees/models/base.py:166 +#: apps/employees/models/base.py:167 osc/apps/employees/models.py:122 msgid "Синхронизация AD" msgstr "" -#: apps/employees/models/base.py:167 +#: apps/employees/models/base.py:168 msgid "Только для офисных сотрудников" msgstr "" -#: apps/employees/models/base.py:170 +#: apps/employees/models/base.py:171 msgid "Записей на странице" msgstr "" -#: apps/employees/models/base.py:172 +#: apps/employees/models/base.py:173 msgid "Сколько строк показывать в таблицах портала по умолчанию" msgstr "" -#: apps/employees/models/base.py:176 +#: apps/employees/models/base.py:177 msgid "Был онлайн" msgstr "" -#: apps/employees/models/base.py:177 +#: apps/employees/models/base.py:178 msgid "Обновляется автоматически при активности в портале (не в AD/Mattermost)" msgstr "" -#: apps/employees/models/base.py:187 templates/index.html:250 -#: templates/pages/dashboard.html:174 templates/pages/employees.html:8 -#: templates/pages/employees.html:24 templates/pages/hr-portal.html:92 +#: apps/employees/models/base.py:183 +msgid "TOTP-секрет" +msgstr "" + +#: apps/employees/models/base.py:184 +msgid "Секрет TOTP (шифруется). Заполняется при настройке 2FA." +msgstr "" + +#: apps/employees/models/base.py:186 +msgid "2FA включена" +msgstr "" + +#: apps/employees/models/base.py:188 +msgid "Резервные коды 2FA (хеши)" +msgstr "" + +#: apps/employees/models/base.py:189 +msgid "Хеши одноразовых резервных кодов; использованный код удаляется." +msgstr "" + +#: apps/employees/models/base.py:199 osc/apps/employees/models.py:131 +#: templates/index.html:251 templates/pages/dashboard.html:174 +#: templates/pages/employees.html:8 templates/pages/employees.html:24 +#: templates/pages/hr-portal.html:92 msgid "Сотрудники" msgstr "Employees" @@ -466,12 +517,13 @@ msgid "Действует с" msgstr "" #: apps/employees/models/permissions.py:57 -#: templates/pages/pharmacy-detail.html:246 +#: templates/pages/pharmacy-detail.html:248 msgid "Действует до" msgstr "Valid until" #: apps/employees/models/permissions.py:58 -#: apps/locations/models/pharmacies.py:334 +#: apps/locations/models/pharmacies.py:334 osc/apps/employees/models.py:49 +#: osc/core/models/directory.py:32 msgid "Активен" msgstr "" @@ -533,9 +585,7 @@ msgid "ID повідомлень в Mattermost" msgstr "" #: apps/feed/models.py:52 -msgid "" -"{team_name: post_id} — за наявності id повторна публікація редагує існуюче " -"повідомлення" +msgid "{team_name: post_id} — за наявності id повторна публікація редагує існуюче повідомлення" msgstr "" #: apps/feed/models.py:55 @@ -543,9 +593,7 @@ msgid "Куди публікувати в Mattermost" msgstr "" #: apps/feed/models.py:56 -msgid "" -"Список команд (akc/pharmacys/warehouse) — обирається чекбоксами при " -"створенні/редагуванні" +msgid "Список команд (akc/pharmacys/warehouse) — обирається чекбоксами при створенні/редагуванні" msgstr "" #: apps/feed/models.py:61 apps/feed/models.py:100 apps/tasks/models.py:126 @@ -697,7 +745,7 @@ msgid "Экземпляров" msgstr "" #: apps/it_manager/admin.py:110 templates/pages/it-manager.html:13 -#: templates/pages/it-manager.html:514 templates/pages/pharmacy-detail.html:193 +#: templates/pages/it-manager.html:514 templates/pages/pharmacy-detail.html:195 msgid "Оборудование" msgstr "Equipment" @@ -712,9 +760,9 @@ msgstr "" #: apps/it_manager/admin.py:119 apps/it_manager/admin.py:212 #: apps/it_manager/admin.py:427 apps/it_manager/admin.py:476 #: apps/locations/admin.py:319 apps/locations/models/pharmacies.py:335 -#: core/models/connector_config.py:43 templates/pages/it-manager.html:674 +#: core/models/connector_config.py:44 templates/pages/it-manager.html:674 #: templates/pages/it-manager.html:845 templates/pages/it-manager.html:950 -#: templates/pages/pharmacy-detail.html:96 +#: templates/pages/pharmacy-detail.html:98 msgid "Примечания" msgstr "Notes" @@ -728,7 +776,7 @@ msgstr "" msgid "Модель" msgstr "Model" -#: apps/it_manager/admin.py:180 templates/pages/pharmacy-detail.html:197 +#: apps/it_manager/admin.py:180 templates/pages/pharmacy-detail.html:199 msgid "Гарантия" msgstr "Warranty" @@ -778,7 +826,8 @@ msgstr "Take in progress" msgid "Отметить решёнными" msgstr "" -#: apps/it_manager/admin.py:383 templates/pages/it-manager.html:75 +#: apps/it_manager/admin.py:383 templates/pages/chat.html:88 +#: templates/pages/chat.html:112 templates/pages/it-manager.html:75 #: templates/pages/it-manager.html:135 templates/pages/it-manager.html:480 #: templates/pages/it-manager.html:614 templates/pages/it-manager.html:815 #: templates/pages/it-manager.html:865 templates/pages/it-manager.html:1048 @@ -817,7 +866,7 @@ msgstr "IP addresses" msgid "Услуга" msgstr "" -#: apps/it_manager/admin.py:508 templates/pages/pharmacy-detail.html:243 +#: apps/it_manager/admin.py:508 templates/pages/pharmacy-detail.html:245 msgid "Технология" msgstr "Technology" @@ -829,7 +878,7 @@ msgstr "Expiry" msgid "Статические IP" msgstr "" -#: apps/it_manager/admin.py:608 templates/pages/employee-detail.html:89 +#: apps/it_manager/admin.py:608 templates/pages/employee-detail.html:96 msgid "Работа" msgstr "Work" @@ -882,12 +931,12 @@ msgstr "" #: apps/locations/admin.py:99 apps/locations/admin.py:282 #: templates/pages/employees.html:106 templates/pages/pharmacies.html:114 -#: templates/pages/pharmacy-detail.html:87 +#: templates/pages/pharmacy-detail.html:89 msgid "Адрес" msgstr "Address" #: apps/locations/admin.py:102 apps/locations/admin.py:139 -#: apps/locations/admin.py:354 templates/pages/pharmacy-detail.html:155 +#: apps/locations/admin.py:354 templates/pages/pharmacy-detail.html:157 msgid "Координаты" msgstr "Coordinates" @@ -938,12 +987,10 @@ msgid "Почта Carbonio" msgstr "" #: apps/locations/admin.py:316 -msgid "" -"Пусто в «Почта Carbonio» — адрес сгенерируется как <префикс " -"организации><номер>@домен. Можно задать вручную." +msgid "Пусто в «Почта Carbonio» — адрес сгенерируется как <префикс организации><номер>@домен. Можно задать вручную." msgstr "" -#: apps/locations/admin.py:376 core/views.py:350 +#: apps/locations/admin.py:376 core/views.py:352 #: templates/pages/structure.html:61 msgid "Сотрудников" msgstr "" @@ -1038,7 +1085,7 @@ msgid "Заведующий аптекой" msgstr "" #: apps/locations/models/pharmacies.py:113 -#: templates/pages/pharmacy-detail.html:90 +#: templates/pages/pharmacy-detail.html:92 msgid "Ответственный менеджер" msgstr "Responsible manager" @@ -1047,7 +1094,7 @@ msgid "Сотрудник с должностью «Відповідальний msgstr "" #: apps/locations/models/pharmacies.py:119 -#: templates/pages/pharmacy-detail.html:91 +#: templates/pages/pharmacy-detail.html:93 msgid "Куратор" msgstr "Curator" @@ -1095,9 +1142,7 @@ msgid "Отключён" msgstr "" #: apps/locations/models/pharmacies.py:157 -msgid "" -"Ящик аптеки. Пусто — сгенерируется как <префикс организации><номер>@домен. " -"Можно задать вручную." +msgid "Ящик аптеки. Пусто — сгенерируется как <префикс организации><номер>@домен. Можно задать вручную." msgstr "" #: apps/locations/models/pharmacies.py:160 @@ -1132,7 +1177,7 @@ msgstr "" msgid "Ошибка синхронизации Carbonio" msgstr "" -#: apps/locations/models/pharmacies.py:211 templates/index.html:381 +#: apps/locations/models/pharmacies.py:211 templates/index.html:382 #: templates/pages/dislocation.html:16 templates/pages/pharmacies.html:6 #: templates/pages/timetrack.html:49 msgid "Аптеки" @@ -1143,7 +1188,7 @@ msgid "Такой адрес Carbonio уже используется друго msgstr "" #: apps/locations/models/pharmacies.py:325 -#: templates/pages/pharmacy-detail.html:111 +#: templates/pages/pharmacy-detail.html:113 msgid "Основной" msgstr "Primary" @@ -1199,6 +1244,46 @@ msgstr "" msgid "Журнал синхронизации Carbonio" msgstr "" +#: apps/nextcloud_connector/models.py:20 +msgid "Создание папки" +msgstr "" + +#: apps/nextcloud_connector/models.py:21 +msgid "Обновление ACL" +msgstr "" + +#: apps/nextcloud_connector/models.py:22 +msgid "Пропуск" +msgstr "" + +#: apps/nextcloud_connector/models.py:27 +msgid "Пробный прогон" +msgstr "" + +#: apps/nextcloud_connector/models.py:30 +msgid "Тип сущности" +msgstr "" + +#: apps/nextcloud_connector/models.py:31 +msgid "Ссылка на сущность" +msgstr "" + +#: apps/nextcloud_connector/models.py:32 +msgid "Код отдела или номер аптеки" +msgstr "" + +#: apps/nextcloud_connector/models.py:33 +msgid "Путь Group Folder" +msgstr "" + +#: apps/nextcloud_connector/models.py:39 +msgid "Запись синхронизации Nextcloud" +msgstr "" + +#: apps/nextcloud_connector/models.py:40 +msgid "Журнал синхронизации Nextcloud" +msgstr "" + #: apps/tasks/models.py:25 templates/pages/it-manager.html:322 #: templates/pages/it-manager.html:374 templates/pages/task-detail.html:21 #: templates/pages/tasks.html:68 templates/pages/tasks.html:108 @@ -1292,7 +1377,7 @@ msgstr "" msgid "Відмітив" msgstr "" -#: apps/tasks/models.py:153 +#: apps/tasks/models.py:153 osc/core/models/directory.py:33 msgid "Порядок" msgstr "" @@ -1451,7 +1536,8 @@ msgid "Повна зміна" msgstr "" #: core/admin.py:20 core/models/directories.py:54 -#: core/models/directories.py:116 +#: core/models/directories.py:116 osc/core/models/directory.py:12 +#: osc/core/models/directory.py:23 msgid "Тип справочника" msgstr "" @@ -1482,7 +1568,7 @@ msgid "Записей" msgstr "" #: core/admin.py:144 templates/pages/pharmacy-detail.html:67 -#: templates/pages/pharmacy-detail.html:83 +#: templates/pages/pharmacy-detail.html:85 msgid "Основная информация" msgstr "General information" @@ -1503,6 +1589,7 @@ msgid "Дерево справочников перестроено" msgstr "" #: core/admin.py:195 core/models/directories.py:119 +#: osc/core/models/directory.py:9 osc/core/models/directory.py:26 #: templates/pages/it-manager.html:821 msgid "Название" msgstr "Name" @@ -1519,7 +1606,7 @@ msgstr "" msgid "Укажите токен или логин/пароль — в зависимости от типа коннектора" msgstr "" -#: core/admin.py:263 core/models/connector_config.py:39 +#: core/admin.py:263 core/models/connector_config.py:40 msgid "Дополнительные параметры" msgstr "" @@ -1527,55 +1614,57 @@ msgstr "" msgid "Коннектор" msgstr "" -#: core/models/connector_config.py:17 +#: core/models/connector_config.py:18 msgid "Тип коннектора" msgstr "" -#: core/models/connector_config.py:20 +#: core/models/connector_config.py:21 msgid "Включён" msgstr "" -#: core/models/connector_config.py:23 +#: core/models/connector_config.py:24 msgid "Хост" msgstr "" -#: core/models/connector_config.py:24 +#: core/models/connector_config.py:25 msgid "Порт" msgstr "" -#: core/models/connector_config.py:25 +#: core/models/connector_config.py:26 msgid "Использовать SSL" msgstr "" -#: core/models/connector_config.py:31 +#: core/models/connector_config.py:32 msgid "Пароль" msgstr "" -#: core/models/connector_config.py:33 +#: core/models/connector_config.py:34 msgid "Токен / API Key" msgstr "" -#: core/models/connector_config.py:34 +#: core/models/connector_config.py:35 msgid "Bearer-токен или API-ключ, если используется вместо логина/пароля" msgstr "" -#: core/models/connector_config.py:40 +#: core/models/connector_config.py:41 msgid "Специфичные для коннектора настройки в формате JSON" msgstr "" -#: core/models/connector_config.py:46 +#: core/models/connector_config.py:47 msgid "Настройки коннектора" msgstr "" -#: core/models/connector_config.py:47 +#: core/models/connector_config.py:48 osc/core/models/connector_settings.py:33 +#: osc/core/models/connector_settings.py:34 +#: osc/core/models/connector_settings.py:37 msgid "Настройки коннекторов" msgstr "" -#: core/models/connector_config.py:57 +#: core/models/connector_config.py:58 msgid "Хост обязателен для включённого коннектора" msgstr "" -#: core/models/connector_config.py:60 +#: core/models/connector_config.py:61 msgid "Для включённого коннектора необходимо указать токен или логин" msgstr "" @@ -1611,11 +1700,12 @@ msgstr "" msgid "Только для гибкой и кастомной иерархии" msgstr "" -#: core/models/directories.py:55 +#: core/models/directories.py:55 osc/core/models/directory.py:13 msgid "Типы справочников" msgstr "" -#: core/models/directories.py:118 +#: core/models/directories.py:118 osc/core/models/directory.py:8 +#: osc/core/models/directory.py:25 msgid "Код" msgstr "" @@ -1680,181 +1770,414 @@ msgstr "" msgid "Неверная контрольная сумма ИНН" msgstr "" -#: core/views.py:349 +#: core/views.py:351 msgid "Рабочих дней" msgstr "Working days" -#: core/views.py:349 +#: core/views.py:351 msgid "с отметками" msgstr "with check-ins" -#: core/views.py:350 +#: core/views.py:352 msgid "отмечались" msgstr "checked in" -#: core/views.py:351 +#: core/views.py:353 msgid "Смен" msgstr "Shifts" -#: core/views.py:351 +#: core/views.py:353 msgid "за месяц" msgstr "this month" -#: core/views.py:352 templates/pages/timetrack.html:62 +#: core/views.py:354 templates/pages/timetrack.html:62 msgid "Незакрытых" msgstr "Open" -#: core/views.py:352 +#: core/views.py:354 msgid "без ухода" msgstr "without checkout" -#: core/views.py:353 +#: core/views.py:355 msgid "Всего часов" msgstr "Total hours" -#: core/views.py:353 +#: core/views.py:355 msgid "отработано" msgstr "worked" -#: templates/index.html:210 +#: osc/apps/employees/models.py:34 +msgid "Логин для входа, совпадает с учётной записью AD" +msgstr "" + +#: osc/apps/employees/models.py:105 +msgid "Логин AD (sAMAccountName)" +msgstr "" + +#: osc/apps/employees/models.py:107 +msgid "AD User DN" +msgstr "" + +#: osc/apps/employees/models.py:151 +msgid "Не может быть раньше даты приёма" +msgstr "" + +#: osc/apps/employees/models.py:153 +msgid "Сотрудник не может быть своим руководителем" +msgstr "" + +#: osc/apps/mattermost_connector/models.py:23 +msgid "Запись синхронизации Mattermost" +msgstr "" + +#: osc/apps/mattermost_connector/models.py:24 +msgid "Журнал синхронизации Mattermost" +msgstr "" + +#: osc/core/models/connector_settings.py:10 +msgid "Требовать смену пароля при создании" +msgstr "" + +#: osc/core/models/connector_settings.py:12 +msgid "Новым учётным записям в AD выставляется флаг «сменить пароль при следующем входе». Если выключено — выданный пароль действует сразу, без принудительной смены." +msgstr "" + +#: osc/core/models/connector_settings.py:17 +msgid "Пароль не имеет срока действия" +msgstr "" + +#: osc/core/models/connector_settings.py:19 +msgid "Новым и существующим учётным записям в AD выставляется флаг «Password never expires». Если выключено — действует обычная парольная политика домена." +msgstr "" + +#: osc/core/models/connector_settings.py:24 +msgid "Команда Mattermost по умолчанию" +msgstr "" + +#: osc/core/models/connector_settings.py:25 +msgid "Сотрудники автоматически добавляются в эту команду при синхронизации с Mattermost." +msgstr "" + +#: osc/core/models/connector_settings.py:28 +msgid "Каналы по умолчанию" +msgstr "" + +#: osc/core/models/connector_settings.py:29 +msgid "Сотрудники автоматически добавляются в эти каналы при синхронизации с Mattermost." +msgstr "" + +#: osc/core/models/directory.py:29 +msgid "Родительский элемент" +msgstr "" + +#: osc/core/models/directory.py:30 +msgid "Должен принадлежать тому же типу справочника" +msgstr "" + +#: osc/core/models/directory.py:35 +msgid "OU в Active Directory" +msgstr "" + +#: osc/core/models/directory.py:37 +msgid "Используется только для справочника отделов (department): сотрудники этого отдела создаются/переносятся в указанную OU. Например: OU=IT,OU=OL_Users,DC=ol,DC=local. Если не задано — используется AD_USERS_OU." +msgstr "" + +#: osc/core/models/directory.py:44 templates/pages/dashboard.html:163 +msgid "Справочник" +msgstr "Directory" + +#: osc/core/models/directory.py:45 +msgid "Справочники" +msgstr "" + +#: osc/core/models/directory.py:56 +msgid "Элемент не может быть родителем самому себе" +msgstr "" + +#: osc/core/models/directory.py:58 +msgid "Родитель должен принадлежать тому же типу справочника" +msgstr "" + +#: osc/core/models/directory.py:62 +msgid "Циклическая вложенность недопустима" +msgstr "" + +#: osc/core/models/site_settings.py:9 +msgid "Название портала" +msgstr "" + +#: osc/core/models/site_settings.py:10 +msgid "Логотип" +msgstr "" + +#: osc/core/models/site_settings.py:13 osc/core/models/site_settings.py:14 +#: osc/core/models/site_settings.py:17 +msgid "Настройки сайта" +msgstr "" + +#: osc/core/utils/validators.py:16 +msgid "Введите корректный украинский номер телефона, например +380501234567" +msgstr "" + +#: osc/core/utils/validators.py:24 +msgid "Дата рождения должна быть в прошлом" +msgstr "" + +#: osc/core/utils/validators.py:27 +msgid "Сотруднику должно быть не менее 16 лет" +msgstr "" + +#: osc/core/utils/validators.py:29 +msgid "Проверьте дату рождения — возраст превышает 100 лет" +msgstr "" + +#: osc/core/utils/validators.py:35 +msgid "ИНН должен состоять из 10 цифр" +msgstr "" + +#: osc/core/utils/validators.py:38 +msgid "Некорректный ИНН: неверная контрольная сумма" +msgstr "" + +#: osc/templates/admin/employees/employee/delete_confirmation.html:10 +#, python-format +msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:" +msgstr "" + +#: osc/templates/admin/employees/employee/delete_confirmation.html:17 +msgid "Objects" +msgstr "" + +#: templates/index.html:211 msgid "Сеть аптек" msgstr "Pharmacy network" -#: templates/index.html:211 +#: templates/index.html:212 msgid "Портал пользователя" msgstr "User portal" -#: templates/index.html:220 +#: templates/index.html:221 msgid "Главное меню" msgstr "Main menu" -#: templates/index.html:229 templates/index.html:650 +#: templates/index.html:230 templates/index.html:654 msgid "Главная" msgstr "Home" -#: templates/index.html:239 templates/pages/news.html:6 +#: templates/index.html:240 templates/pages/news.html:6 msgid "Новости" msgstr "News" -#: templates/index.html:260 templates/index.html:660 +#: templates/index.html:261 templates/index.html:664 #: templates/pages/dashboard.html:145 templates/pages/task-detail.html:10 msgid "Задачи" msgstr "Tasks" -#: templates/index.html:268 templates/pages/dislocation.html:8 +#: templates/index.html:269 templates/pages/dislocation.html:8 msgid "Дислокация" msgstr "Dislocation" -#: templates/index.html:277 templates/pages/dashboard.html:135 +#: templates/index.html:278 templates/pages/dashboard.html:135 +#: templates/pages/documents.html:5 templates/pages/pharmacy-detail.html:75 msgid "Документы" msgstr "Documents" -#: templates/index.html:287 templates/pages/dashboard.html:125 +#: templates/index.html:288 templates/pages/dashboard.html:125 msgid "Электронная почта" msgstr "Email" -#: templates/index.html:296 templates/index.html:680 +#: templates/index.html:297 templates/index.html:684 +#: templates/pages/chat.html:5 msgid "Чат" msgstr "Chat" -#: templates/index.html:305 templates/pages/dashboard.html:154 +#: templates/index.html:306 templates/pages/dashboard.html:154 msgid "Календарь" msgstr "Calendar" -#: templates/index.html:314 +#: templates/index.html:315 msgid "Базы данных" msgstr "Databases" -#: templates/index.html:323 +#: templates/index.html:324 msgid "Отчёты" msgstr "Reports" -#: templates/index.html:333 +#: templates/index.html:334 msgid "Закупки" msgstr "Purchases" -#: templates/index.html:342 templates/pages/dashboard.html:183 +#: templates/index.html:343 templates/pages/dashboard.html:183 msgid "HR портал" msgstr "HR portal" -#: templates/index.html:352 templates/index.html:611 +#: templates/index.html:353 templates/index.html:612 #: templates/pages/settings.html:5 msgid "Настройки" msgstr "Settings" -#: templates/index.html:360 +#: templates/index.html:361 msgid "Управление" msgstr "Management" -#: templates/index.html:371 templates/pages/structure.html:7 +#: templates/index.html:372 templates/pages/structure.html:7 msgid "Структура" msgstr "Structure" -#: templates/index.html:390 +#: templates/index.html:391 msgid "Коммунальные услуги" msgstr "Utilities" -#: templates/index.html:401 +#: templates/index.html:402 msgid "Рекрутинг" msgstr "Recruiting" -#: templates/index.html:410 templates/pages/hr-portal.html:292 +#: templates/index.html:411 templates/pages/hr-portal.html:292 #: templates/pages/timetrack.html:7 msgid "Учёт рабочего времени" msgstr "Time tracking" -#: templates/index.html:418 +#: templates/index.html:419 msgid "Поддержка" msgstr "Support" -#: templates/index.html:428 templates/pages/hr-portal.html:284 +#: templates/index.html:429 templates/pages/hr-portal.html:284 msgid "Справка" msgstr "Reference" -#: templates/index.html:438 templates/pages/dashboard.html:193 +#: templates/index.html:439 templates/pages/dashboard.html:193 msgid "Поддержка IT" msgstr "IT Support" -#: templates/index.html:448 templates/pages/it-manager.html:6 +#: templates/index.html:449 templates/pages/it-manager.html:6 msgid "IT-отдел" msgstr "IT department" -#: templates/index.html:460 +#: templates/index.html:461 msgid "Active Directory" msgstr "Active Directory" -#: templates/index.html:494 templates/pages/employees.html:32 +#: templates/index.html:495 templates/pages/employees.html:32 msgid "Поиск..." msgstr "Search..." -#: templates/index.html:511 +#: templates/index.html:512 msgid "Язык" msgstr "Language" -#: templates/index.html:607 templates/pages/hr-portal.html:199 +#: templates/index.html:608 templates/pages/hr-portal.html:199 msgid "Профиль" msgstr "Profile" -#: templates/index.html:615 +#: templates/index.html:616 msgid "Помощь" msgstr "Help" -#: templates/index.html:620 +#: templates/index.html:623 msgid "Выход" msgstr "Logout" -#: templates/index.html:633 +#: templates/index.html:637 msgid "Загрузка..." msgstr "Loading..." -#: templates/index.html:671 +#: templates/index.html:675 msgid "Люди" msgstr "" -#: templates/index.html:687 +#: templates/index.html:691 msgid "Меню" msgstr "" +#: templates/pages/chat.html:6 +msgid "Внутренний корпоративный мессенджер (Mattermost)" +msgstr "Internal corporate messenger (Mattermost)" + +#: templates/pages/chat.html:15 +msgid "Поиск по всем сообщениям..." +msgstr "Search all messages..." + +#: templates/pages/chat.html:17 +msgid "Искать" +msgstr "Search" + +#: templates/pages/chat.html:31 +msgid "Личные сообщения" +msgstr "Direct messages" + +#: templates/pages/chat.html:32 templates/pages/chat.html:111 +msgid "Новое сообщение" +msgstr "New message" + +#: templates/pages/chat.html:37 templates/pages/chat.html:44 +#: templates/pages/documents.html:24 templates/pages/pharmacy-detail.html:337 +msgid "Загрузка…" +msgstr "Loading…" + +#: templates/pages/chat.html:41 +msgid "Каналы" +msgstr "Channels" + +#: templates/pages/chat.html:51 +msgid "Показывать закрытые разговоры" +msgstr "Show closed conversations" + +#: templates/pages/chat.html:59 +msgid "Выберите канал слева" +msgstr "Select a channel on the left" + +#: templates/pages/chat.html:69 templates/pages/chat.html:96 +msgid "Прикрепить файл" +msgstr "Attach file" + +#: templates/pages/chat.html:72 +msgid "Написать сообщение..." +msgstr "Write a message..." + +#: templates/pages/chat.html:87 +msgid "Обсуждение" +msgstr "Thread" + +#: templates/pages/chat.html:99 +msgid "Ответить в обсуждении..." +msgstr "Reply in thread..." + +#: templates/pages/chat.html:117 +msgid "Поиск коллег..." +msgstr "Search colleagues..." + +#: templates/pages/chat.html:119 +msgid "Начать разговор" +msgstr "Start conversation" + +#: templates/pages/chat.html:130 +msgid "Ваша учётная запись ещё не синхронизирована с Mattermost" +msgstr "Your account is not synced with Mattermost yet" + +#: templates/pages/chat.html:132 +msgid "Нажмите кнопку ниже, чтобы создать или привязать вашу учётную запись в Mattermost." +msgstr "Click the button below to create or link your Mattermost account." + +#: templates/pages/chat.html:135 +msgid "Синхронизировать сейчас" +msgstr "Sync now" + +#: templates/pages/chat.html:144 +msgid "Не удалось получить доступ к Mattermost" +msgstr "Failed to access Mattermost" + +#: templates/pages/chat.html:146 +msgid "Обратитесь в IT-отдел — возможно, отключена выдача Personal Access Token на сервере Mattermost." +msgstr "Contact the IT department — Personal Access Token issuance may be disabled on the Mattermost server." + +#: templates/pages/chat.html:155 +msgid "Чат ещё не подключён" +msgstr "Chat is not connected yet" + +#: templates/pages/chat.html:157 +msgid "Укажите публичный URL Mattermost (поле public_url в «Дополнительные параметры» коннектора Mattermost в админке) — и он появится здесь." +msgstr "Specify the public Mattermost URL (the public_url field under «Additional parameters» of the Mattermost connector in the admin) and it will appear here." + #: templates/pages/dashboard.html:7 msgid "Добрый день" msgstr "Good afternoon" @@ -1940,10 +2263,6 @@ msgstr "Quick access" msgid "Полезные ссылки и инструменты" msgstr "Useful links and tools" -#: templates/pages/dashboard.html:163 -msgid "Справочник" -msgstr "Directory" - #: templates/pages/dislocation.html:3 msgid "адрес не указан" msgstr "address not specified" @@ -2037,7 +2356,7 @@ msgstr "Map" #: templates/pages/dislocation.html:118 templates/pages/pharmacies.html:115 #: templates/pages/pharmacy-detail.html:49 -#: templates/pages/pharmacy-detail.html:139 +#: templates/pages/pharmacy-detail.html:141 msgid "Заведующий" msgstr "Manager" @@ -2068,7 +2387,7 @@ msgid "Неактивна" msgstr "Inactive" #: templates/pages/dislocation.html:208 -#: templates/pages/pharmacy-detail.html:147 +#: templates/pages/pharmacy-detail.html:149 msgid "В этой аптеке пока нет активных сотрудников" msgstr "No active employees in this pharmacy yet" @@ -2140,70 +2459,78 @@ msgstr "Showing" msgid "Нет записей" msgstr "No records" -#: templates/pages/employee-detail.html:21 templates/pages/news-detail.html:17 +#: templates/pages/documents.html:6 +msgid "Файловое хранилище: общие документы, обучение, отделы" +msgstr "" + +#: templates/pages/documents.html:29 +msgid "Нет доступных разделов документов." +msgstr "" + +#: templates/pages/employee-detail.html:28 templates/pages/news-detail.html:17 #: templates/pages/task-detail.html:41 templates/pages/tasks.html:127 msgid "Редактировать" msgstr "Edit" -#: templates/pages/employee-detail.html:40 templates/pages/employees.html:150 +#: templates/pages/employee-detail.html:47 templates/pages/employees.html:150 msgid "Не активный" msgstr "Inactive" -#: templates/pages/employee-detail.html:42 +#: templates/pages/employee-detail.html:49 msgid "Испытательный срок" msgstr "Probation period" -#: templates/pages/employee-detail.html:63 +#: templates/pages/employee-detail.html:70 msgid "Рабочий email" msgstr "Work email" -#: templates/pages/employee-detail.html:71 +#: templates/pages/employee-detail.html:78 msgid "Внутренний номер" msgstr "Internal number" -#: templates/pages/employee-detail.html:100 +#: templates/pages/employee-detail.html:107 msgid "Подчинённых" msgstr "Subordinates" -#: templates/pages/employee-detail.html:105 templates/pages/hr-portal.html:219 +#: templates/pages/employee-detail.html:112 templates/pages/hr-portal.html:219 msgid "Дата приёма" msgstr "Hire date" -#: templates/pages/employee-detail.html:132 +#: templates/pages/employee-detail.html:139 msgid "Экстренный контакт" msgstr "Emergency contact" -#: templates/pages/employee-detail.html:141 templates/pages/settings.html:17 +#: templates/pages/employee-detail.html:148 templates/pages/settings.html:17 msgid "Интеграции" msgstr "Integrations" -#: templates/pages/employee-detail.html:145 #: templates/pages/employee-detail.html:152 +#: templates/pages/employee-detail.html:159 msgid "Синхронизировано" msgstr "Synced" -#: templates/pages/employee-detail.html:147 #: templates/pages/employee-detail.html:154 +#: templates/pages/employee-detail.html:161 msgid "Отключено" msgstr "Disabled" -#: templates/pages/employee-detail.html:155 +#: templates/pages/employee-detail.html:162 msgid "Не синхронизировано" msgstr "Not synced" -#: templates/pages/employee-detail.html:182 +#: templates/pages/employee-detail.html:189 msgid "Задач пока нет" msgstr "No tasks yet" -#: templates/pages/employee-detail.html:196 +#: templates/pages/employee-detail.html:203 msgid "Цепочка руководства" msgstr "Management chain" -#: templates/pages/employee-detail.html:229 +#: templates/pages/employee-detail.html:236 msgid "Последнее посещение" msgstr "Last seen" -#: templates/pages/employee-detail.html:239 +#: templates/pages/employee-detail.html:246 msgid "Группы доступа" msgstr "Access groups" @@ -2469,8 +2796,7 @@ msgstr "New hiring request" #: templates/pages/hr-portal.html:416 msgid "Сразу создаёт личный учётный запис кандидата на срок испытания." -msgstr "" -"Immediately creates a personal candidate account for the probation period." +msgstr "Immediately creates a personal candidate account for the probation period." #: templates/pages/hr-portal.html:422 msgid "Фамилия " @@ -2532,7 +2858,7 @@ msgstr "Position / location" msgid "Испытание до" msgstr "Probation until" -#: templates/pages/hr-portal.html:537 templates/pages/pharmacy-detail.html:300 +#: templates/pages/hr-portal.html:537 templates/pages/pharmacy-detail.html:302 msgid "Подал" msgstr "Submitted by" @@ -2597,13 +2923,13 @@ msgid "Всего единиц" msgstr "Total units" #: templates/pages/it-manager.html:35 templates/pages/it-manager.html:259 -#: templates/pages/pharmacy-detail.html:211 +#: templates/pages/pharmacy-detail.html:213 msgid "На складе" msgstr "In stock" #: templates/pages/it-manager.html:39 templates/pages/it-manager.html:236 -#: templates/pages/it-manager.html:260 templates/pages/pharmacy-detail.html:196 -#: templates/pages/pharmacy-detail.html:212 +#: templates/pages/it-manager.html:260 templates/pages/pharmacy-detail.html:198 +#: templates/pages/pharmacy-detail.html:214 msgid "Выдано" msgstr "Issued" @@ -2644,9 +2970,7 @@ msgid "По одному в строку — вставьте список се msgstr "One per line — paste serial numbers, e.g." #: templates/pages/it-manager.html:96 -msgid "" -"Сколько серийников — столько единиц будет создано. Дубликаты и уже имеющиеся " -"пропускаются." +msgid "Сколько серийников — столько единиц будет создано. Дубликаты и уже имеющиеся пропускаются." msgstr "" #: templates/pages/it-manager.html:100 templates/pages/it-manager.html:670 @@ -2758,7 +3082,7 @@ msgstr "Type / Brand / Model" msgid "С/н · Инв. №" msgstr "S/n · Inv. no." -#: templates/pages/it-manager.html:261 templates/pages/pharmacy-detail.html:213 +#: templates/pages/it-manager.html:261 templates/pages/pharmacy-detail.html:215 msgid "В ремонте" msgstr "Under repair" @@ -2823,7 +3147,7 @@ msgstr "Assignee" #: templates/pages/it-manager.html:349 templates/pages/it-manager.html:486 #: templates/pages/it-manager.html:555 templates/pages/it-manager.html:1098 -#: templates/pages/pharmacy-detail.html:297 +#: templates/pages/pharmacy-detail.html:299 msgid "Дата" msgstr "Date" @@ -3004,7 +3328,7 @@ msgid "Номер договора" msgstr "Contract number" #: templates/pages/it-manager.html:895 templates/pages/it-manager.html:970 -#: templates/pages/pharmacy-detail.html:242 +#: templates/pages/pharmacy-detail.html:244 msgid "Тип услуги" msgstr "Service type" @@ -3048,7 +3372,7 @@ msgstr "One IP address per line" msgid "Провайдер / Локация" msgstr "Provider / Location" -#: templates/pages/it-manager.html:971 templates/pages/pharmacy-detail.html:244 +#: templates/pages/it-manager.html:971 templates/pages/pharmacy-detail.html:246 msgid "Скорость" msgstr "Speed" @@ -3117,7 +3441,7 @@ msgid "Это необратимо." msgstr "This is irreversible." #: templates/pages/news-detail.html:24 templates/pages/task-detail.html:48 -#: templates/pages/tasks.html:135 +#: templates/pages/tasks.html:135 templates/partials/pharmacy-documents.html:51 msgid "Удалить" msgstr "Delete" @@ -3248,83 +3572,83 @@ msgstr "Internet provider" msgid "Коммунальный отдел" msgstr "Utilities department" -#: templates/pages/pharmacy-detail.html:86 +#: templates/pages/pharmacy-detail.html:88 msgid "Регион" msgstr "Region" -#: templates/pages/pharmacy-detail.html:88 +#: templates/pages/pharmacy-detail.html:90 msgid "Категория" msgstr "Category" -#: templates/pages/pharmacy-detail.html:89 +#: templates/pages/pharmacy-detail.html:91 msgid "Категория НДС" msgstr "VAT category" -#: templates/pages/pharmacy-detail.html:92 +#: templates/pages/pharmacy-detail.html:94 msgid "Количество фармацевтов (штат)" msgstr "Number of pharmacists (staff)" -#: templates/pages/pharmacy-detail.html:119 +#: templates/pages/pharmacy-detail.html:121 msgid "Телефоны не указаны" msgstr "No phones specified" -#: templates/pages/pharmacy-detail.html:178 +#: templates/pages/pharmacy-detail.html:180 msgid "Создано:" msgstr "Created:" -#: templates/pages/pharmacy-detail.html:179 +#: templates/pages/pharmacy-detail.html:181 msgid "Обновлено:" msgstr "Updated:" -#: templates/pages/pharmacy-detail.html:194 +#: templates/pages/pharmacy-detail.html:196 msgid "Серийный / инв. №" msgstr "Serial / inv. no." -#: templates/pages/pharmacy-detail.html:223 +#: templates/pages/pharmacy-detail.html:225 msgid "За этой аптекой не закреплено оборудование" msgstr "No equipment assigned to this pharmacy" -#: templates/pages/pharmacy-detail.html:229 +#: templates/pages/pharmacy-detail.html:231 msgid "Управлять оборудованием в IT-отделе" msgstr "Manage equipment in IT department" -#: templates/pages/pharmacy-detail.html:241 +#: templates/pages/pharmacy-detail.html:243 msgid "Провайдер / договор" msgstr "Provider / contract" -#: templates/pages/pharmacy-detail.html:278 +#: templates/pages/pharmacy-detail.html:280 msgid "Договоров с провайдерами для этой аптеки не найдено" msgstr "No provider contracts found for this pharmacy" -#: templates/pages/pharmacy-detail.html:284 +#: templates/pages/pharmacy-detail.html:286 msgid "Управлять договорами в IT-отделе" msgstr "Manage contracts in IT department" -#: templates/pages/pharmacy-detail.html:296 +#: templates/pages/pharmacy-detail.html:298 msgid "Тип счётчика" msgstr "Meter type" -#: templates/pages/pharmacy-detail.html:298 +#: templates/pages/pharmacy-detail.html:300 msgid "Показания" msgstr "Readings" -#: templates/pages/pharmacy-detail.html:299 +#: templates/pages/pharmacy-detail.html:301 msgid "Расход" msgstr "Consumption" -#: templates/pages/pharmacy-detail.html:301 +#: templates/pages/pharmacy-detail.html:303 msgid "Комментарий" msgstr "Comment" -#: templates/pages/pharmacy-detail.html:312 +#: templates/pages/pharmacy-detail.html:314 msgid "Показания меньше предыдущего — проверьте" msgstr "Reading is lower than previous — check" -#: templates/pages/pharmacy-detail.html:322 +#: templates/pages/pharmacy-detail.html:324 msgid "Показаний счётчиков для этой аптеки ещё не подавали" msgstr "No meter readings submitted for this pharmacy yet" -#: templates/pages/pharmacy-detail.html:327 +#: templates/pages/pharmacy-detail.html:329 msgid "Подать показания / все показания" msgstr "Submit readings / all readings" @@ -3357,12 +3681,8 @@ msgid "Количество записей в таблицах по умолча msgstr "Default number of rows in tables" #: templates/pages/profile.html:100 -msgid "" -"Применяется ко всем таблицам портала, если для конкретной таблицы размер не " -"выбран вручную." -msgstr "" -"Applies to all portal tables unless a size is chosen manually for a specific " -"table." +msgid "Применяется ко всем таблицам портала, если для конкретной таблицы размер не выбран вручную." +msgstr "Applies to all portal tables unless a size is chosen manually for a specific table." #: templates/pages/settings.html:6 msgid "Конфигурация портала" @@ -3539,3 +3859,34 @@ msgstr "No time records for" #: templates/pages/timetrack.html:92 msgid "сотрудников" msgstr "employees" + +#: templates/partials/documents-browser.html:28 +#: templates/partials/pharmacy-documents.html:18 +msgid "Файловое хранилище пока не настроено." +msgstr "" + +#: templates/partials/documents-browser.html:32 +#: templates/partials/pharmacy-documents.html:22 +msgid "Не удалось получить список документов." +msgstr "" + +#: templates/partials/documents-browser.html:61 +msgid "В этой папке пока нет файлов." +msgstr "" + +#: templates/partials/documents-browser.html:74 +#: templates/partials/pharmacy-documents.html:76 +msgid "Загрузить" +msgstr "" + +#: templates/partials/pharmacy-documents.html:4 +msgid "Документы аптеки" +msgstr "" + +#: templates/partials/pharmacy-documents.html:48 +msgid "Удалить файл?" +msgstr "" + +#: templates/partials/pharmacy-documents.html:63 +msgid "В папке аптеки пока нет файлов." +msgstr "" diff --git a/locale/en/LC_MESSAGES/djangojs.mo b/locale/en/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..818f72e Binary files /dev/null and b/locale/en/LC_MESSAGES/djangojs.mo differ diff --git a/locale/en/LC_MESSAGES/djangojs.po b/locale/en/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..bc4e3b5 --- /dev/null +++ b/locale/en/LC_MESSAGES/djangojs.po @@ -0,0 +1,97 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "Failed to load channels" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-28 21:52+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: static/assets/js/chat.js:310 +msgid "Не удалось загрузить каналы" +msgstr "Failed to load channels" + +#: static/assets/js/chat.js:402 +msgid "Нет каналов" +msgstr "No channels" + +#: static/assets/js/chat.js:423 +msgid "Нет сообщений" +msgstr "No messages" + +#: static/assets/js/chat.js:432 +msgid "Групповой разговор" +msgstr "Group conversation" + +#: static/assets/js/chat.js:549 static/assets/js/chat.js:952 +msgid "Загрузка…" +msgstr "Loading…" + +#: static/assets/js/chat.js:561 +msgid "Не удалось загрузить сообщения" +msgstr "Failed to load messages" + +#: static/assets/js/chat.js:611 +msgid "Личное" +msgstr "Direct" + +#: static/assets/js/chat.js:629 +msgid "Поиск…" +msgstr "Searching…" + +#: static/assets/js/chat.js:650 +msgid "Не удалось выполнить поиск" +msgstr "Search failed" + +#: static/assets/js/chat.js:663 +msgid "Найдено:" +msgstr "Found:" + +#: static/assets/js/chat.js:666 +msgid "Закрыть поиск" +msgstr "Close search" + +#: static/assets/js/chat.js:676 +msgid "Ничего не найдено" +msgstr "Nothing found" + +#: static/assets/js/chat.js:718 +msgid "бот" +msgstr "bot" + +#: static/assets/js/chat.js:743 +msgid "Вы" +msgstr "You" + +#: static/assets/js/chat.js:781 +msgid "Реакция" +msgstr "React" + +#: static/assets/js/chat.js:790 static/assets/js/chat.js:1002 +msgid "Ответов:" +msgstr "Replies:" + +#: static/assets/js/chat.js:790 +msgid "Ответить" +msgstr "Reply" + +#: static/assets/js/chat.js:964 +msgid "Не удалось загрузить обсуждение" +msgstr "Failed to load thread" + +#: static/assets/js/chat.js:1108 +msgid "Никого не найдено" +msgstr "No one found" + +#: static/assets/js/chat.js:1204 +msgid "Новое сообщение" +msgstr "New message" diff --git a/locale/uk/LC_MESSAGES/django.mo b/locale/uk/LC_MESSAGES/django.mo index 88a0adf..a2bd89b 100644 Binary files a/locale/uk/LC_MESSAGES/django.mo and b/locale/uk/LC_MESSAGES/django.mo differ diff --git a/locale/uk/LC_MESSAGES/django.po b/locale/uk/LC_MESSAGES/django.po index 8de921f..ae4f03d 100644 --- a/locale/uk/LC_MESSAGES/django.po +++ b/locale/uk/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-28 10:22+0300\n" +"POT-Creation-Date: 2026-07-28 21:52+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -15,26 +15,31 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " -"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " -"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " -"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" -#: apps/ad_connector/models.py:10 apps/employees/models/base.py:186 -#: apps/employees/models/permissions.py:47 templates/pages/employees.html:103 -#: templates/pages/hr-portal.html:215 templates/pages/timetrack.html:58 +#: apps/ad_connector/models.py:10 apps/employees/models/base.py:198 +#: apps/employees/models/permissions.py:47 osc/apps/ad_connector/models.py:10 +#: osc/apps/employees/models.py:130 osc/apps/mattermost_connector/models.py:10 +#: templates/pages/employees.html:103 templates/pages/hr-portal.html:215 +#: templates/pages/timetrack.html:58 msgid "Сотрудник" msgstr "Співробітник" #: apps/ad_connector/models.py:13 apps/mail_connector/models.py:15 +#: apps/nextcloud_connector/models.py:34 osc/apps/ad_connector/models.py:13 +#: osc/apps/mattermost_connector/models.py:13 msgid "Действие" msgstr "" #: apps/ad_connector/models.py:15 apps/mail_connector/models.py:17 +#: osc/apps/ad_connector/models.py:14 +#: osc/apps/mattermost_connector/models.py:14 msgid "Создание" msgstr "" #: apps/ad_connector/models.py:16 apps/mail_connector/models.py:18 +#: osc/apps/ad_connector/models.py:14 +#: osc/apps/mattermost_connector/models.py:14 msgid "Обновление" msgstr "" @@ -50,43 +55,54 @@ msgstr "" #: apps/it_manager/admin.py:168 apps/it_manager/admin.py:263 #: apps/it_manager/admin.py:352 apps/it_manager/admin.py:498 #: apps/locations/models/pharmacies.py:128 apps/mail_connector/models.py:24 -#: apps/tasks/models.py:40 apps/visit_manager/admin.py:199 core/admin.py:32 +#: apps/nextcloud_connector/models.py:35 apps/tasks/models.py:40 +#: apps/visit_manager/admin.py:199 core/admin.py:32 +#: osc/apps/ad_connector/models.py:17 +#: osc/apps/mattermost_connector/models.py:17 #: templates/pages/dislocation.html:122 templates/pages/employees.html:107 #: templates/pages/hr-portal.html:535 templates/pages/it-manager.html:237 #: templates/pages/it-manager.html:273 templates/pages/it-manager.html:350 #: templates/pages/it-manager.html:403 templates/pages/it-manager.html:696 #: templates/pages/it-manager.html:724 templates/pages/it-manager.html:973 #: templates/pages/it-manager.html:1002 templates/pages/pharmacies.html:119 -#: templates/pages/pharmacy-detail.html:195 -#: templates/pages/pharmacy-detail.html:245 templates/pages/structure.html:63 +#: templates/pages/pharmacy-detail.html:197 +#: templates/pages/pharmacy-detail.html:247 templates/pages/structure.html:63 msgid "Статус" msgstr "Статус" #: apps/ad_connector/models.py:23 apps/mail_connector/models.py:25 +#: apps/nextcloud_connector/models.py:25 osc/apps/ad_connector/models.py:18 +#: osc/apps/mattermost_connector/models.py:18 msgid "Успех" msgstr "" -#: apps/ad_connector/models.py:23 apps/employees/models/base.py:144 -#: apps/employees/models/base.py:159 apps/locations/models/pharmacies.py:152 -#: apps/mail_connector/models.py:25 templates/pages/employee-detail.html:146 +#: apps/ad_connector/models.py:23 apps/employees/models/base.py:145 +#: apps/employees/models/base.py:160 apps/locations/models/pharmacies.py:152 +#: apps/mail_connector/models.py:25 apps/nextcloud_connector/models.py:26 +#: osc/apps/ad_connector/models.py:18 osc/apps/employees/models.py:97 +#: osc/apps/employees/models.py:115 osc/apps/mattermost_connector/models.py:18 #: templates/pages/employee-detail.html:153 +#: templates/pages/employee-detail.html:160 msgid "Ошибка" msgstr "Помилка" #: apps/ad_connector/models.py:25 apps/mail_connector/models.py:27 +#: apps/nextcloud_connector/models.py:36 osc/apps/ad_connector/models.py:20 +#: osc/apps/mattermost_connector/models.py:20 msgid "Сообщение" msgstr "" -#: apps/ad_connector/models.py:28 +#: apps/ad_connector/models.py:28 osc/apps/ad_connector/models.py:23 msgid "Запись синхронизации AD" msgstr "" -#: apps/ad_connector/models.py:29 +#: apps/ad_connector/models.py:29 osc/apps/ad_connector/models.py:24 msgid "Журнал синхронизации AD" msgstr "" -#: apps/employees/admin.py:37 apps/employees/admin.py:244 -#: apps/employees/models/base.py:112 templates/pages/hr-portal.html:446 +#: apps/employees/admin.py:37 apps/employees/admin.py:259 +#: apps/employees/models/base.py:113 apps/nextcloud_connector/models.py:16 +#: osc/apps/employees/models.py:72 templates/pages/hr-portal.html:446 #: templates/pages/structure.html:59 msgid "Отдел" msgstr "Відділ" @@ -103,319 +119,351 @@ msgstr "" msgid "— Выберите офис или склад —" msgstr "" -#: apps/employees/admin.py:50 apps/employees/models/base.py:106 +#: apps/employees/admin.py:50 apps/employees/models/base.py:107 msgid "Локация (офис/склад)" msgstr "" -#: apps/employees/admin.py:51 apps/employees/models/base.py:107 +#: apps/employees/admin.py:51 apps/employees/models/base.py:108 msgid "Заполняется для location_type=office или warehouse" msgstr "" -#: apps/employees/admin.py:118 core/admin.py:259 +#: apps/employees/admin.py:133 core/admin.py:259 msgid "Аутентификация" msgstr "" -#: apps/employees/admin.py:122 +#: apps/employees/admin.py:137 msgid "ФИО" msgstr "" -#: apps/employees/admin.py:126 +#: apps/employees/admin.py:141 msgid "Рабочая информация" msgstr "" -#: apps/employees/admin.py:134 apps/it_manager/admin.py:307 +#: apps/employees/admin.py:149 apps/it_manager/admin.py:307 msgid "Даты" msgstr "" -#: apps/employees/admin.py:138 templates/pages/employee-detail.html:119 +#: apps/employees/admin.py:153 templates/pages/employee-detail.html:126 msgid "Личные данные" msgstr "Особисті дані" -#: apps/employees/admin.py:142 apps/it_manager/admin.py:421 -#: apps/locations/admin.py:291 templates/pages/employee-detail.html:60 -#: templates/pages/pharmacy-detail.html:104 +#: apps/employees/admin.py:157 apps/it_manager/admin.py:421 +#: apps/locations/admin.py:291 templates/pages/employee-detail.html:67 +#: templates/pages/pharmacy-detail.html:106 msgid "Контакты" msgstr "Контакти" -#: apps/employees/admin.py:158 +#: apps/employees/admin.py:173 msgid "Графік та відвідуваність" msgstr "" -#: apps/employees/admin.py:161 +#: apps/employees/admin.py:176 msgid "Графіки роботи та записи відвідуваності відображаються нижче." msgstr "" -#: apps/employees/admin.py:169 +#: apps/employees/admin.py:184 msgid "Системный доступ" msgstr "" -#: apps/employees/admin.py:173 +#: apps/employees/admin.py:188 msgid "Только для IT-администраторов. is_staff — вход в Django admin." msgstr "" -#: apps/employees/admin.py:217 +#: apps/employees/admin.py:232 msgid "Предпросмотр" msgstr "" -#: apps/employees/admin.py:224 +#: apps/employees/admin.py:239 msgid "Группы" msgstr "" -#: apps/employees/models/base.py:33 core/models/connector_config.py:28 +#: apps/employees/models/base.py:34 core/models/connector_config.py:29 +#: osc/apps/employees/models.py:33 msgid "Логин" msgstr "" -#: apps/employees/models/base.py:34 +#: apps/employees/models/base.py:35 msgid "Уникальный логин для входа в систему" msgstr "" -#: apps/employees/models/base.py:37 +#: apps/employees/models/base.py:38 osc/apps/employees/models.py:37 msgid "Email адрес" msgstr "" -#: apps/employees/models/base.py:38 +#: apps/employees/models/base.py:39 osc/apps/employees/models.py:38 msgid "Рабочий email. Если не указан — генерируется из username@local.domain" msgstr "" -#: apps/employees/models/base.py:41 +#: apps/employees/models/base.py:42 osc/apps/employees/models.py:41 msgid "Фамилия" msgstr "" -#: apps/employees/models/base.py:42 templates/pages/profile.html:76 +#: apps/employees/models/base.py:43 osc/apps/employees/models.py:42 +#: templates/pages/profile.html:76 msgid "Имя" msgstr "Ім'я" -#: apps/employees/models/base.py:43 templates/pages/hr-portal.html:430 +#: apps/employees/models/base.py:44 osc/apps/employees/models.py:43 +#: templates/pages/hr-portal.html:430 msgid "Отчество" msgstr "По батькові" -#: apps/employees/models/base.py:45 +#: apps/employees/models/base.py:46 osc/apps/employees/models.py:46 msgid "Доступ к панели администратора" msgstr "" -#: apps/employees/models/base.py:46 +#: apps/employees/models/base.py:47 osc/apps/employees/models.py:47 msgid "Разрешает вход в Django admin. Только для IT-администраторов системы." msgstr "" -#: apps/employees/models/base.py:47 core/models/directories.py:29 -#: core/models/directories.py:121 templates/pages/employee-detail.html:38 +#: apps/employees/models/base.py:48 core/models/directories.py:29 +#: core/models/directories.py:121 templates/pages/employee-detail.html:45 #: templates/pages/employees.html:148 templates/pages/hr-portal.html:174 #: templates/pages/structure.html:89 msgid "Активный" msgstr "Активний" -#: apps/employees/models/base.py:48 +#: apps/employees/models/base.py:49 osc/apps/employees/models.py:49 msgid "Работает ли сотрудник сейчас" msgstr "" -#: apps/employees/models/base.py:49 +#: apps/employees/models/base.py:50 osc/apps/employees/models.py:50 msgid "Дата создания аккаунта" msgstr "" -#: apps/employees/models/base.py:52 templates/pages/employee-detail.html:122 +#: apps/employees/models/base.py:53 osc/apps/employees/models.py:52 +#: templates/pages/employee-detail.html:129 msgid "Дата рождения" msgstr "Дата народження" -#: apps/employees/models/base.py:56 templates/pages/employee-detail.html:126 +#: apps/employees/models/base.py:57 osc/apps/employees/models.py:54 +#: templates/pages/employee-detail.html:133 msgid "ИНН" msgstr "ІПН" -#: apps/employees/models/base.py:57 +#: apps/employees/models/base.py:58 osc/apps/employees/models.py:55 msgid "Идентификационный номер налогоплательщика" msgstr "" -#: apps/employees/models/base.py:62 templates/pages/employee-detail.html:67 -#: templates/pages/profile.html:57 +#: apps/employees/models/base.py:63 osc/apps/employees/models.py:59 +#: templates/pages/employee-detail.html:74 templates/pages/profile.html:57 msgid "Рабочий телефон" msgstr "Робочий телефон" -#: apps/employees/models/base.py:66 +#: apps/employees/models/base.py:67 msgid "Внутрішній номер" msgstr "" -#: apps/employees/models/base.py:67 +#: apps/employees/models/base.py:68 msgid "Короткий внутрішній (додатковий) номер АТС" msgstr "" -#: apps/employees/models/base.py:70 templates/pages/employee-detail.html:76 -#: templates/pages/profile.html:61 +#: apps/employees/models/base.py:71 osc/apps/employees/models.py:60 +#: templates/pages/employee-detail.html:83 templates/pages/profile.html:61 msgid "Личный телефон" msgstr "Особистий телефон" -#: apps/employees/models/base.py:73 templates/pages/employee-detail.html:80 -#: templates/pages/profile.html:65 +#: apps/employees/models/base.py:74 osc/apps/employees/models.py:61 +#: templates/pages/employee-detail.html:87 templates/pages/profile.html:65 msgid "Личный email" msgstr "Особистий email" -#: apps/employees/models/base.py:75 +#: apps/employees/models/base.py:76 osc/apps/employees/models.py:63 msgid "Контакт в экстренных случаях" msgstr "" -#: apps/employees/models/base.py:76 +#: apps/employees/models/base.py:77 osc/apps/employees/models.py:65 msgid "Телефон экстренного контакта" msgstr "" -#: apps/employees/models/base.py:78 templates/pages/profile.html:84 +#: apps/employees/models/base.py:79 osc/apps/employees/models.py:67 +#: templates/pages/profile.html:84 msgid "Степень родства" msgstr "Ступінь спорідненості" -#: apps/employees/models/base.py:81 apps/employees/models/base.py:100 +#: apps/employees/models/base.py:82 apps/employees/models/base.py:101 #: apps/hiring/models.py:34 apps/hiring/models.py:50 #: apps/locations/admin.py:347 apps/locations/models/base.py:29 #: apps/locations/models/pharmacies.py:210 #: apps/locations/models/pharmacies.py:349 apps/mail_connector/models.py:12 -#: apps/utilities/models.py:17 templates/pages/dislocation.html:116 -#: templates/pages/employees.html:64 templates/pages/employees.html:90 -#: templates/pages/hr-portal.html:126 templates/pages/hr-portal.html:441 -#: templates/pages/hr-portal.html:455 templates/pages/hr-portal.html:459 +#: apps/nextcloud_connector/models.py:17 apps/utilities/models.py:17 +#: templates/pages/dislocation.html:116 templates/pages/employees.html:64 +#: templates/pages/employees.html:90 templates/pages/hr-portal.html:126 +#: templates/pages/hr-portal.html:441 templates/pages/hr-portal.html:455 +#: templates/pages/hr-portal.html:459 msgid "Аптека" msgstr "Аптека" -#: apps/employees/models/base.py:82 apps/hiring/models.py:35 +#: apps/employees/models/base.py:83 apps/hiring/models.py:35 #: apps/locations/models/base.py:30 templates/pages/hr-portal.html:128 #: templates/pages/hr-portal.html:442 msgid "Склад" msgstr "Склад" -#: apps/employees/models/base.py:83 apps/locations/models/base.py:31 +#: apps/employees/models/base.py:84 apps/locations/models/base.py:31 #: templates/pages/employees.html:56 templates/pages/hr-portal.html:124 #: templates/pages/hr-portal.html:440 templates/pages/timetrack.html:47 msgid "Офис" msgstr "Офіс" -#: apps/employees/models/base.py:86 apps/locations/models/base.py:28 +#: apps/employees/models/base.py:87 apps/locations/models/base.py:28 msgid "Тип локации" msgstr "" -#: apps/employees/models/base.py:87 +#: apps/employees/models/base.py:88 msgid "Где работает: аптека / склад / офис" msgstr "" -#: apps/employees/models/base.py:94 apps/locations/models/pharmacies.py:88 +#: apps/employees/models/base.py:95 apps/locations/models/pharmacies.py:88 #: templates/pages/dislocation.html:117 templates/pages/pharmacies.html:113 -#: templates/pages/pharmacy-detail.html:85 +#: templates/pages/pharmacy-detail.html:87 msgid "Организация" msgstr "Організація" -#: apps/employees/models/base.py:95 apps/locations/models/pharmacies.py:89 +#: apps/employees/models/base.py:96 apps/locations/models/pharmacies.py:89 msgid "Юрлицо: АКС, АКС Одесса, Тира, Пентальфа..." msgstr "" -#: apps/employees/models/base.py:101 +#: apps/employees/models/base.py:102 msgid "Заполняется только для location_type=pharmacy" msgstr "" -#: apps/employees/models/base.py:114 +#: apps/employees/models/base.py:115 msgid "Заполняется для office / warehouse" msgstr "" -#: apps/employees/models/base.py:119 templates/pages/dislocation.html:297 -#: templates/pages/employees.html:104 templates/pages/hr-portal.html:216 -#: templates/pages/hr-portal.html:467 +#: apps/employees/models/base.py:120 osc/apps/employees/models.py:77 +#: templates/pages/dislocation.html:297 templates/pages/employees.html:104 +#: templates/pages/hr-portal.html:216 templates/pages/hr-portal.html:467 msgid "Должность" msgstr "Посада" -#: apps/employees/models/base.py:125 templates/pages/employee-detail.html:92 -#: templates/pages/structure.html:60 +#: apps/employees/models/base.py:126 osc/apps/employees/models.py:81 +#: templates/pages/employee-detail.html:99 templates/pages/structure.html:60 msgid "Руководитель" msgstr "Керівник" -#: apps/employees/models/base.py:128 +#: apps/employees/models/base.py:129 osc/apps/employees/models.py:84 msgid "Дата приёма на работу" msgstr "" -#: apps/employees/models/base.py:129 templates/pages/employee-detail.html:109 +#: apps/employees/models/base.py:130 osc/apps/employees/models.py:85 +#: templates/pages/employee-detail.html:116 msgid "Дата увольнения" msgstr "Дата звільнення" -#: apps/employees/models/base.py:130 +#: apps/employees/models/base.py:131 osc/apps/employees/models.py:86 msgid "Конец испытательного срока" msgstr "" -#: apps/employees/models/base.py:133 apps/visit_manager/admin.py:262 -#: apps/visit_manager/admin.py:289 templates/pages/hr-portal.html:165 -#: templates/pages/hr-portal.html:234 +#: apps/employees/models/base.py:134 apps/visit_manager/admin.py:262 +#: apps/visit_manager/admin.py:289 osc/apps/employees/models.py:88 +#: templates/pages/hr-portal.html:165 templates/pages/hr-portal.html:234 msgid "Фото" msgstr "Фото" -#: apps/employees/models/base.py:137 +#: apps/employees/models/base.py:138 osc/apps/employees/models.py:90 msgid "ID Mattermost" msgstr "" -#: apps/employees/models/base.py:138 +#: apps/employees/models/base.py:139 osc/apps/employees/models.py:91 msgid "Логин Mattermost" msgstr "" -#: apps/employees/models/base.py:140 +#: apps/employees/models/base.py:141 osc/apps/employees/models.py:93 msgid "Статус синхронизации Mattermost" msgstr "" -#: apps/employees/models/base.py:142 apps/tasks/models.py:24 -#: templates/pages/employee-detail.html:148 templates/pages/task-detail.html:25 -#: templates/pages/tasks.html:64 templates/pages/tasks.html:116 +#: apps/employees/models/base.py:143 apps/tasks/models.py:24 +#: osc/apps/employees/models.py:95 templates/pages/employee-detail.html:155 +#: templates/pages/task-detail.html:25 templates/pages/tasks.html:64 +#: templates/pages/tasks.html:116 msgid "Ожидает" msgstr "Очікує" -#: apps/employees/models/base.py:143 apps/employees/models/base.py:158 -#: apps/locations/models/pharmacies.py:151 +#: apps/employees/models/base.py:144 apps/employees/models/base.py:159 +#: apps/locations/models/pharmacies.py:151 osc/apps/employees/models.py:96 +#: osc/apps/employees/models.py:114 msgid "Синхронизирован" msgstr "" -#: apps/employees/models/base.py:145 apps/employees/models/base.py:160 +#: apps/employees/models/base.py:146 apps/employees/models/base.py:161 +#: osc/apps/employees/models.py:98 osc/apps/employees/models.py:116 msgid "Отключена" msgstr "" -#: apps/employees/models/base.py:149 +#: apps/employees/models/base.py:150 osc/apps/employees/models.py:102 msgid "Последняя синхронизация Mattermost" msgstr "" -#: apps/employees/models/base.py:150 +#: apps/employees/models/base.py:151 osc/apps/employees/models.py:103 msgid "Синхронизация Mattermost" msgstr "" -#: apps/employees/models/base.py:155 +#: apps/employees/models/base.py:156 osc/apps/employees/models.py:111 msgid "Статус синхронизации AD" msgstr "" -#: apps/employees/models/base.py:157 +#: apps/employees/models/base.py:158 osc/apps/employees/models.py:113 msgid "Не синхронизирован" msgstr "" -#: apps/employees/models/base.py:164 +#: apps/employees/models/base.py:165 osc/apps/employees/models.py:120 msgid "Ошибка синхронизации AD" msgstr "" -#: apps/employees/models/base.py:165 +#: apps/employees/models/base.py:166 osc/apps/employees/models.py:121 msgid "Последняя синхронизация AD" msgstr "" -#: apps/employees/models/base.py:166 +#: apps/employees/models/base.py:167 osc/apps/employees/models.py:122 msgid "Синхронизация AD" msgstr "" -#: apps/employees/models/base.py:167 +#: apps/employees/models/base.py:168 msgid "Только для офисных сотрудников" msgstr "" -#: apps/employees/models/base.py:170 +#: apps/employees/models/base.py:171 msgid "Записей на странице" msgstr "" -#: apps/employees/models/base.py:172 +#: apps/employees/models/base.py:173 msgid "Сколько строк показывать в таблицах портала по умолчанию" msgstr "" -#: apps/employees/models/base.py:176 +#: apps/employees/models/base.py:177 msgid "Был онлайн" msgstr "" -#: apps/employees/models/base.py:177 +#: apps/employees/models/base.py:178 msgid "Обновляется автоматически при активности в портале (не в AD/Mattermost)" msgstr "" -#: apps/employees/models/base.py:187 templates/index.html:250 -#: templates/pages/dashboard.html:174 templates/pages/employees.html:8 -#: templates/pages/employees.html:24 templates/pages/hr-portal.html:92 +#: apps/employees/models/base.py:183 +msgid "TOTP-секрет" +msgstr "" + +#: apps/employees/models/base.py:184 +msgid "Секрет TOTP (шифруется). Заполняется при настройке 2FA." +msgstr "" + +#: apps/employees/models/base.py:186 +msgid "2FA включена" +msgstr "" + +#: apps/employees/models/base.py:188 +msgid "Резервные коды 2FA (хеши)" +msgstr "" + +#: apps/employees/models/base.py:189 +msgid "Хеши одноразовых резервных кодов; использованный код удаляется." +msgstr "" + +#: apps/employees/models/base.py:199 osc/apps/employees/models.py:131 +#: templates/index.html:251 templates/pages/dashboard.html:174 +#: templates/pages/employees.html:8 templates/pages/employees.html:24 +#: templates/pages/hr-portal.html:92 msgid "Сотрудники" msgstr "Працівники" @@ -469,12 +517,13 @@ msgid "Действует с" msgstr "" #: apps/employees/models/permissions.py:57 -#: templates/pages/pharmacy-detail.html:246 +#: templates/pages/pharmacy-detail.html:248 msgid "Действует до" msgstr "Діє до" #: apps/employees/models/permissions.py:58 -#: apps/locations/models/pharmacies.py:334 +#: apps/locations/models/pharmacies.py:334 osc/apps/employees/models.py:49 +#: osc/core/models/directory.py:32 msgid "Активен" msgstr "" @@ -536,9 +585,7 @@ msgid "ID повідомлень в Mattermost" msgstr "" #: apps/feed/models.py:52 -msgid "" -"{team_name: post_id} — за наявності id повторна публікація редагує існуюче " -"повідомлення" +msgid "{team_name: post_id} — за наявності id повторна публікація редагує існуюче повідомлення" msgstr "" #: apps/feed/models.py:55 @@ -546,9 +593,7 @@ msgid "Куди публікувати в Mattermost" msgstr "" #: apps/feed/models.py:56 -msgid "" -"Список команд (akc/pharmacys/warehouse) — обирається чекбоксами при " -"створенні/редагуванні" +msgid "Список команд (akc/pharmacys/warehouse) — обирається чекбоксами при створенні/редагуванні" msgstr "" #: apps/feed/models.py:61 apps/feed/models.py:100 apps/tasks/models.py:126 @@ -700,7 +745,7 @@ msgid "Экземпляров" msgstr "" #: apps/it_manager/admin.py:110 templates/pages/it-manager.html:13 -#: templates/pages/it-manager.html:514 templates/pages/pharmacy-detail.html:193 +#: templates/pages/it-manager.html:514 templates/pages/pharmacy-detail.html:195 msgid "Оборудование" msgstr "Обладнання" @@ -715,9 +760,9 @@ msgstr "" #: apps/it_manager/admin.py:119 apps/it_manager/admin.py:212 #: apps/it_manager/admin.py:427 apps/it_manager/admin.py:476 #: apps/locations/admin.py:319 apps/locations/models/pharmacies.py:335 -#: core/models/connector_config.py:43 templates/pages/it-manager.html:674 +#: core/models/connector_config.py:44 templates/pages/it-manager.html:674 #: templates/pages/it-manager.html:845 templates/pages/it-manager.html:950 -#: templates/pages/pharmacy-detail.html:96 +#: templates/pages/pharmacy-detail.html:98 msgid "Примечания" msgstr "Примітки" @@ -731,7 +776,7 @@ msgstr "" msgid "Модель" msgstr "Модель" -#: apps/it_manager/admin.py:180 templates/pages/pharmacy-detail.html:197 +#: apps/it_manager/admin.py:180 templates/pages/pharmacy-detail.html:199 msgid "Гарантия" msgstr "Гарантія" @@ -781,7 +826,8 @@ msgstr "Взяти в роботу" msgid "Отметить решёнными" msgstr "" -#: apps/it_manager/admin.py:383 templates/pages/it-manager.html:75 +#: apps/it_manager/admin.py:383 templates/pages/chat.html:88 +#: templates/pages/chat.html:112 templates/pages/it-manager.html:75 #: templates/pages/it-manager.html:135 templates/pages/it-manager.html:480 #: templates/pages/it-manager.html:614 templates/pages/it-manager.html:815 #: templates/pages/it-manager.html:865 templates/pages/it-manager.html:1048 @@ -820,7 +866,7 @@ msgstr "IP-адреси" msgid "Услуга" msgstr "" -#: apps/it_manager/admin.py:508 templates/pages/pharmacy-detail.html:243 +#: apps/it_manager/admin.py:508 templates/pages/pharmacy-detail.html:245 msgid "Технология" msgstr "Технологія" @@ -832,7 +878,7 @@ msgstr "Закінчення" msgid "Статические IP" msgstr "" -#: apps/it_manager/admin.py:608 templates/pages/employee-detail.html:89 +#: apps/it_manager/admin.py:608 templates/pages/employee-detail.html:96 msgid "Работа" msgstr "Робота" @@ -885,12 +931,12 @@ msgstr "" #: apps/locations/admin.py:99 apps/locations/admin.py:282 #: templates/pages/employees.html:106 templates/pages/pharmacies.html:114 -#: templates/pages/pharmacy-detail.html:87 +#: templates/pages/pharmacy-detail.html:89 msgid "Адрес" msgstr "Адреса" #: apps/locations/admin.py:102 apps/locations/admin.py:139 -#: apps/locations/admin.py:354 templates/pages/pharmacy-detail.html:155 +#: apps/locations/admin.py:354 templates/pages/pharmacy-detail.html:157 msgid "Координаты" msgstr "Координати" @@ -941,12 +987,10 @@ msgid "Почта Carbonio" msgstr "" #: apps/locations/admin.py:316 -msgid "" -"Пусто в «Почта Carbonio» — адрес сгенерируется как <префикс " -"организации><номер>@домен. Можно задать вручную." +msgid "Пусто в «Почта Carbonio» — адрес сгенерируется как <префикс организации><номер>@домен. Можно задать вручную." msgstr "" -#: apps/locations/admin.py:376 core/views.py:350 +#: apps/locations/admin.py:376 core/views.py:352 #: templates/pages/structure.html:61 msgid "Сотрудников" msgstr "" @@ -1041,7 +1085,7 @@ msgid "Заведующий аптекой" msgstr "" #: apps/locations/models/pharmacies.py:113 -#: templates/pages/pharmacy-detail.html:90 +#: templates/pages/pharmacy-detail.html:92 msgid "Ответственный менеджер" msgstr "Відповідальний менеджер" @@ -1050,7 +1094,7 @@ msgid "Сотрудник с должностью «Відповідальний msgstr "" #: apps/locations/models/pharmacies.py:119 -#: templates/pages/pharmacy-detail.html:91 +#: templates/pages/pharmacy-detail.html:93 msgid "Куратор" msgstr "Куратор" @@ -1098,9 +1142,7 @@ msgid "Отключён" msgstr "" #: apps/locations/models/pharmacies.py:157 -msgid "" -"Ящик аптеки. Пусто — сгенерируется как <префикс организации><номер>@домен. " -"Можно задать вручную." +msgid "Ящик аптеки. Пусто — сгенерируется как <префикс организации><номер>@домен. Можно задать вручную." msgstr "" #: apps/locations/models/pharmacies.py:160 @@ -1135,7 +1177,7 @@ msgstr "" msgid "Ошибка синхронизации Carbonio" msgstr "" -#: apps/locations/models/pharmacies.py:211 templates/index.html:381 +#: apps/locations/models/pharmacies.py:211 templates/index.html:382 #: templates/pages/dislocation.html:16 templates/pages/pharmacies.html:6 #: templates/pages/timetrack.html:49 msgid "Аптеки" @@ -1146,7 +1188,7 @@ msgid "Такой адрес Carbonio уже используется друго msgstr "" #: apps/locations/models/pharmacies.py:325 -#: templates/pages/pharmacy-detail.html:111 +#: templates/pages/pharmacy-detail.html:113 msgid "Основной" msgstr "Основний" @@ -1202,6 +1244,46 @@ msgstr "" msgid "Журнал синхронизации Carbonio" msgstr "" +#: apps/nextcloud_connector/models.py:20 +msgid "Создание папки" +msgstr "" + +#: apps/nextcloud_connector/models.py:21 +msgid "Обновление ACL" +msgstr "" + +#: apps/nextcloud_connector/models.py:22 +msgid "Пропуск" +msgstr "" + +#: apps/nextcloud_connector/models.py:27 +msgid "Пробный прогон" +msgstr "" + +#: apps/nextcloud_connector/models.py:30 +msgid "Тип сущности" +msgstr "" + +#: apps/nextcloud_connector/models.py:31 +msgid "Ссылка на сущность" +msgstr "" + +#: apps/nextcloud_connector/models.py:32 +msgid "Код отдела или номер аптеки" +msgstr "" + +#: apps/nextcloud_connector/models.py:33 +msgid "Путь Group Folder" +msgstr "" + +#: apps/nextcloud_connector/models.py:39 +msgid "Запись синхронизации Nextcloud" +msgstr "" + +#: apps/nextcloud_connector/models.py:40 +msgid "Журнал синхронизации Nextcloud" +msgstr "" + #: apps/tasks/models.py:25 templates/pages/it-manager.html:322 #: templates/pages/it-manager.html:374 templates/pages/task-detail.html:21 #: templates/pages/tasks.html:68 templates/pages/tasks.html:108 @@ -1295,7 +1377,7 @@ msgstr "" msgid "Відмітив" msgstr "" -#: apps/tasks/models.py:153 +#: apps/tasks/models.py:153 osc/core/models/directory.py:33 msgid "Порядок" msgstr "" @@ -1454,7 +1536,8 @@ msgid "Повна зміна" msgstr "" #: core/admin.py:20 core/models/directories.py:54 -#: core/models/directories.py:116 +#: core/models/directories.py:116 osc/core/models/directory.py:12 +#: osc/core/models/directory.py:23 msgid "Тип справочника" msgstr "" @@ -1485,7 +1568,7 @@ msgid "Записей" msgstr "" #: core/admin.py:144 templates/pages/pharmacy-detail.html:67 -#: templates/pages/pharmacy-detail.html:83 +#: templates/pages/pharmacy-detail.html:85 msgid "Основная информация" msgstr "Основна інформація" @@ -1506,6 +1589,7 @@ msgid "Дерево справочников перестроено" msgstr "" #: core/admin.py:195 core/models/directories.py:119 +#: osc/core/models/directory.py:9 osc/core/models/directory.py:26 #: templates/pages/it-manager.html:821 msgid "Название" msgstr "Назва" @@ -1522,7 +1606,7 @@ msgstr "" msgid "Укажите токен или логин/пароль — в зависимости от типа коннектора" msgstr "" -#: core/admin.py:263 core/models/connector_config.py:39 +#: core/admin.py:263 core/models/connector_config.py:40 msgid "Дополнительные параметры" msgstr "" @@ -1530,55 +1614,57 @@ msgstr "" msgid "Коннектор" msgstr "" -#: core/models/connector_config.py:17 +#: core/models/connector_config.py:18 msgid "Тип коннектора" msgstr "" -#: core/models/connector_config.py:20 +#: core/models/connector_config.py:21 msgid "Включён" msgstr "" -#: core/models/connector_config.py:23 +#: core/models/connector_config.py:24 msgid "Хост" msgstr "" -#: core/models/connector_config.py:24 +#: core/models/connector_config.py:25 msgid "Порт" msgstr "" -#: core/models/connector_config.py:25 +#: core/models/connector_config.py:26 msgid "Использовать SSL" msgstr "" -#: core/models/connector_config.py:31 +#: core/models/connector_config.py:32 msgid "Пароль" msgstr "" -#: core/models/connector_config.py:33 +#: core/models/connector_config.py:34 msgid "Токен / API Key" msgstr "" -#: core/models/connector_config.py:34 +#: core/models/connector_config.py:35 msgid "Bearer-токен или API-ключ, если используется вместо логина/пароля" msgstr "" -#: core/models/connector_config.py:40 +#: core/models/connector_config.py:41 msgid "Специфичные для коннектора настройки в формате JSON" msgstr "" -#: core/models/connector_config.py:46 +#: core/models/connector_config.py:47 msgid "Настройки коннектора" msgstr "" -#: core/models/connector_config.py:47 +#: core/models/connector_config.py:48 osc/core/models/connector_settings.py:33 +#: osc/core/models/connector_settings.py:34 +#: osc/core/models/connector_settings.py:37 msgid "Настройки коннекторов" msgstr "" -#: core/models/connector_config.py:57 +#: core/models/connector_config.py:58 msgid "Хост обязателен для включённого коннектора" msgstr "" -#: core/models/connector_config.py:60 +#: core/models/connector_config.py:61 msgid "Для включённого коннектора необходимо указать токен или логин" msgstr "" @@ -1614,11 +1700,12 @@ msgstr "" msgid "Только для гибкой и кастомной иерархии" msgstr "" -#: core/models/directories.py:55 +#: core/models/directories.py:55 osc/core/models/directory.py:13 msgid "Типы справочников" msgstr "" -#: core/models/directories.py:118 +#: core/models/directories.py:118 osc/core/models/directory.py:8 +#: osc/core/models/directory.py:25 msgid "Код" msgstr "" @@ -1683,181 +1770,414 @@ msgstr "" msgid "Неверная контрольная сумма ИНН" msgstr "" -#: core/views.py:349 +#: core/views.py:351 msgid "Рабочих дней" msgstr "Робочих днів" -#: core/views.py:349 +#: core/views.py:351 msgid "с отметками" msgstr "з відмітками" -#: core/views.py:350 +#: core/views.py:352 msgid "отмечались" msgstr "відмічались" -#: core/views.py:351 +#: core/views.py:353 msgid "Смен" msgstr "Змін" -#: core/views.py:351 +#: core/views.py:353 msgid "за месяц" msgstr "за місяць" -#: core/views.py:352 templates/pages/timetrack.html:62 +#: core/views.py:354 templates/pages/timetrack.html:62 msgid "Незакрытых" msgstr "Незакритих" -#: core/views.py:352 +#: core/views.py:354 msgid "без ухода" msgstr "без виходу" -#: core/views.py:353 +#: core/views.py:355 msgid "Всего часов" msgstr "Всього годин" -#: core/views.py:353 +#: core/views.py:355 msgid "отработано" msgstr "відпрацьовано" -#: templates/index.html:210 +#: osc/apps/employees/models.py:34 +msgid "Логин для входа, совпадает с учётной записью AD" +msgstr "" + +#: osc/apps/employees/models.py:105 +msgid "Логин AD (sAMAccountName)" +msgstr "" + +#: osc/apps/employees/models.py:107 +msgid "AD User DN" +msgstr "" + +#: osc/apps/employees/models.py:151 +msgid "Не может быть раньше даты приёма" +msgstr "" + +#: osc/apps/employees/models.py:153 +msgid "Сотрудник не может быть своим руководителем" +msgstr "" + +#: osc/apps/mattermost_connector/models.py:23 +msgid "Запись синхронизации Mattermost" +msgstr "" + +#: osc/apps/mattermost_connector/models.py:24 +msgid "Журнал синхронизации Mattermost" +msgstr "" + +#: osc/core/models/connector_settings.py:10 +msgid "Требовать смену пароля при создании" +msgstr "" + +#: osc/core/models/connector_settings.py:12 +msgid "Новым учётным записям в AD выставляется флаг «сменить пароль при следующем входе». Если выключено — выданный пароль действует сразу, без принудительной смены." +msgstr "" + +#: osc/core/models/connector_settings.py:17 +msgid "Пароль не имеет срока действия" +msgstr "" + +#: osc/core/models/connector_settings.py:19 +msgid "Новым и существующим учётным записям в AD выставляется флаг «Password never expires». Если выключено — действует обычная парольная политика домена." +msgstr "" + +#: osc/core/models/connector_settings.py:24 +msgid "Команда Mattermost по умолчанию" +msgstr "" + +#: osc/core/models/connector_settings.py:25 +msgid "Сотрудники автоматически добавляются в эту команду при синхронизации с Mattermost." +msgstr "" + +#: osc/core/models/connector_settings.py:28 +msgid "Каналы по умолчанию" +msgstr "" + +#: osc/core/models/connector_settings.py:29 +msgid "Сотрудники автоматически добавляются в эти каналы при синхронизации с Mattermost." +msgstr "" + +#: osc/core/models/directory.py:29 +msgid "Родительский элемент" +msgstr "" + +#: osc/core/models/directory.py:30 +msgid "Должен принадлежать тому же типу справочника" +msgstr "" + +#: osc/core/models/directory.py:35 +msgid "OU в Active Directory" +msgstr "" + +#: osc/core/models/directory.py:37 +msgid "Используется только для справочника отделов (department): сотрудники этого отдела создаются/переносятся в указанную OU. Например: OU=IT,OU=OL_Users,DC=ol,DC=local. Если не задано — используется AD_USERS_OU." +msgstr "" + +#: osc/core/models/directory.py:44 templates/pages/dashboard.html:163 +msgid "Справочник" +msgstr "Довідник" + +#: osc/core/models/directory.py:45 +msgid "Справочники" +msgstr "" + +#: osc/core/models/directory.py:56 +msgid "Элемент не может быть родителем самому себе" +msgstr "" + +#: osc/core/models/directory.py:58 +msgid "Родитель должен принадлежать тому же типу справочника" +msgstr "" + +#: osc/core/models/directory.py:62 +msgid "Циклическая вложенность недопустима" +msgstr "" + +#: osc/core/models/site_settings.py:9 +msgid "Название портала" +msgstr "" + +#: osc/core/models/site_settings.py:10 +msgid "Логотип" +msgstr "" + +#: osc/core/models/site_settings.py:13 osc/core/models/site_settings.py:14 +#: osc/core/models/site_settings.py:17 +msgid "Настройки сайта" +msgstr "" + +#: osc/core/utils/validators.py:16 +msgid "Введите корректный украинский номер телефона, например +380501234567" +msgstr "" + +#: osc/core/utils/validators.py:24 +msgid "Дата рождения должна быть в прошлом" +msgstr "" + +#: osc/core/utils/validators.py:27 +msgid "Сотруднику должно быть не менее 16 лет" +msgstr "" + +#: osc/core/utils/validators.py:29 +msgid "Проверьте дату рождения — возраст превышает 100 лет" +msgstr "" + +#: osc/core/utils/validators.py:35 +msgid "ИНН должен состоять из 10 цифр" +msgstr "" + +#: osc/core/utils/validators.py:38 +msgid "Некорректный ИНН: неверная контрольная сумма" +msgstr "" + +#: osc/templates/admin/employees/employee/delete_confirmation.html:10 +#, python-format +msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:" +msgstr "" + +#: osc/templates/admin/employees/employee/delete_confirmation.html:17 +msgid "Objects" +msgstr "" + +#: templates/index.html:211 msgid "Сеть аптек" msgstr "Мережа аптек" -#: templates/index.html:211 +#: templates/index.html:212 msgid "Портал пользователя" msgstr "Портал користувача" -#: templates/index.html:220 +#: templates/index.html:221 msgid "Главное меню" msgstr "Головне меню" -#: templates/index.html:229 templates/index.html:650 +#: templates/index.html:230 templates/index.html:654 msgid "Главная" msgstr "Головна" -#: templates/index.html:239 templates/pages/news.html:6 +#: templates/index.html:240 templates/pages/news.html:6 msgid "Новости" msgstr "Новини" -#: templates/index.html:260 templates/index.html:660 +#: templates/index.html:261 templates/index.html:664 #: templates/pages/dashboard.html:145 templates/pages/task-detail.html:10 msgid "Задачи" msgstr "Задачі" -#: templates/index.html:268 templates/pages/dislocation.html:8 +#: templates/index.html:269 templates/pages/dislocation.html:8 msgid "Дислокация" msgstr "Дислокація" -#: templates/index.html:277 templates/pages/dashboard.html:135 +#: templates/index.html:278 templates/pages/dashboard.html:135 +#: templates/pages/documents.html:5 templates/pages/pharmacy-detail.html:75 msgid "Документы" msgstr "Документи" -#: templates/index.html:287 templates/pages/dashboard.html:125 +#: templates/index.html:288 templates/pages/dashboard.html:125 msgid "Электронная почта" msgstr "Електронна пошта" -#: templates/index.html:296 templates/index.html:680 +#: templates/index.html:297 templates/index.html:684 +#: templates/pages/chat.html:5 msgid "Чат" msgstr "Чат" -#: templates/index.html:305 templates/pages/dashboard.html:154 +#: templates/index.html:306 templates/pages/dashboard.html:154 msgid "Календарь" msgstr "Календар" -#: templates/index.html:314 +#: templates/index.html:315 msgid "Базы данных" msgstr "Бази даних" -#: templates/index.html:323 +#: templates/index.html:324 msgid "Отчёты" msgstr "Звіти" -#: templates/index.html:333 +#: templates/index.html:334 msgid "Закупки" msgstr "Закупівлі" -#: templates/index.html:342 templates/pages/dashboard.html:183 +#: templates/index.html:343 templates/pages/dashboard.html:183 msgid "HR портал" msgstr "HR портал" -#: templates/index.html:352 templates/index.html:611 +#: templates/index.html:353 templates/index.html:612 #: templates/pages/settings.html:5 msgid "Настройки" msgstr "Налаштування" -#: templates/index.html:360 +#: templates/index.html:361 msgid "Управление" msgstr "Управління" -#: templates/index.html:371 templates/pages/structure.html:7 +#: templates/index.html:372 templates/pages/structure.html:7 msgid "Структура" msgstr "Структура" -#: templates/index.html:390 +#: templates/index.html:391 msgid "Коммунальные услуги" msgstr "Комунальні послуги" -#: templates/index.html:401 +#: templates/index.html:402 msgid "Рекрутинг" msgstr "Рекрутинг" -#: templates/index.html:410 templates/pages/hr-portal.html:292 +#: templates/index.html:411 templates/pages/hr-portal.html:292 #: templates/pages/timetrack.html:7 msgid "Учёт рабочего времени" msgstr "Облік робочого часу" -#: templates/index.html:418 +#: templates/index.html:419 msgid "Поддержка" msgstr "Підтримка" -#: templates/index.html:428 templates/pages/hr-portal.html:284 +#: templates/index.html:429 templates/pages/hr-portal.html:284 msgid "Справка" msgstr "Довідка" -#: templates/index.html:438 templates/pages/dashboard.html:193 +#: templates/index.html:439 templates/pages/dashboard.html:193 msgid "Поддержка IT" msgstr "Підтримка IT" -#: templates/index.html:448 templates/pages/it-manager.html:6 +#: templates/index.html:449 templates/pages/it-manager.html:6 msgid "IT-отдел" msgstr "IT-відділ" -#: templates/index.html:460 +#: templates/index.html:461 msgid "Active Directory" msgstr "Active Directory" -#: templates/index.html:494 templates/pages/employees.html:32 +#: templates/index.html:495 templates/pages/employees.html:32 msgid "Поиск..." msgstr "Пошук..." -#: templates/index.html:511 +#: templates/index.html:512 msgid "Язык" msgstr "Мова" -#: templates/index.html:607 templates/pages/hr-portal.html:199 +#: templates/index.html:608 templates/pages/hr-portal.html:199 msgid "Профиль" msgstr "Профіль" -#: templates/index.html:615 +#: templates/index.html:616 msgid "Помощь" msgstr "Допомога" -#: templates/index.html:620 +#: templates/index.html:623 msgid "Выход" msgstr "Вихід" -#: templates/index.html:633 +#: templates/index.html:637 msgid "Загрузка..." msgstr "Завантаження..." -#: templates/index.html:671 +#: templates/index.html:675 msgid "Люди" msgstr "" -#: templates/index.html:687 +#: templates/index.html:691 msgid "Меню" msgstr "" +#: templates/pages/chat.html:6 +msgid "Внутренний корпоративный мессенджер (Mattermost)" +msgstr "Внутрішній корпоративний месенджер (Mattermost)" + +#: templates/pages/chat.html:15 +msgid "Поиск по всем сообщениям..." +msgstr "Пошук по всіх повідомленнях..." + +#: templates/pages/chat.html:17 +msgid "Искать" +msgstr "Шукати" + +#: templates/pages/chat.html:31 +msgid "Личные сообщения" +msgstr "Особисті повідомлення" + +#: templates/pages/chat.html:32 templates/pages/chat.html:111 +msgid "Новое сообщение" +msgstr "Нове повідомлення" + +#: templates/pages/chat.html:37 templates/pages/chat.html:44 +#: templates/pages/documents.html:24 templates/pages/pharmacy-detail.html:337 +msgid "Загрузка…" +msgstr "Завантаження…" + +#: templates/pages/chat.html:41 +msgid "Каналы" +msgstr "Канали" + +#: templates/pages/chat.html:51 +msgid "Показывать закрытые разговоры" +msgstr "Показувати закриті розмови" + +#: templates/pages/chat.html:59 +msgid "Выберите канал слева" +msgstr "Оберіть канал зліва" + +#: templates/pages/chat.html:69 templates/pages/chat.html:96 +msgid "Прикрепить файл" +msgstr "Прикріпити файл" + +#: templates/pages/chat.html:72 +msgid "Написать сообщение..." +msgstr "Написати повідомлення..." + +#: templates/pages/chat.html:87 +msgid "Обсуждение" +msgstr "Обговорення" + +#: templates/pages/chat.html:99 +msgid "Ответить в обсуждении..." +msgstr "Відповісти в обговоренні..." + +#: templates/pages/chat.html:117 +msgid "Поиск коллег..." +msgstr "Пошук колег..." + +#: templates/pages/chat.html:119 +msgid "Начать разговор" +msgstr "Почати розмову" + +#: templates/pages/chat.html:130 +msgid "Ваша учётная запись ещё не синхронизирована с Mattermost" +msgstr "Ваш акаунт ще не синхронізовано з Mattermost" + +#: templates/pages/chat.html:132 +msgid "Нажмите кнопку ниже, чтобы создать или привязать вашу учётную запись в Mattermost." +msgstr "Натисніть кнопку нижче, щоб створити або прив'язати ваш акаунт у Mattermost." + +#: templates/pages/chat.html:135 +msgid "Синхронизировать сейчас" +msgstr "Синхронізувати зараз" + +#: templates/pages/chat.html:144 +msgid "Не удалось получить доступ к Mattermost" +msgstr "Не вдалося отримати доступ до Mattermost" + +#: templates/pages/chat.html:146 +msgid "Обратитесь в IT-отдел — возможно, отключена выдача Personal Access Token на сервере Mattermost." +msgstr "Зверніться до IT-відділу — можливо, вимкнено видачу Personal Access Token на сервері Mattermost." + +#: templates/pages/chat.html:155 +msgid "Чат ещё не подключён" +msgstr "Чат ще не підключено" + +#: templates/pages/chat.html:157 +msgid "Укажите публичный URL Mattermost (поле public_url в «Дополнительные параметры» коннектора Mattermost в админке) — и он появится здесь." +msgstr "Вкажіть публічну URL-адресу Mattermost (поле public_url у «Додаткові параметри» коннектора Mattermost в адмінці) — і він з'явиться тут." + #: templates/pages/dashboard.html:7 msgid "Добрый день" msgstr "Доброго дня" @@ -1943,10 +2263,6 @@ msgstr "Швидкий доступ" msgid "Полезные ссылки и инструменты" msgstr "Корисні посилання та інструменти" -#: templates/pages/dashboard.html:163 -msgid "Справочник" -msgstr "Довідник" - #: templates/pages/dislocation.html:3 msgid "адрес не указан" msgstr "адресу не вказано" @@ -2040,7 +2356,7 @@ msgstr "Карта" #: templates/pages/dislocation.html:118 templates/pages/pharmacies.html:115 #: templates/pages/pharmacy-detail.html:49 -#: templates/pages/pharmacy-detail.html:139 +#: templates/pages/pharmacy-detail.html:141 msgid "Заведующий" msgstr "Завідуючий" @@ -2071,7 +2387,7 @@ msgid "Неактивна" msgstr "Неактивна" #: templates/pages/dislocation.html:208 -#: templates/pages/pharmacy-detail.html:147 +#: templates/pages/pharmacy-detail.html:149 msgid "В этой аптеке пока нет активных сотрудников" msgstr "У цій аптеці поки немає активних співробітників" @@ -2143,70 +2459,78 @@ msgstr "Показано" msgid "Нет записей" msgstr "Немає записів" -#: templates/pages/employee-detail.html:21 templates/pages/news-detail.html:17 +#: templates/pages/documents.html:6 +msgid "Файловое хранилище: общие документы, обучение, отделы" +msgstr "" + +#: templates/pages/documents.html:29 +msgid "Нет доступных разделов документов." +msgstr "" + +#: templates/pages/employee-detail.html:28 templates/pages/news-detail.html:17 #: templates/pages/task-detail.html:41 templates/pages/tasks.html:127 msgid "Редактировать" msgstr "Редагувати" -#: templates/pages/employee-detail.html:40 templates/pages/employees.html:150 +#: templates/pages/employee-detail.html:47 templates/pages/employees.html:150 msgid "Не активный" msgstr "Не активний" -#: templates/pages/employee-detail.html:42 +#: templates/pages/employee-detail.html:49 msgid "Испытательный срок" msgstr "Випробувальний термін" -#: templates/pages/employee-detail.html:63 +#: templates/pages/employee-detail.html:70 msgid "Рабочий email" msgstr "Робочий email" -#: templates/pages/employee-detail.html:71 +#: templates/pages/employee-detail.html:78 msgid "Внутренний номер" msgstr "Внутрішній номер" -#: templates/pages/employee-detail.html:100 +#: templates/pages/employee-detail.html:107 msgid "Подчинённых" msgstr "Підлеглих" -#: templates/pages/employee-detail.html:105 templates/pages/hr-portal.html:219 +#: templates/pages/employee-detail.html:112 templates/pages/hr-portal.html:219 msgid "Дата приёма" msgstr "Дата прийняття" -#: templates/pages/employee-detail.html:132 +#: templates/pages/employee-detail.html:139 msgid "Экстренный контакт" msgstr "Екстрений контакт" -#: templates/pages/employee-detail.html:141 templates/pages/settings.html:17 +#: templates/pages/employee-detail.html:148 templates/pages/settings.html:17 msgid "Интеграции" msgstr "Інтеграції" -#: templates/pages/employee-detail.html:145 #: templates/pages/employee-detail.html:152 +#: templates/pages/employee-detail.html:159 msgid "Синхронизировано" msgstr "Синхронізовано" -#: templates/pages/employee-detail.html:147 #: templates/pages/employee-detail.html:154 +#: templates/pages/employee-detail.html:161 msgid "Отключено" msgstr "Вимкнено" -#: templates/pages/employee-detail.html:155 +#: templates/pages/employee-detail.html:162 msgid "Не синхронизировано" msgstr "Не синхронізовано" -#: templates/pages/employee-detail.html:182 +#: templates/pages/employee-detail.html:189 msgid "Задач пока нет" msgstr "Задач поки немає" -#: templates/pages/employee-detail.html:196 +#: templates/pages/employee-detail.html:203 msgid "Цепочка руководства" msgstr "Ланцюжок керівництва" -#: templates/pages/employee-detail.html:229 +#: templates/pages/employee-detail.html:236 msgid "Последнее посещение" msgstr "Останнє відвідування" -#: templates/pages/employee-detail.html:239 +#: templates/pages/employee-detail.html:246 msgid "Группы доступа" msgstr "Групи доступу" @@ -2472,8 +2796,7 @@ msgstr "Нова заявка на найм" #: templates/pages/hr-portal.html:416 msgid "Сразу создаёт личный учётный запис кандидата на срок испытания." -msgstr "" -"Одразу створює особистий обліковий запис кандидата на термін випробування." +msgstr "Одразу створює особистий обліковий запис кандидата на термін випробування." #: templates/pages/hr-portal.html:422 msgid "Фамилия " @@ -2535,7 +2858,7 @@ msgstr "Посада / локація" msgid "Испытание до" msgstr "Випробування до" -#: templates/pages/hr-portal.html:537 templates/pages/pharmacy-detail.html:300 +#: templates/pages/hr-portal.html:537 templates/pages/pharmacy-detail.html:302 msgid "Подал" msgstr "Подав" @@ -2600,13 +2923,13 @@ msgid "Всего единиц" msgstr "Всього одиниць" #: templates/pages/it-manager.html:35 templates/pages/it-manager.html:259 -#: templates/pages/pharmacy-detail.html:211 +#: templates/pages/pharmacy-detail.html:213 msgid "На складе" msgstr "На складі" #: templates/pages/it-manager.html:39 templates/pages/it-manager.html:236 -#: templates/pages/it-manager.html:260 templates/pages/pharmacy-detail.html:196 -#: templates/pages/pharmacy-detail.html:212 +#: templates/pages/it-manager.html:260 templates/pages/pharmacy-detail.html:198 +#: templates/pages/pharmacy-detail.html:214 msgid "Выдано" msgstr "Видано" @@ -2647,9 +2970,7 @@ msgid "По одному в строку — вставьте список се msgstr "По одному в рядку — вставте список серійників, наприклад" #: templates/pages/it-manager.html:96 -msgid "" -"Сколько серийников — столько единиц будет создано. Дубликаты и уже имеющиеся " -"пропускаются." +msgid "Сколько серийников — столько единиц будет создано. Дубликаты и уже имеющиеся пропускаются." msgstr "" #: templates/pages/it-manager.html:100 templates/pages/it-manager.html:670 @@ -2761,7 +3082,7 @@ msgstr "Тип / Бренд / Модель" msgid "С/н · Инв. №" msgstr "С/н · Інв. №" -#: templates/pages/it-manager.html:261 templates/pages/pharmacy-detail.html:213 +#: templates/pages/it-manager.html:261 templates/pages/pharmacy-detail.html:215 msgid "В ремонте" msgstr "В ремонті" @@ -2826,7 +3147,7 @@ msgstr "Виконавець" #: templates/pages/it-manager.html:349 templates/pages/it-manager.html:486 #: templates/pages/it-manager.html:555 templates/pages/it-manager.html:1098 -#: templates/pages/pharmacy-detail.html:297 +#: templates/pages/pharmacy-detail.html:299 msgid "Дата" msgstr "Дата" @@ -3007,7 +3328,7 @@ msgid "Номер договора" msgstr "Номер договору" #: templates/pages/it-manager.html:895 templates/pages/it-manager.html:970 -#: templates/pages/pharmacy-detail.html:242 +#: templates/pages/pharmacy-detail.html:244 msgid "Тип услуги" msgstr "Тип послуги" @@ -3051,7 +3372,7 @@ msgstr "По одній IP-адресі на рядок" msgid "Провайдер / Локация" msgstr "Провайдер / Локація" -#: templates/pages/it-manager.html:971 templates/pages/pharmacy-detail.html:244 +#: templates/pages/it-manager.html:971 templates/pages/pharmacy-detail.html:246 msgid "Скорость" msgstr "Швидкість" @@ -3120,7 +3441,7 @@ msgid "Это необратимо." msgstr "Це незворотньо." #: templates/pages/news-detail.html:24 templates/pages/task-detail.html:48 -#: templates/pages/tasks.html:135 +#: templates/pages/tasks.html:135 templates/partials/pharmacy-documents.html:51 msgid "Удалить" msgstr "Видалити" @@ -3251,83 +3572,83 @@ msgstr "Інтернет-провайдер" msgid "Коммунальный отдел" msgstr "Комунальний відділ" -#: templates/pages/pharmacy-detail.html:86 +#: templates/pages/pharmacy-detail.html:88 msgid "Регион" msgstr "Регіон" -#: templates/pages/pharmacy-detail.html:88 +#: templates/pages/pharmacy-detail.html:90 msgid "Категория" msgstr "Категорія" -#: templates/pages/pharmacy-detail.html:89 +#: templates/pages/pharmacy-detail.html:91 msgid "Категория НДС" msgstr "Категорія ПДВ" -#: templates/pages/pharmacy-detail.html:92 +#: templates/pages/pharmacy-detail.html:94 msgid "Количество фармацевтов (штат)" msgstr "Кількість фармацевтів (штат)" -#: templates/pages/pharmacy-detail.html:119 +#: templates/pages/pharmacy-detail.html:121 msgid "Телефоны не указаны" msgstr "Телефони не вказані" -#: templates/pages/pharmacy-detail.html:178 +#: templates/pages/pharmacy-detail.html:180 msgid "Создано:" msgstr "Створено:" -#: templates/pages/pharmacy-detail.html:179 +#: templates/pages/pharmacy-detail.html:181 msgid "Обновлено:" msgstr "Оновлено:" -#: templates/pages/pharmacy-detail.html:194 +#: templates/pages/pharmacy-detail.html:196 msgid "Серийный / инв. №" msgstr "Серійний / інв. №" -#: templates/pages/pharmacy-detail.html:223 +#: templates/pages/pharmacy-detail.html:225 msgid "За этой аптекой не закреплено оборудование" msgstr "За цією аптекою не закріплено обладнання" -#: templates/pages/pharmacy-detail.html:229 +#: templates/pages/pharmacy-detail.html:231 msgid "Управлять оборудованием в IT-отделе" msgstr "Керувати обладнанням в IT-відділі" -#: templates/pages/pharmacy-detail.html:241 +#: templates/pages/pharmacy-detail.html:243 msgid "Провайдер / договор" msgstr "Провайдер / договір" -#: templates/pages/pharmacy-detail.html:278 +#: templates/pages/pharmacy-detail.html:280 msgid "Договоров с провайдерами для этой аптеки не найдено" msgstr "Договорів з провайдерами для цієї аптеки не знайдено" -#: templates/pages/pharmacy-detail.html:284 +#: templates/pages/pharmacy-detail.html:286 msgid "Управлять договорами в IT-отделе" msgstr "Керувати договорами в IT-відділі" -#: templates/pages/pharmacy-detail.html:296 +#: templates/pages/pharmacy-detail.html:298 msgid "Тип счётчика" msgstr "Тип лічильника" -#: templates/pages/pharmacy-detail.html:298 +#: templates/pages/pharmacy-detail.html:300 msgid "Показания" msgstr "Показання" -#: templates/pages/pharmacy-detail.html:299 +#: templates/pages/pharmacy-detail.html:301 msgid "Расход" msgstr "Витрата" -#: templates/pages/pharmacy-detail.html:301 +#: templates/pages/pharmacy-detail.html:303 msgid "Комментарий" msgstr "Коментар" -#: templates/pages/pharmacy-detail.html:312 +#: templates/pages/pharmacy-detail.html:314 msgid "Показания меньше предыдущего — проверьте" msgstr "Показання менше за попереднє — перевірте" -#: templates/pages/pharmacy-detail.html:322 +#: templates/pages/pharmacy-detail.html:324 msgid "Показаний счётчиков для этой аптеки ещё не подавали" msgstr "Показань лічильників для цієї аптеки ще не подавали" -#: templates/pages/pharmacy-detail.html:327 +#: templates/pages/pharmacy-detail.html:329 msgid "Подать показания / все показания" msgstr "Подати показання / усі показання" @@ -3360,12 +3681,8 @@ msgid "Количество записей в таблицах по умолча msgstr "Кількість записів у таблицях за замовчуванням" #: templates/pages/profile.html:100 -msgid "" -"Применяется ко всем таблицам портала, если для конкретной таблицы размер не " -"выбран вручную." -msgstr "" -"Застосовується до всіх таблиць порталу, якщо для конкретної таблиці розмір " -"не вибрано вручну." +msgid "Применяется ко всем таблицам портала, если для конкретной таблицы размер не выбран вручную." +msgstr "Застосовується до всіх таблиць порталу, якщо для конкретної таблиці розмір не вибрано вручну." #: templates/pages/settings.html:6 msgid "Конфигурация портала" @@ -3542,3 +3859,34 @@ msgstr "Немає відміток робочого часу за" #: templates/pages/timetrack.html:92 msgid "сотрудников" msgstr "співробітників" + +#: templates/partials/documents-browser.html:28 +#: templates/partials/pharmacy-documents.html:18 +msgid "Файловое хранилище пока не настроено." +msgstr "" + +#: templates/partials/documents-browser.html:32 +#: templates/partials/pharmacy-documents.html:22 +msgid "Не удалось получить список документов." +msgstr "" + +#: templates/partials/documents-browser.html:61 +msgid "В этой папке пока нет файлов." +msgstr "" + +#: templates/partials/documents-browser.html:74 +#: templates/partials/pharmacy-documents.html:76 +msgid "Загрузить" +msgstr "" + +#: templates/partials/pharmacy-documents.html:4 +msgid "Документы аптеки" +msgstr "" + +#: templates/partials/pharmacy-documents.html:48 +msgid "Удалить файл?" +msgstr "" + +#: templates/partials/pharmacy-documents.html:63 +msgid "В папке аптеки пока нет файлов." +msgstr "" diff --git a/locale/uk/LC_MESSAGES/djangojs.mo b/locale/uk/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..5c80410 Binary files /dev/null and b/locale/uk/LC_MESSAGES/djangojs.mo differ diff --git a/locale/uk/LC_MESSAGES/djangojs.po b/locale/uk/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..355a370 --- /dev/null +++ b/locale/uk/LC_MESSAGES/djangojs.po @@ -0,0 +1,100 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "Не вдалося завантажити канали" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-28 21:52+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " +"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " +"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " +"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +#: static/assets/js/chat.js:310 +msgid "Не удалось загрузить каналы" +msgstr "Не вдалося завантажити канали" + +#: static/assets/js/chat.js:402 +msgid "Нет каналов" +msgstr "Немає каналів" + +#: static/assets/js/chat.js:423 +msgid "Нет сообщений" +msgstr "Немає повідомлень" + +#: static/assets/js/chat.js:432 +msgid "Групповой разговор" +msgstr "Групова розмова" + +#: static/assets/js/chat.js:549 static/assets/js/chat.js:952 +msgid "Загрузка…" +msgstr "Завантаження…" + +#: static/assets/js/chat.js:561 +msgid "Не удалось загрузить сообщения" +msgstr "Не вдалося завантажити повідомлення" + +#: static/assets/js/chat.js:611 +msgid "Личное" +msgstr "Особисте" + +#: static/assets/js/chat.js:629 +msgid "Поиск…" +msgstr "Пошук…" + +#: static/assets/js/chat.js:650 +msgid "Не удалось выполнить поиск" +msgstr "Не вдалося виконати пошук" + +#: static/assets/js/chat.js:663 +msgid "Найдено:" +msgstr "Знайдено:" + +#: static/assets/js/chat.js:666 +msgid "Закрыть поиск" +msgstr "Закрити пошук" + +#: static/assets/js/chat.js:676 +msgid "Ничего не найдено" +msgstr "Нічого не знайдено" + +#: static/assets/js/chat.js:718 +msgid "бот" +msgstr "бот" + +#: static/assets/js/chat.js:743 +msgid "Вы" +msgstr "Ви" + +#: static/assets/js/chat.js:781 +msgid "Реакция" +msgstr "Реакція" + +#: static/assets/js/chat.js:790 static/assets/js/chat.js:1002 +msgid "Ответов:" +msgstr "Відповідей:" + +#: static/assets/js/chat.js:790 +msgid "Ответить" +msgstr "Відповісти" + +#: static/assets/js/chat.js:964 +msgid "Не удалось загрузить обсуждение" +msgstr "Не вдалося завантажити обговорення" + +#: static/assets/js/chat.js:1108 +msgid "Никого не найдено" +msgstr "Нікого не знайдено" + +#: static/assets/js/chat.js:1204 +msgid "Новое сообщение" +msgstr "Нове повідомлення" diff --git a/static/assets/js/chat.js b/static/assets/js/chat.js index 70559bc..8e47fd9 100644 --- a/static/assets/js/chat.js +++ b/static/assets/js/chat.js @@ -1,3 +1,7 @@ +// Переклади для JS приходять із JavaScriptCatalog (/jsi18n/). Якщо каталог не +// підвантажився — не падаємо, показуємо базові (російські) рядки. +if (typeof window.gettext !== 'function') { window.gettext = function (s) { return s; }; } + var CHAT_QUICK_EMOJIS = [ ['👍', 'thumbsup'], ['❤️', 'heart'], ['😂', 'joy'], ['😮', 'open_mouth'], ['😢', 'cry'], ['🙏', 'pray'], @@ -303,7 +307,7 @@ function chatLoadChannels() { }).catch(function (e) { console.error(e); var el = document.getElementById('chat-channel-list'); - if (el) el.innerHTML = '
Не вдалося завантажити канали
'; + if (el) el.innerHTML = '
' + gettext('Не удалось загрузить каналы') + '
'; }); } @@ -395,7 +399,7 @@ function chatRenderChannelList() { }); if (!list.length) { - el.innerHTML = '
Немає каналів
'; + el.innerHTML = '
' + gettext('Нет каналов') + '
'; return; } @@ -416,7 +420,7 @@ function chatRenderDmList() { }); if (!list.length) { - el.innerHTML = '
Немає повідомлень
'; + el.innerHTML = '
' + gettext('Нет сообщений') + '
'; return; } @@ -425,7 +429,7 @@ function chatRenderDmList() { var otherId = chatDmOtherUserId[ch.id]; var isBot = ch.type === 'D' && otherId && chatUserIsBot[otherId]; var row = chatBuildChannelRow(ch.id, chatDmLabels[ch.id] || '…', - ch.type === 'G' ? 'Групова розмова' : '', {avatar: true, bot: isBot}); + ch.type === 'G' ? gettext('Групповой разговор') : '', {avatar: true, bot: isBot}); el.appendChild(row); // Якщо співрозмовник ЛС уже відомий — одразу показати його аватар. if (ch.type === 'D' && otherId) { @@ -542,7 +546,7 @@ function chatSelectChannel(channelId) { chatRenderComposerFileChips('chat-composer-files', chatComposerFileIds); var messagesEl = document.getElementById('chat-messages'); - if (messagesEl) messagesEl.innerHTML = '
Завантаження…
'; + if (messagesEl) messagesEl.innerHTML = '
' + gettext('Загрузка…') + '
'; chatRenderedPostIds = {}; chatApiFetch('/channels/' + channelId + '/posts?per_page=30').then(function (data) { @@ -554,7 +558,7 @@ function chatSelectChannel(channelId) { }); }).catch(function (e) { console.error(e); - if (messagesEl) messagesEl.innerHTML = '
Не вдалося завантажити повідомлення
'; + if (messagesEl) messagesEl.innerHTML = '
' + gettext('Не удалось загрузить сообщения') + '
'; }); } @@ -604,7 +608,7 @@ function chatSearchChannelLabel(channelId) { var ch = chatFindChannel(channelId); if (!ch) return ''; if (ch.type === 'O' || ch.type === 'P') return '#' + ch.display_name; - return chatDmLabels[ch.id] || 'Особисте'; + return chatDmLabels[ch.id] || gettext('Личное'); } function chatSearchMessages(terms) { @@ -622,7 +626,7 @@ function chatSearchMessages(terms) { resultsEl.style.display = 'flex'; if (messagesEl) messagesEl.style.display = 'none'; - resultsEl.innerHTML = '
Пошук…
'; + resultsEl.innerHTML = '
' + gettext('Поиск…') + '
'; var body = JSON.stringify({terms: terms, is_or_search: false, per_page: 30}); var merged = {}; // id -> post (дедуплікація між командами) @@ -643,7 +647,7 @@ function chatSearchMessages(terms) { }); }).catch(function (e) { console.error(e); - resultsEl.innerHTML = '
Не вдалося виконати пошук
'; + resultsEl.innerHTML = '
' + gettext('Не удалось выполнить поиск') + '
'; }); } @@ -656,10 +660,10 @@ function chatRenderSearchResults(posts) { head.style.cssText = 'display:flex; align-items:center; justify-content:space-between; margin-bottom:0.25rem;'; var title = document.createElement('span'); title.style.cssText = 'font-size:0.75rem; color:var(--color-muted-foreground);'; - title.textContent = 'Знайдено: ' + posts.length; + title.textContent = gettext('Найдено:') + ' ' + posts.length; var closeBtn = document.createElement('button'); closeBtn.type = 'button'; - closeBtn.textContent = 'Закрити пошук'; + closeBtn.textContent = gettext('Закрыть поиск'); closeBtn.style.cssText = 'background:none; border:none; cursor:pointer; font-size:0.75rem; color:var(--color-primary);'; closeBtn.onclick = chatCloseSearch; head.appendChild(title); @@ -669,7 +673,7 @@ function chatRenderSearchResults(posts) { if (!posts.length) { var none = document.createElement('div'); none.style.cssText = 'text-align:center; font-size:0.8125rem; color:var(--color-muted-foreground); padding:1rem;'; - none.textContent = 'Нічого не знайдено'; + none.textContent = gettext('Ничего не найдено'); el.appendChild(none); return; } @@ -711,7 +715,7 @@ function chatPostIsBot(post) { function chatBotBadge() { var b = document.createElement('span'); - b.textContent = 'бот'; + b.textContent = gettext('бот'); b.style.cssText = 'font-size:0.5625rem; font-weight:700; letter-spacing:0.03em; text-transform:uppercase; color:var(--color-muted-foreground); background:var(--color-muted); border:1px solid var(--color-border); border-radius:0.25rem; padding:0.0625rem 0.25rem; line-height:1.2;'; return b; } @@ -736,7 +740,7 @@ function chatBuildMessageEl(post, context) { meta.style.cssText = 'display:flex; align-items:baseline; gap:0.5rem; margin-bottom:0.25rem;' + (isMine ? ' flex-direction:row-reverse;' : ''); var nameEl = document.createElement('span'); nameEl.style.cssText = 'font-size:0.8125rem; font-weight:600; color:var(--color-foreground);'; - nameEl.textContent = isMine ? 'Ви' : senderName; + nameEl.textContent = isMine ? gettext('Вы') : senderName; var timeEl = document.createElement('span'); timeEl.style.cssText = 'font-size:0.6875rem; color:var(--color-muted-foreground);'; timeEl.textContent = post.create_at ? new Date(post.create_at).toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'}) : ''; @@ -774,7 +778,7 @@ function chatBuildMessageEl(post, context) { var reactBtn = document.createElement('button'); reactBtn.type = 'button'; reactBtn.style.cssText = 'background:none; border:none; cursor:pointer; font-size:0.6875rem; color:var(--color-muted-foreground); padding:0;'; - reactBtn.textContent = '🙂 Реакція'; + reactBtn.textContent = '🙂 ' + gettext('Реакция'); reactBtn.onclick = function (e) { chatToggleReactionPicker(e, post, context); }; actions.appendChild(reactBtn); @@ -783,7 +787,7 @@ function chatBuildMessageEl(post, context) { replyBtn.type = 'button'; replyBtn.id = 'chat-reply-count-' + post.id; replyBtn.style.cssText = 'background:none; border:none; cursor:pointer; font-size:0.6875rem; color:var(--color-primary); padding:0;'; - replyBtn.textContent = post.reply_count ? ('💬 ' + post.reply_count + ' відповідей') : '↩ Відповісти'; + replyBtn.textContent = post.reply_count ? ('💬 ' + gettext('Ответов:') + ' ' + post.reply_count) : ('↩ ' + gettext('Ответить')); replyBtn.onclick = function () { chatOpenThread(post.id); }; actions.appendChild(replyBtn); } @@ -945,7 +949,7 @@ function chatOpenThread(postId) { document.getElementById('chat-thread-composer-input').value = ''; var el = document.getElementById('chat-thread-messages'); - if (el) el.innerHTML = '
Завантаження…
'; + if (el) el.innerHTML = '
' + gettext('Загрузка…') + '
'; chatApiFetch('/posts/' + postId + '/thread?perPage=60').then(function (data) { var ids = (data.order || []).slice().reverse(); @@ -957,7 +961,7 @@ function chatOpenThread(postId) { }); }).catch(function (e) { console.error(e); - if (el) el.innerHTML = '
Не вдалося завантажити тред
'; + if (el) el.innerHTML = '
' + gettext('Не удалось загрузить обсуждение') + '
'; }); } @@ -995,7 +999,7 @@ function chatBumpReplyCount(rootId) { if (!root) return; root.reply_count = (root.reply_count || 0) + 1; var btn = document.getElementById('chat-reply-count-' + rootId); - if (btn) btn.textContent = '💬 ' + root.reply_count + ' відповідей'; + if (btn) btn.textContent = '💬 ' + gettext('Ответов:') + ' ' + root.reply_count; } function chatSendMessage() { @@ -1101,7 +1105,7 @@ function chatRenderDmPickerList() { container.innerHTML = ''; if (!filtered.length) { - container.innerHTML = '
Нікого не знайдено
'; + container.innerHTML = '
' + gettext('Никого не найдено') + '
'; return; } @@ -1197,7 +1201,7 @@ function chatUpdateTitle() { function chatNotifyNewMessage(post) { try { if (window.Notification && Notification.permission === 'granted') { - var who = chatUserNames[post.user_id] || 'Нове повідомлення'; + var who = chatUserNames[post.user_id] || gettext('Новое сообщение'); new Notification(who, {body: (post.message || '').slice(0, 140)}); } } catch (e) { /* ignore */ } diff --git a/templates/index.html b/templates/index.html index 7a8b79e..8c485b5 100644 --- a/templates/index.html +++ b/templates/index.html @@ -29,6 +29,7 @@ }); + diff --git a/templates/pages/chat.html b/templates/pages/chat.html index 917d0ed..21a04a3 100644 --- a/templates/pages/chat.html +++ b/templates/pages/chat.html @@ -1,25 +1,26 @@ +{% load i18n %}
-

Чат

-

Внутрішній корпоративний месенджер (Mattermost)

+

{% trans "Чат" %}

+

{% trans "Внутренний корпоративный мессенджер (Mattermost)" %}

{% if chat_state == 'ready' %} {{ chat_config|json_script:"chat-config-data" }} {{ chat_colleagues|json_script:"chat-colleagues-data" }} - +
- -
- +
@@ -27,27 +28,27 @@
- Особисті повідомлення -
-
Завантаження…
+
{% trans "Загрузка…" %}
- Канали + {% trans "Каналы" %}
-
Завантаження…
+
{% trans "Загрузка…" %}
@@ -55,7 +56,7 @@
- Оберіть канал зліва + {% trans "Выберите канал слева" %}
@@ -65,10 +66,10 @@
- -
- +
- Тред -
@@ -92,10 +93,10 @@
- -
- +
- Нове повідомлення -
- +
- +
@@ -126,12 +127,12 @@ -
Ваш акаунт ще не синхронізовано з Mattermost
+
{% trans "Ваша учётная запись ещё не синхронизирована с Mattermost" %}

- Натисніть кнопку нижче, щоб створити/прив'язати ваш акаунт у Mattermost. + {% trans "Нажмите кнопку ниже, чтобы создать или привязать вашу учётную запись в Mattermost." %}

@@ -140,9 +141,9 @@ -
Не вдалося отримати доступ до Mattermost
+
{% trans "Не удалось получить доступ к Mattermost" %}

- Зверніться до IT-відділу — можливо, вимкнено видачу Personal Access Token на сервері Mattermost. + {% trans "Обратитесь в IT-отдел — возможно, отключена выдача Personal Access Token на сервере Mattermost." %}

@@ -151,9 +152,9 @@ -
Чат ще не підключено
+
{% trans "Чат ещё не подключён" %}

- Вкажіть публічну URL-адресу Mattermost (поле public_url у "Дополнительные параметры" коннектора Mattermost в адмінці) — і вона з'явиться тут. + {% blocktrans %}Укажите публичный URL Mattermost (поле public_url в «Дополнительные параметры» коннектора Mattermost в админке) — и он появится здесь.{% endblocktrans %}

{% endif %}