diff --git a/README.md b/README.md
index 2fe38f1..08d5e95 100644
--- a/README.md
+++ b/README.md
@@ -63,101 +63,98 @@ This file contains data for show a report.
The difference between the online and offline format is the presence of a wrapper for strings. The offline format will be pulled up like a `js` file if you just opened `/build/index.html `
### How to view the report online?
-
-- Go to the [website](https://assayo.jp/)
-- Click the “[Demo](https://assayo.jp/demo)” button.
-- Drag the `log.txt` file into the browser window.
+- go to the [website](https://assayo.jp/);
+- click the “[Demo](https://assayo.jp/demo)” button;
+- drag the `log.txt` file into the browser window;
### How to view the report offline?
-- Download this repository.
-- Drag the `log.txt` file to the `/build` folder.
-- Run `/build/index.html`
-- Or drag the `/build` folder to your repository (where the `log.txt` is located). You can change the name. For example, from `/build` to `/report`.
+- download this repository;
+- drag the `log.txt` file to the `/build` folder;
+- run `/build/index.html`;
+- or drag the `/build` folder to your repository (where the `log.txt` is located). You can change the name. For example, from `/build` to `/report`.
-В этом случае важно, чтобы файл `log.txt` был сгенерирован командой для офлайн просмотра.
+In this case, it is important that the `log.txt` file is generated by the command for offline viewing.
### How to rebuild the report build?
-- Download this repository
-- Run `npm install`
-- Run `npm run build`
-- The new build will be in the `/build` folder
+- download this repository
+- run `npm install`
+- run `npm run build`
+- the new build will be in the `/build` folder
### How to view a report on a group of microservices?
-- Generate for each microservice `log.txt` (`log-1.txt`, `log-2.txt`, `log-3.txt` и т.д.)
-- See “How to view an online report?”. At the last step, drag all the files at once into the browser window.
-- See “How to see a report offline?”. At the second step, drag all microservice files (`log-1.txt`, `log-2.txt`, `log-3.txt` and etc.) to the report folder (`/build`).
+- generate for each microservice file `log.txt` (`log-1.txt`, `log-2.txt`, `log-3.txt` and etc.)
+- see “How to view an online report?”. At the last step, drag all the files at once into the browser window.
+- see “How to see a report offline?”. At the second step, drag all microservice files (`log-1.txt`, `log-2.txt`, `log-3.txt` and etc.) to the report folder (`/build`).
### How to brand the interface?
-Вы можете написать свою тему для интерфейса. Можно менять:
-- **Заголовок**. Вы можете указать его в URL-параметре ```title```. Например: ```?title=You Company```
-- **Визуальную тему**. Для этого нужно подготовить CSS файл с новыми стилями и указать его адрес в URL-параметре ```theme```. Например: ```?theme=//company.com/some.css```. Вы можете использовать имена классов в качестве селекторов. Большинство из них не меняется в при выходе новой версий.
-- **Язык**. Вы можете указать его в URL-параметре ```lang```. Например: ```?lang=es```
+You can create your own interface theme. Options:
+- **Title**. You can set default document title in the URL parameter ```title```. Example: ```?title=You Company```
+- **Visual theme**. To do this, you need to prepare a CSS file with new styles and specify its URL in the ```theme``` parameter. Example: ```?theme=//company.com/some.css```. You can use class names as selectors. Most of them do not change in new versions.
+- **Language**. You can set language in the URL parameter ```lang```. Example: ```?lang=es```
-### Как добавить или отредактировать перевод?
+### How to add or edit a translation?
-Вы можете добавить новый перевод или поправить текущий в разделе ```ts/translations/``` и создать Pull Request.
+You can add a new translation or correct an existing one in the ```ts/translations/``` folder and create a Pull Request.
-### Как подписывать коммиты?
+### How to sign commits?
-Следуйте практике [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/). Например:
+Follow the [Conventional Commits 1.0.0](https://www.conventionalcommits.org/en/v1.0.0/). Example:
```
JIRA-1234 feat(profile): Added avatar for user
```
-- номер задачи в таск трекере `(JIRA-1234)`
-- тип работы `(feat, fix, style, refactor, test, doc и т.д.)`
-- фича `(profile - раздел сайта, страница или новый функционал, одним словом)`
-- какую проблему решали `(Added avatar for user)`
+- task number in the task tracker `(JIRA-1234)`
+- type of work `(feat, fix, style, refactor, test, doc и т.д.)`
+- feature `(profile - new page on site or new function, use one (two) short wordor an abbreviation)`
+- what problem were solved `(Added avatar for user)`
-### Как автоматизировать сбор данных?
+### How to automate data collection?
-#### Без бекенда
-- создайте клон нужного вам репозитория;
-- скопируйте в корень папку `build`;
-- откройте `build/index.html` в браузере и добавьте в закладки;
-- добавьте ярлык на `build/assets/ci-cd.sh` в папку автозагрузки (Windows);
+#### Without backend
+- create a clone of the repository you need;
+- copy the `build` folder to the root;
+- open `build/index.html` in the browser and add it to bookmarks;
+- add a shortcut to `build/assets/ci-cd.sh` to the startup folder (Windows);
-Каждый раз, при перезагрузке компьютера, скрипт будет обновлять статистику по всем данным, которые автоматически влились в основную ветку.
+Every time you restart the computer, the script will update statistics on all the data that automatically merged into the main branch.
### DevOps (CI/CD)
-#### Публичный сервер
-
-Вы можете выкладывать файл с данными для построения отчёта на публичный URL. А для его визуализации использовать веб-интерфейс сайта [assayo](https://assayo.jp/). Просто укажите адресс, где лежат данные, в URL-параметре ```dump```:
+#### Public server
+You can upload the data file for report construction to a public URL. And use the website’s [assayo](https://assayo.jp/?ref=github&lang=en) to visualize it.
```
https://assayo.jp/demo/?dump=//you_site.com/some/log.txt
```
-#### Приватный сервер
-- скачайте [docker образ](https://hub.docker.com/r/bakhirev/assayo);
-- поднимите его в локальной сети;
-- для просмотра отчётов используйте веб-интерфейс указывая ему адресс, где лежат данные, в URL-параметре ```dump```:
+#### Private server
+- download the [docker image](https://hub.docker.com/r/bakhirev/assayo);
+- run it on your local network;
+- use the web interface to view the reports, set the URL of the data in the URL parameter ```dump```:
```
http://assayo_url/?dump=//you_url/some/log.txt
-assayo_url - URL адресс контейнера assayo, он слушает 80 порт;
-you_url - URL адресс вашего контейнера с логами git;
+assayo_url - URL of the assayo container, it listens on port 80;
+you_url - URL of your container with git logs;
```
-По умолчанию образ запустится по адресу ```http://127.0.0.1:80/```. Если не получилось проверьте свободен ли у вас 80 порт.
-#### Обновление Docker-образа
+By default, the image will run at ```http://127.0.0.1:80/```. If it doesn't work, check if port 80 is free.
-- удилить метрику, аллерты, старые билды;
-- собрать билд ```npm run build```
-- собрать образ ```docker build -t assayo .```
-- визуально проверить образ ```docker run --name assayo -p 80:80 -d assayo```;
-- поставить тег ```docker tag IMAGE_ID bakhirev/assayo:latest```;
-- запушить образ в Docker Hub
+#### How to update the Docker image?
+- remove metrics, alerts, old builds;
+- run ```npm run build```
+- run ```docker build -t assayo .```
+- visually check the image ```docker run --name assayo -p 80:80 -d assayo```;
+- add tag ```docker tag IMAGE_ID bakhirev/assayo:latest```;
+- push image to [Docker Hub](https://hub.docker.com/r/bakhirev/assayo);
-### Релизы, примерно, раз в полгода. Что дальше:
+### Releases are planned approximately once every six months. What’s next:
+- more recommendations and achievements;
+- annual/monthly summaries, report printing;
+- localization and internationalization;
+- file analysis;
+- different roles for statistics (hiding finances);
+- development of the backend, integration with other systems;
-- больше советов и достижений;
-- итоги года / месяца, печать отчётов;
-- локализация и интернационализация;
-- анализ файлов;
-- разные роли для статистики (скрытие финансов);
-- разработка бекенда, интеграции с другими системами;
-
-### Пожелания, предложения, замечания
-- telegramm [@bakhirev](https://t.me/bakhirev) (приоритетный способ связи)
+### Feedback, suggestions, comments
+- telegramm [@bakhirev](https://t.me/bakhirev) (priority method of communication)
- [alexey-bakhirev@yandex.ru](mailto:alexey-bakhirev@yandex.ru)
-- сайт [https://assayo.jp/](https://assayo.jp/)
+- website [https://assayo.jp/](https://assayo.jp/)
diff --git a/documents/RU.md b/documents/RU.md
index 4fc5733..3314ec0 100644
--- a/documents/RU.md
+++ b/documents/RU.md
@@ -81,7 +81,7 @@ Git создаст файл `log.txt`.
- Свежая сборка будет в папке `/build`
### Как посмотреть отчёт по группе микросервисов?
-- Сгенерировать для каждого микросервиса `log.txt` (`log-1.txt`, `log-2.txt`, `log-3.txt` и т.д.)
+- Сгенерировать для каждого микросервиса файл `log.txt` (`log-1.txt`, `log-2.txt`, `log-3.txt` и т.д.)
- См. «Как посмотреть отчёт онлайн?». На последнем шаге перетащить сразу все файлы в окно браузера.
- См. «Как посмотреть отчёт офлайн?». На втором шаге перетащить все файлы микросервисов (`log-1.txt`, `log-2.txt`, `log-3.txt` и т.д.) в папку отчета (`/build`).
diff --git a/documents/nostalgie.bat b/documents/nostalgie.bat
new file mode 100644
index 0000000..cfe82c1
--- /dev/null
+++ b/documents/nostalgie.bat
@@ -0,0 +1,17 @@
+@echo off
+
+for /f "skip=1 usebackq" %%g in (`wmic nicconfig where "description like '%%Check Point%%' and DHCPServer is not null" get DHCPServer ^| findstr /r /v "^$"`) do (
+ if "%%g"=="" (
+ echo Cannot find correct CheckPointGateway
+ goto:eof
+ ) else (
+ SET CheckPointGateway=%%g
+ )
+)
+echo CheckPointGateway=%CheckPointGateway%
+for /f "tokens=1,2,3 usebackq" %%g in (`route PRINT ^| findstr "%CheckPointGateway%"`) do (
+ echo %%g | >nul findstr /r /c:"10\..*" || echo %%g | >nul findstr /r /c:"192\.168\..*" || echo %%g | >nul findstr /r /c:"172\.[0-2][0-9]\..*" || echo %%g | >nul findstr /r /c:"172\.3[0-1]\..*" || (
+ route DELETE %%g mask %%h %%i >nul
+ )
+ echo | set /p="."
+)
diff --git a/public/assets/chart/2022-11-17 18-36-47.mkv b/public/assets/chart/2022-11-17 18-36-47.mkv
deleted file mode 100644
index 2bcaf9a..0000000
Binary files a/public/assets/chart/2022-11-17 18-36-47.mkv and /dev/null differ
diff --git a/public/assets/chart/2023-03-15_17-28-09.mp4 b/public/assets/chart/2023-03-15_17-28-09.mp4
deleted file mode 100644
index 35f7883..0000000
Binary files a/public/assets/chart/2023-03-15_17-28-09.mp4 and /dev/null differ
diff --git a/public/assets/menu/arrow_left.svg b/public/assets/menu/arrow_left.svg
new file mode 100644
index 0000000..aa76378
--- /dev/null
+++ b/public/assets/menu/arrow_left.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/assets/menu/arrow_right.svg b/public/assets/menu/arrow_right.svg
new file mode 100644
index 0000000..f597d99
--- /dev/null
+++ b/public/assets/menu/arrow_right.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/menu/arrow_left.svg b/src/assets/menu/arrow_left.svg
new file mode 100644
index 0000000..aa76378
--- /dev/null
+++ b/src/assets/menu/arrow_left.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/menu/arrow_right.svg b/src/assets/menu/arrow_right.svg
new file mode 100644
index 0000000..f597d99
--- /dev/null
+++ b/src/assets/menu/arrow_right.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/index.tsx b/src/index.tsx
index 5bab393..b0d505a 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -21,8 +21,8 @@ if (module.hot) {
module.hot.accept();
}
-localization.parse('ru', ru);
localization.parse('en', en);
+localization.parse('ru', ru);
function renderReactApplication() {
// @ts-ignore
diff --git a/src/ts/components/Cards/styles/index.module.scss b/src/ts/components/Cards/styles/index.module.scss
index ef0c572..95df9e1 100644
--- a/src/ts/components/Cards/styles/index.module.scss
+++ b/src/ts/components/Cards/styles/index.module.scss
@@ -51,7 +51,6 @@
&_title {
width: 60%;
- max-width: 200px;
}
&_value {
diff --git a/src/ts/helpers/Localization/index.ts b/src/ts/helpers/Localization/index.ts
index 1033fec..6b618a0 100644
--- a/src/ts/helpers/Localization/index.ts
+++ b/src/ts/helpers/Localization/index.ts
@@ -1,5 +1,5 @@
class Localization {
- language:string = 'en';
+ language:string = 'ru';
translations: any = {};
diff --git a/src/ts/pages/PageWrapper/components/LightHeader/index.tsx b/src/ts/pages/PageWrapper/components/LightHeader/index.tsx
new file mode 100644
index 0000000..9420eaa
--- /dev/null
+++ b/src/ts/pages/PageWrapper/components/LightHeader/index.tsx
@@ -0,0 +1,35 @@
+import React from 'react';
+import { useParams } from 'react-router-dom';
+
+import localization from 'ts/helpers/Localization';
+
+import style from '../../styles/light_header.module.scss';
+
+function LightHeader() {
+ const { type, page } = useParams();
+ const title = type && page
+ ? localization.get(`sidebar.${type}.${page}`)
+ : localization.get('sidebar.team.total');
+
+ return (
+
+
+ >
+ );
+}
+
+export default Footer;
diff --git a/src/ts/pages/PageWrapper/index.tsx b/src/ts/pages/PageWrapper/index.tsx
index fe93bd6..869215f 100644
--- a/src/ts/pages/PageWrapper/index.tsx
+++ b/src/ts/pages/PageWrapper/index.tsx
@@ -2,8 +2,10 @@ import React, { ReactNode } from 'react';
import SideBar from './components/sidebar';
import Header from './components/header';
+import Footer from './components/footer';
import Print from './components/Print';
import style from './styles/index.module.scss';
+import LightHeader from './components/LightHeader';
interface IPageWrapper {
children: ReactNode;
@@ -13,14 +15,19 @@ interface IPageWrapper {
function PageWrapper({
children,
}: IPageWrapper) {
+ const isMobile = false;
return (
-
-
+ {!isMobile && }
+ {isMobile
+ ?
+ :
+ }
{children}
+ {isMobile && }
);
}
diff --git a/src/ts/pages/PageWrapper/styles/footer.module.scss b/src/ts/pages/PageWrapper/styles/footer.module.scss
new file mode 100644
index 0000000..f43dd67
--- /dev/null
+++ b/src/ts/pages/PageWrapper/styles/footer.module.scss
@@ -0,0 +1,72 @@
+@import 'src/styles/variables.scss';
+
+.footer {
+ position: fixed;
+ bottom: var(--space-s);
+ left: var(--space-s);
+ right: var(--space-s);
+ text-align: center;
+ pointer-events: none;
+
+ &_wrapper {
+ display: inline-block;
+ width: 300px;
+ margin: 0 auto;
+ padding: 0;
+ text-align: center;
+ white-space: nowrap;
+ pointer-events: auto;
+ box-shadow: 0 0 var(--space-l) #F5F7F9, 0 0 var(--space-l) #F5F7F9;
+ border-radius: var(--border-radius-m);
+ background-color: var(--color-black);
+ }
+
+ &_gap {
+ display: block;
+ height: 80px;
+ }
+
+ &_button {
+ display: inline-block;
+ width: 25%;
+ text-align: center;
+ white-space: normal;
+ vertical-align: top;
+ cursor: pointer;
+ box-sizing: border-box;
+
+ &_text {
+ font-size: var(--font-s);
+ font-weight: 100;
+ display: block;
+ width: 100%;
+ padding: 0 0 var(--space-m);
+ margin: 0 auto;
+
+ overflow: hidden;
+ text-overflow: ellipsis;
+ text-decoration: none;
+ text-align: center;
+ border: none;
+
+ color: #84858D;
+ }
+
+ &_icon {
+ display: block;
+ width: 32px;
+ height: 32px;
+ margin: var(--space-s) auto var(--space-xxs);
+ background-repeat: no-repeat;
+ background-size: 100% auto;
+ }
+ }
+}
+
+@media (max-width: 700px) {
+ .footer {
+ &_wrapper {
+ width: 100%;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ts/pages/PageWrapper/styles/header.module.scss b/src/ts/pages/PageWrapper/styles/header.module.scss
index 0bf7460..b365d52 100644
--- a/src/ts/pages/PageWrapper/styles/header.module.scss
+++ b/src/ts/pages/PageWrapper/styles/header.module.scss
@@ -27,11 +27,21 @@
user-select: none;
vertical-align: top;
}
+
&_print {
margin-right: 24px;
}
}
+@media (max-width: 700px) {
+ .header {
+ &_print,
+ &_setting {
+ display: none;
+ }
+ }
+}
+
@media print {
.header {
display: none;
diff --git a/src/ts/pages/PageWrapper/styles/index.module.scss b/src/ts/pages/PageWrapper/styles/index.module.scss
index 295f4bc..5af03a8 100644
--- a/src/ts/pages/PageWrapper/styles/index.module.scss
+++ b/src/ts/pages/PageWrapper/styles/index.module.scss
@@ -30,6 +30,16 @@
}
}
+@media (max-width: 700px) {
+ .page_wrapper {
+ grid-template-areas: 'header header' 'main main';
+
+ &_main {
+ width: calc(100vw - 20px);
+ }
+ }
+}
+
@media print {
.page_wrapper {
grid-template-areas: 'main main' 'main main';
diff --git a/src/ts/pages/PageWrapper/styles/light_header.module.scss b/src/ts/pages/PageWrapper/styles/light_header.module.scss
new file mode 100644
index 0000000..ba6ceab
--- /dev/null
+++ b/src/ts/pages/PageWrapper/styles/light_header.module.scss
@@ -0,0 +1,44 @@
+@import '../../../../styles/variables';
+
+.light_header {
+ grid-area: header;
+ display: flex;
+ padding: 0;
+ justify-content: space-between;
+ align-items: center;
+ white-space: nowrap;
+ background-color: #FFFFFF;
+
+ &_title {
+ font-size: 24px;
+ font-weight: 100;
+
+ display: inline-block;
+ width: calc(100% - 96px);
+ padding: 0;
+ margin: 0 auto;
+ text-align: center;
+ vertical-align: top;
+ white-space: normal;
+ color: var(--color-black);
+ }
+
+ &_button {
+ display: inline-block;
+ width: 48px;
+ height: 100%;
+ padding: 0;
+ cursor: pointer;
+ user-select: none;
+ vertical-align: top;
+ background-repeat: no-repeat;
+ background-size: 100% auto;
+ background-position: center;
+ background-image: url('../../../../assets/menu/arrow_right.svg');
+
+ &:first-child {
+ background-image: url('../../../../assets/menu/arrow_left.svg');
+ }
+ }
+}
+
diff --git a/src/ts/translations/es/achievements.ts b/src/ts/translations/es/achievements.ts
new file mode 100644
index 0000000..00ec626
--- /dev/null
+++ b/src/ts/translations/es/achievements.ts
@@ -0,0 +1,94 @@
+export default `
+§ achievements.commitsAfter1500.title: Сова
+§ achievements.commitsAfter1500.description: 70% коммитов после 15:00
+§ achievements.commitsBefore1500.title: Ранняя пташка
+§ achievements.commitsBefore1500.description: 70% коммитов до обеда
+§ achievements.workEveryTime.title: Раб божий
+§ achievements.workEveryTime.description: есть коммит на каждый час суток
+§ achievements.workNotWork.title: Стрельба холостыми
+§ achievements.workNotWork.description: коммиты есть, а закрытых задач нет
+§ achievements.userNotWork.title: Залётный
+§ achievements.userNotWork.description: это не его основной проект
+§ achievements.userIsDied.title: Мёртвая душа
+§ achievements.userIsDied.description: работал, но уволился
+§ achievements.lessTasks.title: Зашел и вышел
+§ achievements.lessTasks.description: меньше всего закрытых задач
+§ achievements.moreTasks.title: Батя грит малаца
+§ achievements.moreTasks.description: больше всего закрытых задач
+§ achievements.everyMessageLong.title: Мастер красноречия
+§ achievements.everyMessageLong.description: стабильно самые длинные подписи коммитов
+§ achievements.everyMessageShort.title: Болтун находка для шпиона
+§ achievements.everyMessageShort.description: стабильно, самые короткие подписи коммитов
+§ achievements.shortestName.title: Размер не главное
+§ achievements.shortestName.description: самое короткое имя
+§ achievements.longestName.title: Азим Азиз Иль Ам Кадир Имран II
+§ achievements.longestName.description: самое длинное имя
+§ achievements.moreCommits.title: Мастер бекапов
+§ achievements.moreCommits.description: больше всего коммитов
+§ achievements.lessCommits.title: Редко но метко
+§ achievements.lessCommits.description: меньше всего коммитов
+§ achievements.oneCommitOneTask.title: Точно в цель
+§ achievements.oneCommitOneTask.description: в среднем один коммит на задачу
+§ achievements.moreLazyDays.title: Мысленно я с вами
+§ achievements.moreLazyDays.description: больше всего дней без коммитов
+§ achievements.lessLazyDays.title: Папа Карло
+§ achievements.lessLazyDays.description: меньше всего дней без коммитов
+§ achievements.zeroLazyDays.title: Ни единого разрыва
+§ achievements.zeroLazyDays.description: ни одного дня без коммитов
+§ achievements.moreWorkDays.title: Ценный работник
+§ achievements.moreWorkDays.description: больше всего рабочих дней
+§ achievements.moreScopes.title: Стартапер
+§ achievements.moreScopes.description: сделал больше всего фичей
+§ achievements.lessScopes.title: Щегол
+§ achievements.lessScopes.description: сделал меньше всего фичей
+§ achievements.moreDaysForTask.title: Улитка на склоне
+§ achievements.moreDaysForTask.description: работа по задачам идёт медленнее чем у остальных
+§ achievements.more2DaysForTask.title: Cо слоу
+§ achievements.more2DaysForTask.description: больше двух дней на задачу
+§ achievements.moreDaysInProject.title: Старожил
+§ achievements.moreDaysInProject.description: больше всего дней на проекте
+§ achievements.lessDaysInProject.title: А это кто?
+§ achievements.lessDaysInProject.description: меньше всего дней на проекте
+§ achievements.more90DaysInProject.title: Добро пожаловать
+§ achievements.more90DaysInProject.description: не уволили на испытательном
+§ achievements.lessDaysForTask.title: Скорострел
+§ achievements.lessDaysForTask.description: одна задача занимает меньше дня
+§ achievements.adam.title: Адам
+§ achievements.adam.description: первый стабильный сотрудник на проекте
+§ achievements.more666DaysInProject.title: Чёрт
+§ achievements.more666DaysInProject.description: отработал 666 дней на проекте
+§ achievements.more777DaysInProject.title: Азино 3 топора
+§ achievements.more777DaysInProject.description: отработал 777 дней на проекте
+§ achievements.moreRefactoring.title: Выпускающий редактор
+§ achievements.moreRefactoring.description: сделал больше всех меток «рефакторинг»
+§ achievements.longestMessage.title: А разговоров то было...
+§ achievements.longestMessage.description: самая длинная подпись коммита за все время
+§ achievements.moreTasksInDay.title: Спиди-гонщик
+§ achievements.moreTasksInDay.description: рекорд по количеству закрытых задач в день
+§ achievements.hasCommitFrom0to7.title: Ночной дозор
+§ achievements.hasCommitFrom0to7.description: есть коммит на каждый час ночи
+§ achievements.noCommitOnDay.title: Технический перерыв
+§ achievements.noCommitOnDay.description: есть определенный час и день в рабочее время в который никогда не комитит
+§ achievements.hasCommitEveryTime.title: Умер на работе
+§ achievements.hasCommitEveryTime.description: есть коммит на час каждого дня (включая выходные)
+§ achievements.commitsAfter1800.title: Делу время
+§ achievements.commitsAfter1800.description: нет ни одного коммита после 18:00
+§ achievements.more1488DaysInProject.title: им. Максима Марцинкевича
+§ achievements.more1488DaysInProject.description: отработал 1488 дней на проекте
+§ achievements.taskNumber300.title: Знаком с трактористом
+§ achievements.taskNumber300.description: первый взял в работу задачу с номером 300
+§ achievements.moreFix.title: Bug hunter
+§ achievements.moreFix.description: больше всего закрытых багов
+§ achievements.lessWorkDays.title: Дальше без меня
+§ achievements.lessWorkDays.description: меньше всего рабочих дней
+§ achievements.moreCreateCode.title: Созидатель
+§ achievements.moreCreateCode.description: склонен больше остальных добавлять код
+§ achievements.moreRemoveCode.title: Разрушитель
+§ achievements.moreRemoveCode.description: склонен больше остальных удалять код
+§ achievements.moreChangeCode.title: Реформатор
+§ achievements.moreChangeCode.description: склонен больше остальных изменять код
+§ achievements.moreStyle.title: Полиция моды
+§ achievements.moreStyle.description: склонен больше остальных изменять CSS
+§ achievements.moreOnHoliday.title: Нет жизни
+§ achievements.moreOnHoliday.description: относительно много коммитов в нерабочее время
+`;
diff --git a/src/ts/translations/es/common.ts b/src/ts/translations/es/common.ts
new file mode 100644
index 0000000..ccbd16b
--- /dev/null
+++ b/src/ts/translations/es/common.ts
@@ -0,0 +1,30 @@
+export default `
+§ uiKit.console.button: Copiar
+§ uiKit.console.notification: El texto ha sido copiado
+§ uiKit.dataLoader.page: Página
+§ uiKit.dataLoader.size: Mostrando hasta
+§ uiKit.dataLoader.from: de
+§ uiKit.dataLoader.all: Mostrar todo
+§ uiKit.hoursChart.work: horario laboral normal (lunes a viernes, de 07:00 a 20:00)
+§ uiKit.hoursChart.weekend: días o horario antes/después del día laboral
+§ uiKit.hoursChart.days: número total de commits en un día y una hora específica
+§ uiKit.page.remove: Eliminar
+§ uiKit.races.go: ¡Adelante!
+§ uiKit.nothingFound.common.title: No hay o no hay suficientes datos para mostrar
+§ uiKit.nothingFound.common.description: El sistema procesará más datos si los commits se firman con el formato de [Git commit message convention|https://www.conventionalcommits.org/en/v1.0.0/]. Patrón:
+§ uiKit.nothingFound.common.console: Número_de_tarea tipo(característica): descripción
+§ uiKit.nothingFound.common.example: Por ejemplo:
+§ uiKit.nothingFound.personal.title: No hay datos para este colaborador
+§ uiKit.nothingFound.personal.description1:
+El no hizo cambios todos los días laborables y obtuvo el estado “Asistente”.
+El trabajo de los colaboradores con este estatus en este proyecto puede desestimarse, ya que su aporte en el conjunto es insignificante.
+
+§ uiKit.nothingFound.staff.description2:
+Поэтому система не рассчитывает для него ряд показателей.
+Если это ошибка и данного сотрудника нужно рассчитать как обычного, перейдите в раздел «Настройки» и измените его тип.
+
+§ common.title: Estadísticas git
+§ common.filters: Filtros
+§ common.notifications.save: Cambios guardados
+§ common.notifications.setting: Ajustes guardados
+`;
\ No newline at end of file
diff --git a/src/ts/translations/es/index.ts b/src/ts/translations/es/index.ts
new file mode 100644
index 0000000..4ab6104
--- /dev/null
+++ b/src/ts/translations/es/index.ts
@@ -0,0 +1,15 @@
+import achievements from './achievements';
+import common from './common';
+import navigation from './navigation';
+import recommendations from './recommendations';
+import settings from './settings';
+import pages from './pages';
+
+export default [
+ achievements,
+ common,
+ navigation,
+ recommendations,
+ settings,
+ pages,
+].join('');
\ No newline at end of file
diff --git a/src/ts/translations/es/navigation.ts b/src/ts/translations/es/navigation.ts
new file mode 100644
index 0000000..9264632
--- /dev/null
+++ b/src/ts/translations/es/navigation.ts
@@ -0,0 +1,37 @@
+export default `
+§ sidebar.switch.team: Команда
+§ sidebar.switch.person: Сотрудник
+§ sidebar.buttons.settings: Настройки
+§ sidebar.buttons.print: Печать
+§ sidebar.filters.all: всё время
+§ sidebar.filters.year: год
+§ sidebar.filters.halfYear: пол года
+§ sidebar.filters.month: месяц
+§ sidebar.filters.week: неделя
+§ sidebar.team.total: Общая информация
+§ sidebar.team.scope: Фичи
+§ sidebar.team.author: Сотрудники
+§ sidebar.team.type: Типы задач
+§ sidebar.team.pr: Влитие кода
+§ sidebar.team.day: По дням
+§ sidebar.team.week: По неделям
+§ sidebar.team.month: По месяцам
+§ sidebar.team.tree: Анализ файлов
+§ sidebar.team.hours: Расписание
+§ sidebar.team.commits: Все коммиты
+§ sidebar.team.changes: Все изменения
+§ sidebar.team.words: Популярные слова
+§ sidebar.team.top: Викторина
+§ sidebar.team.settings: Настройки
+§ sidebar.person.total: Общая информация
+§ sidebar.person.money: Стоимость работы
+§ sidebar.person.speed: Скорость
+§ sidebar.person.day: По дням
+§ sidebar.person.week: По неделям
+§ sidebar.person.month: По месяцам
+§ sidebar.person.hours: Расписание
+§ sidebar.person.commits: Все коммиты
+§ sidebar.person.changes: Все изменения
+§ sidebar.person.words: Популярные слова
+§ sidebar.person.settings: Настройки
+`;
\ No newline at end of file
diff --git a/src/ts/translations/es/pages.ts b/src/ts/translations/es/pages.ts
new file mode 100644
index 0000000..f22f4ef
--- /dev/null
+++ b/src/ts/translations/es/pages.ts
@@ -0,0 +1,201 @@
+export default `
+§ page.welcome.step1: Выполните команду в корне вашего проекта
+§ page.welcome.step3: Перетащите
+§ page.welcome.step4: файл log.txt на эту страницу
+§ page.welcome.description: Git создаст файл log.txt. Он содержит данные для построения отчёта. Или git shortlog -s -n -e если отчёт вам не нужен. Создайте файл [.mailmap|https://git-scm.com/docs/gitmailmap] в корне проекта, чтобы объединить статистику по сотрудникам.
+§ page.welcome.warning1: Сервис *НЕ ХРАНИТ* и *НЕ ПЕРЕДАЁТ* ваши данные. Все расчёты выполняются локально в вашем браузере прямо на вашей машине.
+§ page.welcome.warning2: Сервис *НЕ СОБИРАЕТ СТАТИСТИКУ* по проектам. Вы можете отключить интернет, проверить трафик и даже собрать локальный билд из [исходников|https://github.com/bakhirev/assayo].
+§ page.common.words.title: Статистика по словам
+§ page.common.words.description: самое популярное слово. Встречается $1 раза.
+§ page.common.commits.title: Количество коммитов по дням
+§ page.common.commits.description: ($1) самый продуктивный день по числу коммитов.
+§ page.common.commits.title2: $1 сделано коммитов: $2
+§ page.common.filter.allUsers: Не имеет значения
+§ page.print.modal.title: Что распечатываем?
+§ page.print.modal.page: Текущую страницу
+§ page.print.modal.type: Текущий раздел
+§ page.print.modal.all: Всю статистику
+§ page.print.modal.cancel: Отмена
+§ page.print.tableOfContents: Оглавление
+§ page.print.title: Отчёт по git-репозиторию «$1»
+§ page.print.description: Данные для отчёта были получены из истории коммитов.
+§ page.team.author.title: Статистика по сотрудникам
+§ page.team.author.description1: *Часть статистики* (скорость работы, затраченные деньги и т.п.) *по сотрудникам с типом «Помощник» не считается*, т.к. это эпизодическая роль в проекте. Предполагаем, что они не влияют на проект, а их правками можно пренебречь на фоне общего объема работы.
+§ page.team.author.description2: *Сортировка по умолчанию* — это сортировка по количеству задач и группам (текущие, уволенные, помогающие сотрудники).
+§ page.team.author.types: Тип работ
+§ page.team.author.commits: Коммитов
+§ page.team.author.commitsSmall: коммитов
+§ page.team.author.tasks: Задач
+§ page.team.author.tasksSmall: задач
+§ page.team.author.workedLosses: Дни с коммитами и без
+§ page.team.author.worked: работа
+§ page.team.author.losses: дни без коммитов
+§ page.team.author.days: дней
+§ page.team.author.daysForTask: Дней на задачу
+§ page.team.author.scopes: Фич
+§ page.team.author.moneyAll: Получил
+§ page.team.author.moneyWorked: Отработал
+§ page.team.author.moneyLosses: Переплата
+§ page.team.hours.title: Распределение коммитов в течении каждого дня недели
+§ page.team.month.title: Календарь работы по проекту
+§ page.team.scope.title: Статистика по фичам
+§ page.team.scope.scope: Фича
+§ page.team.scope.days: Раб. дней
+§ page.team.scope.authorsDays: Человеко-дней
+§ page.team.scope.tasks: Задач
+§ page.team.scope.commits: Коммитов
+§ page.team.scope.commitsSmall: коммитов
+§ page.team.scope.types: Тип работ
+§ page.team.scope.authors: Персональный вклад
+§ page.team.scope.cost: Стоимость
+§ page.team.type.title: Статистика по типам задач
+§ page.team.type.description: *Персональный вклад* считается по количеству коммитов, а не объему измененных строк или файлов. Поэтому следует так же смотреть раздел «Анализ файлов», чтобы оценить масштаб изменений.
+§ page.team.type.type: Тип работы
+§ page.team.type.tasks: Задач
+§ page.team.type.tasksSmall: задач
+§ page.team.type.days: Дней
+§ page.team.type.daysSmall: дней
+§ page.team.type.authorsDays: Человеко-дней
+§ page.team.type.commits: Коммитов
+§ page.team.type.authors: Персональный вклад
+§ page.team.total.titleA: Объём работ
+§ page.team.total.titleB: Стоимость
+§ page.team.total.daysWorked.title: человеко-дней
+§ page.team.total.daysWorked.description: Учтены только дни, в которые делались коммиты
+§ page.team.total.commits.title: коммитов
+§ page.team.total.commits.description: Удалённые ветки не считаются
+§ page.team.total.daysLosses.title: дней без коммитов
+§ page.team.total.daysLosses.description: Все дни минус: праздники, выходные, отпуск, дни с коммитами
+§ page.team.total.employment.title: работает / уволилось
+§ page.team.total.employment.description: Если сотрудник в течении месяца не сделал ни одного коммита, он считается уволенным
+§ page.team.total.moneyAll.title: общая
+§ page.team.total.moneyAll.description: Суммарные затраты на зп
+§ page.team.total.moneyWorked.title: фактическая
+§ page.team.total.moneyWorked.description: Фактически отработанные дни умноженные на среднюю зп
+§ page.team.total.moneyLosses.title: возможная переплата
+§ page.team.total.moneyLosses.description: Оплаченные рабочие дни, когда коммитов не было
+§ page.team.total.weekendPayment.title: работа на выходных
+§ page.team.total.weekendPayment.description: Суммарная переплата за работу в выходные дни
+§ page.team.total.workSpeed.title: задач в день
+§ page.team.total.workSpeed.description: Средняя скорость работы команды при текущем составе сотрудников
+§ page.team.total.moneySpeed.title: в месяц
+§ page.team.total.moneySpeed.description: Прогнозируемая сумма выплаты на зп при текущем составе сотрудников без учета налогов и сопутствующих затрат
+§ page.team.total.description1: *Человеко-дни* — это работа одного сотрудника в течение одного рабочего дня. Например, за один календарный день, команда из трех сотрудников выдает объем работы в три человеко-дня.
+§ page.team.total.description2: *Днями прогулов* считаются только рабочие дни, когда коммиты могли бы быть сделаны. Выходные, государственные праздники и отпуска в расчёте не участвуют.
+§ page.team.total.description3: Карточка *работает и уволилось* показывает фактический состав сотрудников, которые постоянно участвуют в работе. Кроме этого, есть «помощники» — это сотрудники, как правило другой специализации, которые могут иногда делать коммиты в проект.
+§ page.team.total.description4: *Переплатой* считаются только рабочие дни, когда коммиты могли бы быть сделаны. Выходные, государственные праздники и отпуска в расчёте не участвуют. Именно поэтому переплата + фактическая стоимость != общей. В общей стоимости заложена оплата выходных, государственных праздников и отпусков.
+§ page.team.total.description5: *Работой на выходных* считается по коэффициенту х2 от оплаты обычного дня. Выше отображена именно переплата (х1), т.к. сам факт переработки в данном контексте не интересен. Мы не смотрим скорость сжигания бюджета. Мы смотрим переплату при увеличении скорости работы.
+§ page.team.tree.title: Дерево проекта с учётом выбранных фильтров
+§ page.team.tree.filters.author: Сотрудник
+§ page.team.tree.filters.commits: Количество коммитов
+§ page.team.tree.filters.help: Минимальное количество коммитов, которое сделал сотрудник в файле
+§ page.team.tree.filters.all: Все сотрудники
+§ page.team.tree.add: Кто добавлял
+§ page.team.tree.change: Кто менял
+§ page.team.tree.remove: Кто удалял
+§ page.team.tree.line: строк
+§ page.team.tree.lineAdd: добавили
+§ page.team.tree.lineRemove: изменили
+§ page.team.week.title: Статистика по неделям
+§ page.team.week.date: Дата
+§ page.team.week.numberTasks: Количество задач
+§ page.team.week.people: Количество человек
+§ page.team.week.line: Изменение строк
+§ page.team.week.days: Дни с коммитами и без
+§ page.team.week.lossesDetails: Кто не коммитил
+§ page.team.week.add: добавили
+§ page.team.week.change: изменили
+§ page.team.week.remove: удалили
+§ page.team.week.hasCommits: были коммиты
+§ page.team.week.hasNotCommits: небыло коммитов
+§ page.team.week.days: дней
+§ page.team.week.tasks: задач
+§ page.team.pr.task: Задача
+§ page.team.pr.tasks: задач
+§ page.team.pr.firstCommitTime: Первый коммит
+§ page.team.pr.lastCommitTime: Последний
+§ page.team.pr.workDays: Дней разработки
+§ page.team.pr.delayDays: Дней ожидания влития
+§ page.team.pr.commits: Коммиты
+§ page.team.pr.date: Дата влития
+§ page.team.pr.mergeAuthor: Влил
+§ page.team.pr.author: Сотрудник
+§ page.team.pr.middleTimeRelease: Среднее время поставки (дни)
+§ page.team.pr.work: разработка
+§ page.team.pr.delay: ожидание
+§ page.team.pr.days: дней
+§ page.team.pr.oneTaskDays: Время потраченное на одну задачу
+§ page.team.pr.description1: *Время разработки* это разница времени от первого до последнего коммита по задаче. Не важно были перерывы в несколько дней между коммитами или нет. Сам факт какого-либо коммита увеличивает время.
+§ page.team.pr.description2: *Время ожидания* это время между последним коммитом и влитием кода. Оно показывает фактический простой в ожидании чего-либо.
+§ page.team.pr.description3: *Зачем отображать время разработки* без разбивки на кодинг и код-ревью? Затем, чтобы показать бизнесу фактическое время поставки кода. Ожидание тестирования, замечания на ревью, проблемы DevOps и прочие несовершенства процесса, как раз уже заложены в этот срок.
+§ page.team.pr.statByAuthors: Статистика по сотрудникам
+§ page.team.pr.longDelay: Длительное ожидание влития
+§ page.person.print.photo.title: Фотография
+§ page.person.print.photo.description: место для фотографии
+§ page.person.total.title: Основные характеристики
+§ page.person.total.daysWorked.title: дней работы
+§ page.person.total.daysWorked.description: Учтены только дни, в которые делались коммиты
+§ page.person.total.tasks.title: задач
+§ page.person.total.tasks.description: Если коммиты правильно подписаны
+§ page.person.character.title: Персонаж
+§ page.person.achievement.title: Достижения
+§ page.person.achievement.positive: Позитивные
+§ page.person.achievement.normal: Нейтральные
+§ page.person.achievement.negative: Негативные
+§ page.person.achievement.description: Чем больше сотрудник набрал отрицательных достижений, тем больше вероятность, что ситуация нестандартная. Возможно, стоит изменить режим его работы, задачи или отчётность. Следует поговорить с ним и узнать, какие проблемы мешают его работе.
+§ page.person.gets.title: Взятые геты:
+§ page.person.gets.description: «Взять гет» в данном случае означает первым оставить коммит к задаче с «красивым» номером.
+§ page.person.business.days.title: дней работы
+§ page.person.business.days.description: Учтены только дни, в которые делались коммиты
+§ page.person.business.tasks.title: задач
+§ page.person.business.tasks.description: Если коммиты правильно подписаны
+§ page.person.business.losses.title: дней без коммитов
+§ page.person.business.losses.description: Все дни минус: праздники, выходные, отпуск, дни с коммитами
+§ page.person.business.commits.title: коммитов
+§ page.person.business.commits.description: Удалённые ветки не считаются
+§ page.person.business.time.description: Время от первого, до последнего коммита (в том числе, нерабочие дни)
+§ page.person.business.time.title: Дней на проекте:
+§ page.person.business.time.dismissed: (уволен)
+§ page.person.business.time.staff: (не в команде)
+§ page.person.business.achievements: Достижения
+§ page.person.changes.title: Достижения
+§ page.person.changes.description:
+При некоторых видах форматирования git отмечает строки как «удалённые» и «добавленные»,
+хотя на самом деле они были «изменены». Поэтому, если вы провели большой рефакторинг,
+git может показать малое количество изменений в статистике, а фактический результат
+будет отмечен, как скачок «удаленных» и «добавленных» строк.
+§ page.person.changes.description: Список коммитов и количество изменений в них за этот день:
+§ page.person.commits.title: Список коммитов:
+§ page.person.money.title.total: За всё время
+§ page.person.money.title.middle: Средняя стоимость
+§ page.person.money.moneyAll.title: получил
+§ page.person.money.moneyAll.description: Предполагаемая сумма зп с проекта (см. настройки)
+§ page.person.money.moneyWorked.title: отработал
+§ page.person.money.moneyWorked.description: Фактически отработанные дни умноженные на среднюю зп
+§ page.person.money.moneyLosses.title: возможная переплата
+§ page.person.money.moneyLosses.description: Дни без коммитов умноженные на среднюю зп
+§ page.person.money.tasks.title: задача
+§ page.person.money.tasks.description: Количество закрытых задач к стоимости дня
+§ page.person.money.commits.title: коммит
+§ page.person.money.commits.description: Количество коммитов к стоимости рабочего дня
+§ page.person.speed.task: Одна задача в среднем это
+§ page.person.speed.max: Максимальная скорость в день
+§ page.person.speed.days.title: дней
+§ page.person.speed.days.description: Имеются ввиду рабочие дни, если коммиты правильно подписаны
+§ page.person.speed.commits.title: коммитов
+§ page.person.speed.commits.description: Отрезаны 10% максимальных и минимальных значений
+§ page.person.speed.line.title: строк кода
+§ page.person.speed.line.description: Отрезаны 10% максимальных и минимальных значений
+§ page.person.speed.tasks.title: задач
+§ page.person.speed.tasks.description: Задача может быть не доделана, но работа по ней должна быть
+§ page.person.speed.maxCommits.title: коммитов
+§ page.person.speed.maxCommits.description: Задача может быть не доделана, но работа по ней должна быть
+§ page.person.hours.title: Распределение коммитов в течении каждого дня недели
+§ page.person.week.date: Дата
+§ page.person.week.tasks: Количество задач
+§ page.person.week.workDays: Дни с коммитами
+§ page.person.week.taskInDay: Задач в день
+§ page.person.week.days: дней
+§ page.person.week.workDay: будни
+§ page.person.week.weekends: выходные
+`;
\ No newline at end of file
diff --git a/src/ts/translations/es/recommendations.ts b/src/ts/translations/es/recommendations.ts
new file mode 100644
index 0000000..17e5aa9
--- /dev/null
+++ b/src/ts/translations/es/recommendations.ts
@@ -0,0 +1,506 @@
+export default `
+§ recommendations.title
+Рекомендации и факты
+
+§ recommendations.timestamp.firstCommit.description
+сделал первый коммит
+
+День недели: $1
+
+§ recommendations.timestamp.lastCommit.description
+сделал последний коммит
+
+День недели: $1
+
+§ recommendations.timestamp.common.title: $1 дней
+§ recommendations.timestamp.allDays.description: от первого до последнего коммита (включая выходные и праздники).
+§ recommendations.timestamp.lossesDays.description: без коммитов, даже с учётом выходных, отпуска и государственных праздников.
+§ recommendations.timestamp.weekendDays.description
+работы на выходных
+
+# Почему это плохо:
+- заказчик платит двойную цену за работу в выходной день;
+- сотрудники быстрее выгорают;
+
+§ recommendations.timestamp.regularWeekendWord.title: Регулярные переработки
+§ recommendations.timestamp.sometimeWeekendWord.title: Бывают переработки
+§ recommendations.timestamp.weekendWord.description
+Вероятно, стоит сменить менеджера проекта, аналитика и архитектора.
+
+# Почему это плохо:
+- заказчик платит двойную цену за работу в выходной день;
+- качество продукта, как правило, получается низкое;
+- часть сотрудников увольняется;
+- из-за спешки появляются новые ошибки;
+
+# Скорее всего:
+- неверно оценили сроки в самом начале;
+- тех. задание отсутствует;
+- слабая аналитика;
+- слабая архитектура (архитектора не нанимали, а команда состоит из мидл разработчиков);
+- сначала начали писать код, потом проектировать;
+- нет нормальных процессов, чтобы понять ошибки;
+
+§ recommendations.timestamp.neverWeekendWord.title: Обычно без переработок
+§ recommendations.timestamp.neverWeekendWord.description
+Но иногда бывают.
+
+# Почему это плохо:
+- заказчик платит двойную цену за работу в выходной день;
+- сотрудники быстрее выгорают;
+
+§ recommendations.scope.parallelism.not.title
+Нет параллельных работ
+
+§ recommendations.scope.parallelism.not.description
+любую фичу в один момент времени делает один человек.
+
+# Метод расчёта:
+- человеко-дни делятся на фактические дни для каждой фичи;
+- находим среднее арифметическое;
+- если результат меньше 1.3 считаем, что параллельных работ в рамках большинства фичей обычно нет;
+
+# Почему это плохо:
+- повышается bus factor;
+- сотрудники медленнее развиваются;
+- трудно качественно проверить работу сотрудника;
+
+# Почему это хорошо:
+- появляются эксперты, которые очень глубоко погружены в предметную область и могут предложить более качественные решения;
+- скорее всего не бывает merge конфликтов;
+- проект может очень быстро параллельно развиваться в разные стороны;
+
+§ recommendations.scope.parallelism.has.title
+Часть работ параллельно
+
+§ recommendations.scope.parallelism.has.description
+Иногда фичу делают одновременно несколько человек.
+
+# Метод расчёта:
+- человеко-дни делятся на фактические дни для каждой фичи;
+- находим среднее арифметическое;
+- если результат от 1.3 до 2.0 считаем, что часть работ в рамках разных фичей иногда делается параллельно;
+
+
+§ recommendations.scope.parallelism.every.title
+Параллельные работы
+
+§ recommendations.scope.parallelism.every.description
+любую фичу в один момент времени делают несколько человек
+
+# Метод расчёта:
+- человеко-дни делятся на фактические дни для каждой фичи;
+- находим среднее арифметическое;
+- если результат больше двух считаем, что большая часть работ в рамках разных фичей обычно делается параллельно;
+
+
+§ recommendations.scope.money
+в такую сумму можно оценить работу по данному проекту.
+
+# Метод расчёта:
+- человеко-дни затраченные на разработку умножаются на индивидуальную зарплату разработчиков;
+
+Изменить зарплату каждого разработчика, для более точной суммы, можно в разделе «Настройки»
+
+# Это много или мало?
+Для ответа на этот вопрос, нужно ответить на следующие:
+- Можно ли за эти деньги было купить готовое решение?
+- Можно ли за эти деньги сделать более хороший продукт?
+
+Если ответ на оба вопроса «да», то возможно, разработка с нуля не стоила потраченных на неё денег.
+
+§ recommendations.scope.bus.everyHasOne.title
+Bus factor = 1
+
+§ recommendations.scope.bus.everyHasOne.description
+В большинство фич погружен один человек.
+Надо переключать людей.
+
+# Почему это плохо:
+- если сотрудники будут увольняться, будет трудно продолжить их работу;
+- невозможно контролировать качество его кода;
+
+# Как делается выборка:
+- более 80% коммитов в фичу делает один человек;
+- проект имеет более 60% таких фичей;
+
+§ recommendations.scope.bus.oneMaintainer
+в фичи погружен один человек.
+
+# Почему это плохо:
+- если он уволится, будет трудно продолжить разработку;
+- снижается качество code-review;
+- трудно запараллелить разработку при необходимости;
+
+# Как делается выборка:
+- более 80% коммитов в фичу сделал один человек;
+
+§ recommendations.scope.types.process.title
+Плохие процессы
+
+§ recommendations.scope.types.process.description
+Большинство фич содержат один тип задач.
+
+§ recommendations.scope.types.one
+фичи содержат один тип задач.
+
+§ recommendations.scope.types.common
+Возможно, разработчики неправильно подписывают коммиты или менеджер заводит один и тот же тип задач.
+
+# Почему это важно:
+- невозможно передать поддержку другой команде;
+- невозможно выпустить "коробочную" версию;
+- сильная зависимость от конкретных разработчиков;
+- большое количество ошибок и низкое качество кода;
+- вероятное замедление разработки в будущем;
+
+# В чём ошибка менеджера:
+- взгляд на продукт, только с позиции «работающей демки»;
+
+# Что должно быть:
+- тесты;
+- ошибки (выявленные по результатам тестов);
+- рефакторинг (т.к. архитектура может измениться);
+- документация;
+- правки стиля (как результат опроса фокус-группы);
+
+§ recommendations.scope.plan.title
+Постройте долгосрочный план
+
+§ recommendations.scope.plan.description
+с учетом архитектуры.
+
+При том опираться этот план должен сразу на самые трудные задачи.
+
+# Почему отсутствие плана плохо:
+- сотрудники делают минимально работающую версию, не закладывая точки расширения. После этого пишется не масштабируемый код, который тормозит следующие фичи;
+
+# В чём ошибка менеджера:
+- он не показал, как продукт будет развиваться далее и в каких точках будет рост;
+
+# Как должно быть:
+- составляется глобальный план развития продукта;
+- составляется глобальный план развития архитектуры (с разработчиками и DBA);
+- на уровне схем сразу проговариваются моменты, которые могут сильно измениться;
+
+§ recommendations.scope.cost.title
+Оцените инвестиции в фичу
+
+§ recommendations.scope.cost.description
+с количеством потенциальной прибыли.
+
+Фичи которые дорого стоят в разработке, но приносят мало прибыли, возможно, стоит отложить или вообще отменить. Это сделает проект более коммерчески успешным.
+
+§ recommendations.author.lotOfLazy
+пишет слишком мало кода.
+
+# Может уволить?
+- он тимлид, архитектор, аналитик?
+- это его основной проект?
+- есть какие-то зависимости от него?
+
+# Почему нет смысла исправлять
+Суммарные затраты на разработчика уже больше чем прибыль от его работы.
+Если мы считаем, что объективных помех его работе не было, то человек либо не хочет работать вообще, либо работает на двух проектах одновременно.
+Увольнение и замена новым сотрудником выглядит оправданным с точки зрения общей статистики.
+
+§ recommendations.author.manyLazy
+пишет мало кода. Нужно взять на контроль.
+
+# Как делается выборка:
+- на тестовых выборках хороший программист пишет код больше 80% времени;
+- в данном случае показатель от 60% до 80%;
+
+# Как контролировать:
+- дробить задачи на 1..2 дня;
+- каждый день спрашивать статус;
+- убедиться, что задачи хорошо расписаны и готовы к началу разработки;
+- устроить парное программирование, чтобы проверить фактическую скорость;
+
+§ recommendations.author.oneTypeMans
+получает слишком однообразные задачи по типу. Может выгореть.
+
+# Почему это важно:
+- если сотрудник выгорит, его скорость работы снизится;
+- замедляется профессиональный рост;
+- повышается вероятность увольнения;
+
+# Как делается выборка:
+- для каждого коммита определятся тип задачи;
+- если больше 70% задач одного типа, значит человек делает одно и тоже;
+
+§ recommendations.author.workToday.title: Работает $1
+§ recommendations.author.workToday.description
+над проектом в данный момент.
+
+# Состав:
+- $1;
+
+# Почему именно они:
+- рабочих дней более 50%;
+- работали в течении последних 30 дней;
+
+§ recommendations.author.dismissed.title: Уволилось $1
+§ recommendations.author.dismissed.description
+или работало короткий промежуток времени.
+
+# Состав:
+- $1;
+
+# Почему именно они:
+- работали в нормальном ритме (видимо, это их основной репозиторий);
+- за последний месяц не было ни одного коммита;
+- отпуск обычно 14 дней (их отсутствие не похоже на отпуск);
+
+§ recommendations.author.staff.title: Помогают $1
+§ recommendations.author.staff.description
+Люди другой специализации, которые что-либо коммитили.
+
+# Состав:
+- $1;
+
+# Почему именно они:
+- это не open-source проект;
+- рабочих дней менее 15% от общего числа;
+- изменяют примерно одни и те же файлы;
+
+§ recommendations.author.projectType.openSource.title
+Открытый проект
+
+§ recommendations.author.projectType.openSource.description
+пять дней в неделю тут не работают.
+
+Проект может быть и закрытым, просто такой темп работы обычно у открытых библиотек на GitHub.
+
+# Метод оценки:
+- берется статистика по всем активным разработчикам;
+- подсчитывается среднее число дней работы и без коммитов;
+- у open-source библиотек рабочих дней обычно максимум 15..20%;
+
+# Последствия
+Для проектов, где работа не постоянна, нет смысла во многих показателях. Поэтому показатели без коммитов, скорости и т.п. будут скрыты.
+
+Как правило, оценку таких проектов делают перед началом разработки своей закрытой версии. Самые интересные показатели в этом случае вероятная стоимость и суммарное время на разработку.
+
+
+§ recommendations.author.projectType.easy.title
+Слабая загрузка
+
+§ recommendations.author.projectType.easy.description
+слишком много дней без коммитов. Нужно понять почему команда не пишет код.
+
+# Метод оценки:
+- берется статистика по всем активным разработчикам;
+- подсчитывается среднее число дней работы и без коммитов;
+- загрузка считается слабой, если процент без коммитов от 5% до 20%;
+
+# Возможные причины:
+- фактически нет задач;
+- задачи есть, но хорошо ложатся на текущую архитектуру;
+- разработчиков отвлекают совещаниями;
+- команда не работает;
+
+# Варианты решения:
+- обсудить проблему с командой;
+- уменьшить гранулярность задач, чтобы за день можно было успеть сделать одну или две задачи;
+- ввести ежедневные совещания, чтобы проверять движение задач по статусу;
+- устроить сеансы парного программирования, чтобы убедиться, что разработчик может работать быстрее;
+
+§ recommendations.author.manager.title
+Обозначьте дедлайны
+
+§ recommendations.author.manager.description
+У любой задачи должен быть чёткий дедлайн.
+
+Это позволит не затягивать её выполнение на несколько дней или недель.
+
+# Какие показатели стоит проверить:
+- количество дней на одну задачу, которое тратит работник;
+- количество дней ожидания влития PR (страница статистики по PR);
+
+§ recommendations.author.shorTalk.title
+Проводите ежедневные совещания
+
+§ recommendations.author.shorTalk.description
+они помогают быть в курсе проекта.
+
+Не растягивайте их отвлекаясь на посторонние темы.
+
+# На какие вопросы должен ответить сотрудник:
+- что было сделано;
+- что будет сделано;
+- есть ли какие-либо проблемы;
+
+# Следует обрывать монолог, если:
+- начинают подробно описывать мелкие детали, которые не важны;
+- уводят диалог в сторону, от первоначального плана;
+
+# Почему это важно:
+Часто сотрудник, который ничего не делает, старается уйти от ответа. Для этого он рассказывает кучу ненужных подробностей свой работы. Это позволяет усыпить внимание участников и растянуть время ответа. Создается ощущение что он чем-то занят, хотя по факту работы не было.
+
+§ recommendations.author.ipr.title
+Составьте план обучения
+
+§ recommendations.author.ipr.description
+на каждого сотрудника.
+
+*Индивидуальный план обучения* — это список целей и задач, которые помогают человеку развиваться в определенной области.
+
+# Как составить план:
+- составить матрицу компетенций;
+- определить по каким компетенциям меньше всего знаний и опыта;
+- узнать какие из этих компетенций интересны сотруднику;
+- придумать 3..5 целей в рамках каждой такой компетенции на полпостороние года или год;
+- каждый месяц пытаться сделать что-либо для достижения одной цели;
+- каждый месяц напоминать об общем плане достижения этих целей;
+
+# Нужен ли план руководителю?
+Да, руководитель так же должен составить план на себя. Если нет вышестоящего руководителя, то он должен проверять сам себя.
+
+# Почему это важно:
+- сотрудники становятся более лояльны к компании;
+- за теже деньги вы получаете более квалифицированные кадры;
+
+§ recommendations.author.oneToOne.title
+Проводите 1-1 каждый месяц
+
+§ recommendations.author.oneToOne.description
+это поможет выявить проблемы на ранней стадии.
+
+*One-to-one* — это регулярные личные встречи руководителя с подчиненным. На таких встречах обычно обсуждают всё, что важно для сотрудника, что его волнует, и то, чем он может поделиться с руководителем только наедине.
+
+# Почему это важно:
+- легко выяснить, кто из сотрудников перегружен, а у кого есть свободное время;
+- можно предотвратить выгорание сотрудника;
+- можно получить быструю обратную связь о процессах, которые вы можете не замечать;
+- формируется доверительное отношение, сотрудники становятся более лояльны к компании;
+- повышается мотивация и вовлеченность сотрудников;
+
+§ recommendations.author.club.title
+Ходите в бар
+
+§ recommendations.author.club.description
+один раз в месяц или два.
+
+Это поможет выстроить неформальную коммуникацию в коллективе и сплотить команду, даже если общение будет сжатым.
+
+# Почему это важно:
+- можно получить быструю обратную связь о процессах, которые вы можете не замечать;
+- формируется доверительное отношение, сотрудники становятся более лояльны к компании;
+- повышается вовлеченность сотрудников;
+
+§ recommendations.hour.onlyWork.title: Выходных тут нет
+§ recommendations.hour.onlyWork.description: Вероятно, стоит уволить менеджера проекта.
+§ recommendations.hour.weekends.title: Работа на выходных
+§ recommendations.hour.weekends.description: Вероятно, стоит проверить менеджера проекта.
+§ recommendations.hour.easy.title: Бывают проблемы
+§ recommendations.hour.easy.description: Вероятно, бывают завалы и приходится работать на выходных.
+§ recommendations.week.lazyDays.down.title: Стало меньше прогулов
+§ recommendations.week.lazyDays.down.description: за последние три недели этот показатель упал
+§ recommendations.week.lazyDays.up.title: Стало больше прогулов
+§ recommendations.week.lazyDays.up.description: нет задач или нужен более жесткий контроль
+§ recommendations.week.notWork.title: Стабильно не дорабатывает
+§ recommendations.week.notWork.description: т.к. каждую неделю пишет код не 100% времени
+§ recommendations.week.upWork.title: Стабильно перерабатывает
+§ recommendations.week.upWork.description: т.к. каждую неделю пишет код в выходные дни
+§ recommendations.week.task.up.title: Растёт производительность
+§ recommendations.week.task.up.description: или задачи стали слишком мелкие. Нужно проверить. Если гранулярность та же - закрепить результат.
+§ recommendations.week.task.lazyMaintainer.description: стабильный лидер по прогулам. Уволить?
+§ recommendations.week.task.down.title: Падает производительность
+§ recommendations.week.task.down.description
+или задачи хуже разбивают. Нужно проверить. Если гранулярность та же - взять на контроль.
+
+# Метод оценки:
+- количество задач в день, над которыми работают, на протяжении последних трех недель стабильно падает.
+
+# Возможные ошибки:
+- задачи могли быть сложнее, чем казались;
+- задачи могли иметь большой объём работы (нужно проверить количество изменений, падают они или нет за этот же период)
+
+§ recommendations.type.everyHasOne.title: Не подписывают тип задачи
+§ recommendations.type.everyHasOne.description: большинство типов задач делает один человек.
+§ recommendations.type.oneMaintainer.title: Узкая специализация
+§ recommendations.type.oneMaintainer.description
+большинство задач одного типа делают одни и те же люди.
+
+# Типы задач:
+
+§ recommendations.type.common
+# Возможно, это не так
+
+Нужно убедиться, что остальные сотрудники верно подписывают коммиты.
+
+Шаги, которые помогут это сделать:
+- настроить пре-коммит проверку для commit message;
+- объяснить команде, что нужно указывать тип;
+- проверить в новых ветках, что сотрудники следуют правилу;
+
+# Если это действительно так
+
+Вы настроили проверки и убедились что один и тот же сотрудник, делает задачи одного и того же типа.
+
+Почему это плохо:
+- его увольнение остановит целую пачку процессов;
+- уменьшается компетенция остальных членов команды;
+- трудно верхнеуровнево понять его правки;
+
+Как это исправить:
+- распределять разные типы задач равномерно;
+- менять область работы (тесты, документация, ошибки) между сотрудниками через спринт;
+
+§ recommendations.type.fewTypes.title
+Это локальный продукт
+
+§ recommendations.type.fewTypes.description
+для конкретного заказчика или проблемы.
+
+# Какие признаки есть у «глобального» продукта:
+- локализация;
+- документация;
+- большой объём тестов;
+- визуальная кастомизация;
+- рефакторинг узких мест;
+- и т.п.
+
+# Почему этот продукт выглядит как «локальный»:
+- у каждого «глобального» признака будет перевес по своему типу задач;
+- чем больше «глобальных» признаков, тем больше вероятность «глобального» продукта;
+
+В данном случае мы видим небольшое число типов, а следовательно, скорее всего есть недоработки, мешающие легко масштабировать продукт на мировой рынок и продавать его в других странах.
+
+# Возможно, это не так
+По типам файлов мы можем предположить тип программы (сайт, серверное приложение, DevOps скрипты и т.д.). Для frontend приложения наша гипотеза будет более верной, чем для DevOps-скриптов, которые могут быть лишь микро-модулем инициализации.
+
+§ recommendations.type.diff.title
+Разбейте лидирующий тип на подтипы
+
+§ recommendations.type.diff.description
+для детализации ошибок.
+
+Как правило, тип задач с меткой «исправление ошибок» является лидирующим. Это делает статистику слабо-детализированной.
+
+*Если у вас произошла такая ситуация*, вы можете разбить этот тип на подтипы (например, по месту обнаружения).
+
+Рассмотрим несколько вариантов подтипов:
+- fix_dev (ошибка выявленная в процессе разработки);
+- fix_test (ошибка выявленная в процессе тестирования);
+- fix (ошибка выявленная в проде);
+
+§ recommendations.type.buddy.title
+Копите мелкие задачи
+
+§ recommendations.type.buddy.description
+для новых сотрудников.
+
+# Если задача:
+- не важная;
+- не большая;
+- не требует сильного погружения в контекст;
+- больше про рефакторинг, чем про новый код;
+
+# Положите её в backlog с меткой «для новичков».
+
+Когда придёт новый сотрудник, вы сможете моментально достать ему пачку небольших и разнообразных по типу задач, для ознакомления с проектом.
+
+Также, если у вас будет застой в работе, вы сможете доставать по одной такой мелкой задаче из backlog-а.
+`;
diff --git a/src/ts/translations/es/settings.ts b/src/ts/translations/es/settings.ts
new file mode 100644
index 0000000..7ec87c1
--- /dev/null
+++ b/src/ts/translations/es/settings.ts
@@ -0,0 +1,27 @@
+export default `
+§ page.settings.document.title: Настройки отображения
+§ page.settings.document.name: Заголовок страницы
+§ page.settings.document.language: Язык интерфейса
+§ page.settings.links.title: Префиксы ссылок
+§ page.settings.links.task: Для номеров задач
+§ page.settings.links.pr: Для PR
+§ page.settings.user.title: Индивидуальные настройки
+§ page.settings.user.notFound: Индивидуальных настроек нет. Данные по всем сотрудникам вычисляются по общим параметрам.
+§ page.settings.user.subTitle: Дополнение к трудовому договору №$1
+§ page.settings.user.from: Дата начала действия
+§ page.settings.mailmap: Настройки .mailmap
+§ page.settings.common.title: Общие данные по зарплате
+§ page.settings.common.type.title: Тип работы над проектом
+§ page.settings.common.type.full: Полная занятость
+§ page.settings.common.type.part: Проектная работа
+§ page.settings.common.salary: Зарплата в месяц
+§ page.settings.common.currency: Валюта
+§ page.settings.common.workDaysInYear: Количество рабочих дней в году
+§ page.settings.common.vacationDaysInYear: Количество дней отпуска в год
+§ page.settings.common.workDaysInWeek: Рабочие дни
+§ page.settings.form.save: Сохранить
+§ page.settings.form.cancel: Отмена
+§ page.settings.form.remove: Удалить
+§ page.settings.form.addEmployee: Добавить сотрудника
+§ page.settings.form.addContract: Добавить трудовой договор
+`;
\ No newline at end of file