i18n: перевод страницы employees (ru/uk/en)

Заголовки, фильтры, столбцы таблицы, статусы, пустое состояние помечены
{% trans %}; переведены uk/en (часть msgid переиспользуется). fuzzy снят.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-25 12:02:08 +03:00
parent 76f3bf3584
commit 888ff9b9aa
5 changed files with 142 additions and 51 deletions
Binary file not shown.
+60 -15
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-25 11:50+0300\n"
"POT-Creation-Date: 2026-07-25 12:01+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,9 +18,9 @@ msgstr ""
"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
#: apps/employees/models/permissions.py:47 templates/pages/employees.html:103
msgid "Сотрудник"
msgstr ""
msgstr "Employee"
#: apps/ad_connector/models.py:13 apps/mail_connector/models.py:15
msgid "Действие"
@@ -47,8 +47,9 @@ msgstr ""
#: 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
#: templates/pages/employees.html:107
msgid "Статус"
msgstr ""
msgstr "Status"
#: apps/ad_connector/models.py:23 apps/mail_connector/models.py:25
msgid "Успех"
@@ -183,9 +184,9 @@ msgid "Разрешает вход в Django admin. Только для IT-ад
msgstr ""
#: apps/employees/models/base.py:47 core/models/directories.py:29
#: core/models/directories.py:121
#: core/models/directories.py:121 templates/pages/employees.html:148
msgid "Активный"
msgstr ""
msgstr "Active"
#: apps/employees/models/base.py:48
msgid "Работает ли сотрудник сейчас"
@@ -244,9 +245,10 @@ msgstr ""
#: 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
#: apps/utilities/models.py:17 templates/pages/employees.html:64
#: templates/pages/employees.html:90
msgid "Аптека"
msgstr ""
msgstr "Pharmacy"
#: apps/employees/models/base.py:82 apps/hiring/models.py:35
#: apps/locations/models/base.py:30
@@ -254,8 +256,9 @@ msgid "Склад"
msgstr ""
#: apps/employees/models/base.py:83 apps/locations/models/base.py:31
#: templates/pages/employees.html:56
msgid "Офис"
msgstr ""
msgstr "Office"
#: apps/employees/models/base.py:86 apps/locations/models/base.py:28
msgid "Тип локации"
@@ -281,9 +284,9 @@ msgstr ""
msgid "Заполняется для office / warehouse"
msgstr ""
#: apps/employees/models/base.py:119
#: apps/employees/models/base.py:119 templates/pages/employees.html:104
msgid "Должность"
msgstr ""
msgstr "Position"
#: apps/employees/models/base.py:125
msgid "Руководитель"
@@ -380,7 +383,8 @@ msgid "Обновляется автоматически при активнос
msgstr ""
#: apps/employees/models/base.py:187 templates/index.html:250
#: templates/pages/dashboard.html:174
#: templates/pages/dashboard.html:174 templates/pages/employees.html:8
#: templates/pages/employees.html:24
msgid "Сотрудники"
msgstr "Employees"
@@ -828,8 +832,9 @@ msgid "Тип и регион"
msgstr ""
#: apps/locations/admin.py:99 apps/locations/admin.py:282
#: templates/pages/employees.html:106
msgid "Адрес"
msgstr ""
msgstr "Address"
#: apps/locations/admin.py:102 apps/locations/admin.py:139
#: apps/locations/admin.py:354
@@ -1695,7 +1700,7 @@ msgstr "IT Department"
msgid "Active Directory"
msgstr "Active Directory"
#: templates/index.html:494
#: templates/index.html:494 templates/pages/employees.html:32
msgid "Поиск..."
msgstr "Search..."
@@ -1759,7 +1764,7 @@ msgstr "Employees online"
msgid "из"
msgstr "of"
#: templates/pages/dashboard.html:22
#: templates/pages/dashboard.html:22 templates/pages/employees.html:25
msgid "активных"
msgstr "active"
@@ -1814,3 +1819,43 @@ msgstr "Useful links and tools"
#: templates/pages/dashboard.html:163
msgid "Справочник"
msgstr "Directory"
#: templates/pages/employees.html:9
msgid "Управление персоналом компании"
msgstr "Personnel management"
#: templates/pages/employees.html:15
msgid "Добавить сотрудника"
msgstr "Add employee"
#: templates/pages/employees.html:25
msgid "сотрудников, из них"
msgstr "employees, of them"
#: templates/pages/employees.html:48
msgid "Все"
msgstr "All"
#: templates/pages/employees.html:73
msgid "Все предприятия"
msgstr "All organizations"
#: templates/pages/employees.html:86
msgid "Все аптеки"
msgstr "All pharmacies"
#: templates/pages/employees.html:105
msgid "Отдел / Аптека"
msgstr "Department / Pharmacy"
#: templates/pages/employees.html:108
msgid "Дата начала"
msgstr "Start date"
#: templates/pages/employees.html:150
msgid "Не активный"
msgstr "Inactive"
#: templates/pages/employees.html:157
msgid "Список сотрудников пуст."
msgstr "Employee list is empty."
Binary file not shown.
+60 -15
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-25 11:50+0300\n"
"POT-Creation-Date: 2026-07-25 12:01+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -21,9 +21,9 @@ msgstr ""
"(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
#: apps/employees/models/permissions.py:47 templates/pages/employees.html:103
msgid "Сотрудник"
msgstr ""
msgstr "Співробітник"
#: apps/ad_connector/models.py:13 apps/mail_connector/models.py:15
msgid "Действие"
@@ -50,8 +50,9 @@ msgstr ""
#: 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
#: templates/pages/employees.html:107
msgid "Статус"
msgstr ""
msgstr "Статус"
#: apps/ad_connector/models.py:23 apps/mail_connector/models.py:25
msgid "Успех"
@@ -186,9 +187,9 @@ msgid "Разрешает вход в Django admin. Только для IT-ад
msgstr ""
#: apps/employees/models/base.py:47 core/models/directories.py:29
#: core/models/directories.py:121
#: core/models/directories.py:121 templates/pages/employees.html:148
msgid "Активный"
msgstr ""
msgstr "Активний"
#: apps/employees/models/base.py:48
msgid "Работает ли сотрудник сейчас"
@@ -247,9 +248,10 @@ msgstr ""
#: 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
#: apps/utilities/models.py:17 templates/pages/employees.html:64
#: templates/pages/employees.html:90
msgid "Аптека"
msgstr ""
msgstr "Аптека"
#: apps/employees/models/base.py:82 apps/hiring/models.py:35
#: apps/locations/models/base.py:30
@@ -257,8 +259,9 @@ msgid "Склад"
msgstr ""
#: apps/employees/models/base.py:83 apps/locations/models/base.py:31
#: templates/pages/employees.html:56
msgid "Офис"
msgstr ""
msgstr "Офіс"
#: apps/employees/models/base.py:86 apps/locations/models/base.py:28
msgid "Тип локации"
@@ -284,9 +287,9 @@ msgstr ""
msgid "Заполняется для office / warehouse"
msgstr ""
#: apps/employees/models/base.py:119
#: apps/employees/models/base.py:119 templates/pages/employees.html:104
msgid "Должность"
msgstr ""
msgstr "Посада"
#: apps/employees/models/base.py:125
msgid "Руководитель"
@@ -383,7 +386,8 @@ msgid "Обновляется автоматически при активнос
msgstr ""
#: apps/employees/models/base.py:187 templates/index.html:250
#: templates/pages/dashboard.html:174
#: templates/pages/dashboard.html:174 templates/pages/employees.html:8
#: templates/pages/employees.html:24
msgid "Сотрудники"
msgstr "Співробітники"
@@ -831,8 +835,9 @@ msgid "Тип и регион"
msgstr ""
#: apps/locations/admin.py:99 apps/locations/admin.py:282
#: templates/pages/employees.html:106
msgid "Адрес"
msgstr ""
msgstr "Адреса"
#: apps/locations/admin.py:102 apps/locations/admin.py:139
#: apps/locations/admin.py:354
@@ -1698,7 +1703,7 @@ msgstr "IT-відділ"
msgid "Active Directory"
msgstr "Active Directory"
#: templates/index.html:494
#: templates/index.html:494 templates/pages/employees.html:32
msgid "Поиск..."
msgstr "Пошук..."
@@ -1762,7 +1767,7 @@ msgstr "Співробітників онлайн"
msgid "из"
msgstr "із"
#: templates/pages/dashboard.html:22
#: templates/pages/dashboard.html:22 templates/pages/employees.html:25
msgid "активных"
msgstr "активних"
@@ -1817,3 +1822,43 @@ msgstr "Корисні посилання та інструменти"
#: templates/pages/dashboard.html:163
msgid "Справочник"
msgstr "Довідник"
#: templates/pages/employees.html:9
msgid "Управление персоналом компании"
msgstr "Управління персоналом компанії"
#: templates/pages/employees.html:15
msgid "Добавить сотрудника"
msgstr "Додати співробітника"
#: templates/pages/employees.html:25
msgid "сотрудников, из них"
msgstr "співробітників, з них"
#: templates/pages/employees.html:48
msgid "Все"
msgstr "Всі"
#: templates/pages/employees.html:73
msgid "Все предприятия"
msgstr "Всі підприємства"
#: templates/pages/employees.html:86
msgid "Все аптеки"
msgstr "Всі аптеки"
#: templates/pages/employees.html:105
msgid "Отдел / Аптека"
msgstr "Відділ / Аптека"
#: templates/pages/employees.html:108
msgid "Дата начала"
msgstr "Дата початку"
#: templates/pages/employees.html:150
msgid "Не активный"
msgstr "Не активний"
#: templates/pages/employees.html:157
msgid "Список сотрудников пуст."
msgstr "Список співробітників порожній."
+22 -21
View File
@@ -1,17 +1,18 @@
{% load common_tags %}
{% load i18n %}
<div class="page-content" id="employees-page">
{{ pharmacies_by_org|json_script:"emp-pharmacies-data" }}
<div style="display:flex; align-items:center; justify-content:space-between; margin-bottom:1.5rem;">
<div>
<h1 style="font-size:1.25rem; font-weight:500; color:var(--color-foreground);">Співробітники</h1>
<p style="font-size:0.875rem; color:var(--color-muted-foreground); margin-top:0.25rem;">Управління персоналом компанії</p>
<h1 style="font-size:1.25rem; font-weight:500; color:var(--color-foreground);">{% trans "Сотрудники" %}</h1>
<p style="font-size:0.875rem; color:var(--color-muted-foreground); margin-top:0.25rem;">{% trans "Управление персоналом компании" %}</p>
</div>
<button class="btn btn-primary">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<line x1="12" x2="12" y1="5" y2="19"/><line x1="5" x2="19" y1="12" y2="12"/>
</svg>
Додати співробітника
{% trans "Добавить сотрудника" %}
</button>
</div>
@@ -20,15 +21,15 @@
<!-- Заголовок карточки -->
<div style="padding:1.25rem 1.5rem; border-bottom:1px solid var(--color-border); display:flex; align-items:center; justify-content:space-between; gap:1rem;">
<div>
<h3 style="font-weight:600; color:var(--color-card-foreground); font-size:0.9375rem;">Співробітники</h3>
<p style="font-size:0.8125rem; color:var(--color-muted-foreground); margin-top:0.125rem;">{{ total_count }} співробітників, з них {{ active_count }} активних</p>
<h3 style="font-weight:600; color:var(--color-card-foreground); font-size:0.9375rem;">{% trans "Сотрудники" %}</h3>
<p style="font-size:0.8125rem; color:var(--color-muted-foreground); margin-top:0.125rem;">{{ total_count }} {% trans "сотрудников, из них" %} {{ active_count }} {% trans "активных" %}</p>
</div>
<!-- Поиск по таблице -->
<div style="display:flex; align-items:center; gap:0.5rem; background:var(--color-muted); border:1px solid var(--color-border); border-radius:var(--radius); padding:0.375rem 0.75rem; width:16rem;">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="color:var(--color-muted-foreground); flex-shrink:0;">
<circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/>
</svg>
<input type="text" placeholder="Пошук..." class="input" style="border:none; background:transparent; padding:0; box-shadow:none; font-size:0.8125rem;">
<input type="text" placeholder="{% trans 'Поиск...' %}" class="input" style="border:none; background:transparent; padding:0; box-shadow:none; font-size:0.8125rem;">
</div>
</div>
@@ -44,7 +45,7 @@
hx-push-url="/employees/"
hx-indicator="#loader"
style="display:inline-flex;align-items:center;padding:0.25rem 0.875rem;font-size:0.8125rem;border-radius:calc(var(--radius) - 2px);font-weight:500;text-decoration:none;cursor:pointer;transition:all 150ms;
{% if not filter_location_type %}background:var(--color-card);color:var(--color-card-foreground);box-shadow:0 1px 2px rgb(0 0 0/0.08);{% else %}color:var(--color-muted-foreground);{% endif %}">Всі</a>
{% if not filter_location_type %}background:var(--color-card);color:var(--color-card-foreground);box-shadow:0 1px 2px rgb(0 0 0/0.08);{% else %}color:var(--color-muted-foreground);{% endif %}">{% trans "Все" %}</a>
<a href="#"
hx-get="/employees/?location_type=office"
@@ -52,7 +53,7 @@
hx-push-url="/employees/?location_type=office"
hx-indicator="#loader"
style="display:inline-flex;align-items:center;padding:0.25rem 0.875rem;font-size:0.8125rem;border-radius:calc(var(--radius) - 2px);font-weight:500;text-decoration:none;cursor:pointer;transition:all 150ms;
{% if filter_location_type == 'office' %}background:var(--color-card);color:var(--color-card-foreground);box-shadow:0 1px 2px rgb(0 0 0/0.08);{% else %}color:var(--color-muted-foreground);{% endif %}">Офіс</a>
{% if filter_location_type == 'office' %}background:var(--color-card);color:var(--color-card-foreground);box-shadow:0 1px 2px rgb(0 0 0/0.08);{% else %}color:var(--color-muted-foreground);{% endif %}">{% trans "Офис" %}</a>
<a href="#"
hx-get="/employees/?location_type=pharmacy"
@@ -60,7 +61,7 @@
hx-push-url="/employees/?location_type=pharmacy"
hx-indicator="#loader"
style="display:inline-flex;align-items:center;padding:0.25rem 0.875rem;font-size:0.8125rem;border-radius:calc(var(--radius) - 2px);font-weight:500;text-decoration:none;cursor:pointer;transition:all 150ms;
{% if filter_location_type == 'pharmacy' %}background:var(--color-card);color:var(--color-card-foreground);box-shadow:0 1px 2px rgb(0 0 0/0.08);{% else %}color:var(--color-muted-foreground);{% endif %}">Аптека</a>
{% if filter_location_type == 'pharmacy' %}background:var(--color-card);color:var(--color-card-foreground);box-shadow:0 1px 2px rgb(0 0 0/0.08);{% else %}color:var(--color-muted-foreground);{% endif %}">{% trans "Аптека" %}</a>
</div>
{% if filter_location_type == 'pharmacy' %}
@@ -69,7 +70,7 @@
class="input"
style="font-size:0.8125rem;padding:0.3rem 0.75rem;height:auto;min-width:12rem;"
onchange="empOrgChange()">
<option value="">Всі підприємства</option>
<option value="">{% trans "Все предприятия" %}</option>
{% for org in organizations %}
<option value="{{ org.id }}"
{% if org.id|stringformat:"d" == filter_organization_id %}selected{% endif %}
@@ -82,11 +83,11 @@
class="input"
style="font-size:0.8125rem;padding:0.3rem 0.75rem;height:auto;min-width:14rem;"
onchange="empPharmaChange()">
<option value="">Всі аптеки</option>
<option value="">{% trans "Все аптеки" %}</option>
{% for pharmacy in current_pharmacies %}
<option value="{{ pharmacy.id }}"
{% if pharmacy.id|stringformat:"d" == filter_pharmacy_id %}selected{% endif %}
>Аптека №{{ pharmacy.pharmacy_number }} — {{ pharmacy.address }}</option>
>{% trans "Аптека" %} №{{ pharmacy.pharmacy_number }} — {{ pharmacy.address }}</option>
{% endfor %}
</select>
{% endif %}
@@ -99,12 +100,12 @@
<table style="width:100%; border-collapse:collapse; font-size:0.875rem;">
<thead>
<tr style="border-bottom:1px solid var(--color-border);">
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">Співробітник</th>
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">Посада</th>
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">Відділ / Аптека</th>
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">Адреса</th>
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">Статус</th>
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">Дата початку</th>
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">{% trans "Сотрудник" %}</th>
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">{% trans "Должность" %}</th>
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">{% trans "Отдел / Аптека" %}</th>
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">{% trans "Адрес" %}</th>
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">{% trans "Статус" %}</th>
<th style="padding:0.75rem 1rem; text-align:left; color:var(--color-muted-foreground); font-weight:600; font-size:0.8125rem;">{% trans "Дата начала" %}</th>
</tr>
</thead>
<tbody>
@@ -144,16 +145,16 @@
</td>
<td style="padding:1rem; vertical-align:middle;">
{% if employee.is_active %}
<span class="badge badge-success">Активний</span>
<span class="badge badge-success">{% trans "Активный" %}</span>
{% else %}
<span class="badge badge-danger">Не активний</span>
<span class="badge badge-danger">{% trans "Не активный" %}</span>
{% endif %}
</td>
<td style="padding:1rem; vertical-align:middle; color:var(--color-muted-foreground);">{{ employee.hire_date|date:"d.m.Y" }}</td>
</tr>
{% empty %}
<tr>
<td colspan="5" style="padding:1.25rem; text-align:center; color:var(--color-muted-foreground);">Список співробітників порожній.</td>
<td colspan="5" style="padding:1.25rem; text-align:center; color:var(--color-muted-foreground);">{% trans "Список сотрудников пуст." %}</td>
</tr>
{% endfor %}
</tbody>