Commit 7d392a64 authored by ransome1's avatar ransome1
Browse files

Added Russian translations, fixed CSS bugs

parent 430f9966
{
"name": "sleek",
"productName": "sleek",
"version": "1.2.3",
"version": "1.2.4-rc.1",
"description": "todo.txt manager for Linux, Windows and MacOS, free and open-source (FOSS)",
"synopsis": "todo.txt manager for Linux, Windows and MacOS, free and open-source (FOSS)",
"category": "ProjectManagement",
......
name: sleek
base: core18
version: "1.2.3"
version: "1.2.4"
summary: todo.txt manager for Linux, free and open-source (FOSS)
description: |
sleek is an open-source (FOSS) todo manager based on the todo.txt syntax. Stripped down to only the most necessary features, and with a clean and simple interface, sleek aims to help you focus on getting things done.
......
......@@ -7,7 +7,7 @@ const i18nextOptions = {
fallbackLng: "en",
namespace: "translation",
defaultNS: "translation",
supportedLngs: ["de", "en", "it", "es", "fr", "zh", "pt", "jp", "tr", "hu", "cs", "pl"],
supportedLngs: ["de", "en", "it", "es", "fr", "zh", "pt", "jp", "tr", "hu", "cs", "pl", "ru"],
debug: false,
preload: fs.readdirSync(path.join(__dirname, "../locales")).filter((fileName) => {
const joinedPath = path.join(path.join(__dirname, "../locales"), fileName)
......
......@@ -12294,6 +12294,7 @@ input.is-medium.input {
width: auto;
cursor: pointer;
color: #5a5a5a;
display: flex;
/*a {
font-size: 1.1em;
font-family: FreeSansBold;
......@@ -12301,6 +12302,9 @@ input.is-medium.input {
padding: 0.15em 0.5em;
}*/
}
#todoTable .cell.text .priority {
align-self: flex-start;
}
#todoTable .cell.text span.linkText {
color: hsl(217deg, 71%, 53%);
}
......@@ -12417,7 +12421,7 @@ input.is-medium.input {
#todoContext {
display: none;
position: fixed;
z-index: 40;
z-index: 50;
border-radius: 0.65em;
box-shadow: 0 0 1em #ccc;
}
......
This diff is collapsed.
......@@ -503,7 +503,7 @@
</td>
</tr>
</table>
<!-- <table id="getPageTitlesRow" class="settings">
<table id="getPageTitlesRow" class="settings">
<tr>
<th colspan="100%" id="getPageTitlesHeadline">Replace links with website titles</th>
</tr>
......@@ -534,7 +534,7 @@
</span>
</td>
</tr>
</table> -->
</table>
<table class="settings">
<tr>
<th colspan="100%" id="zoomHeadline"></th>
......
......@@ -256,7 +256,8 @@ function setFriendlyLanguageNames() {
tr: "Türkçe",
hu: "Magyar",
cs: "Čeština",
pl: "Polski"
pl: "Polski",
ru: "Russian"
}
appData.languages.forEach((languageCode) => {
let option = document.createElement("option");
......
......@@ -42,7 +42,7 @@ let
};
function fillDatePickerInput(todo) {
modalFormInput = document.getElementById("modalFormInput");
//modalFormInput = document.getElementById("modalFormInput");
// empty it
datePickerResult.innerHTML = "";
dateTypes.forEach(function(type) {
......@@ -56,7 +56,7 @@ function fillDatePickerInput(todo) {
//modalFormInput.value = todo.toString();
// put focus on input field
modalFormInput.focus();
document.getElementById("modalFormInput").focus();
}
......@@ -104,15 +104,6 @@ async function createDatepickerInstance(attachToElement, addDateToElement, exten
}
// if there is an active datepicker, it will be destroyed
if(datePicker) datePicker.destroy();
// ******************************************************
// create datepicker instance
// ******************************************************
datePicker = await new Datepicker(attachToElement, datePickerOptions);
// ******************************************************
// prepare todo object if none has been passed
// ******************************************************
......@@ -126,7 +117,16 @@ async function createDatepickerInstance(attachToElement, addDateToElement, exten
});
}
datePicker.show();
// if there is an active datepicker, it will be destroyed
if(datePicker) datePicker.destroy();
// ******************************************************
// create datepicker instance
// ******************************************************
//(todo.due) ? datePickerOptions.defaultViewDate = todo.due : datePickerOptions.defaultViewDate = undefined
datePicker = await new Datepicker(attachToElement, datePickerOptions);
// close datepicker when container loses focus
attachToElement.onblur = function() { datePicker.destroy(); }
......@@ -182,7 +182,6 @@ async function createDatepickerInstance(attachToElement, addDateToElement, exten
}
attachToElement.addEventListener("changeDate", function(event) {
// ******************************************************
// add due date to todo object or remove a given one if no date is passed
// ******************************************************
......@@ -197,6 +196,8 @@ async function createDatepickerInstance(attachToElement, addDateToElement, exten
applyDate(todo, addDateToElement);
});
datePicker.show();
return Promise.resolve("Success: " + extension + " datepicker intance created");
} catch(error) {
......
......@@ -45,18 +45,19 @@ marked.setOptions({
// marked.use({ renderer, walkTokens });
export function isInViewport(item) {
const rect = item.getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
}
// TODO: check if this still works
export function jumpToItem(item) {
try {
const isInViewport = function(item) {
const rect = item.getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
}
// jump to previously edited or added item
// only scroll if new item is not in view
if(!isInViewport(item)) {
......
......@@ -10,7 +10,7 @@ import { createModalJail } from "./jail.mjs";
import { focusRow } from "./keyboard.mjs";
import { showRecurrences, setInput } from "./recurrencePicker.mjs";
import { generateRecurrence } from "./recurrences.mjs";
import { getActiveFile, getDoneFile, handleError, pasteItemToClipboard, generateGenericNotification, generateTodoNotification } from "./helper.mjs";
import { getActiveFile, getDoneFile, handleError, pasteItemToClipboard, generateGenericNotification, generateTodoNotification, isInViewport } from "./helper.mjs";
import { getConfirmation } from "./prompt.mjs";
import { show } from "./form.mjs";
import { SugarDueExtension, RecExtension, ThresholdExtension, PriExtension } from "./todotxtExtensions.mjs";
......@@ -700,6 +700,12 @@ async function createTodoContext(todoTableRow) {
todoContext.style.left = event.x + "px";
todoContext.style.top = event.y + "px";
}
if(!isInViewport(todoContext)) {
console.log(todoContext.clientHeight)
todoContext.style.top = event.y - todoContext.clientHeight + "px";
todoContext.style.left = event.x - todoContext.clientWidth + "px";
}
// ugly but neccessary: if triggered to fast arrow right will do a first row change in jail
setTimeout(function() {
......
{
"about": "О программе",
"addAsTodo": "Создать задачу",
"addTodo": "Добавить задачу",
"addTodoContainerHeadline": "Нет задач",
"addTodoContainerSubtitle": "Список пуст, добавим новые задачи?",
"archive": "Архивировать",
"autoUpdateHeadline": "Автоматическое обновление",
"autoUpdateBody": "Загружена и установлена новая версия. Она будет использована после перезапуска.",
"bdaily": "Каждый рабочий день",
"bday": "рабочий день",
"bday_plural": "рабочие дни",
"cancel": "Отмена",
"clear": "Очистить",
"close": "Закрыть",
"closeTabOrWindow": "Закрыть вкладку или окно (если оно с одной вкладкой)",
"compactView": "Компактный вид",
"completedTodos": "Завершенные",
"contexts": "Контексты",
"copy": "Копировать",
"visibleTodosCopiedToClipboard": "Видимые задачи скопированы в буфер обмена",
"copyVisibleTodosToClipboard": "Копировать видимые задачи в буфер обмена",
"createFile": "Создать todo.txt",
"cut": "Вырезать",
"daily": "Ежедневно",
"themeHeadline": "Вид",
"day": "день",
"day_plural": "дней",
"delete": "Удалить",
"devTools": "Переключить инструменты разработчика",
"done": "Пометить ВЫПОЛНЕНО",
"date": "Дата создания",
"due": "Срок",
"dueDate": "К дате",
"dueFuture": "На будущее",
"duePast": "Просрочено",
"dueToday": "На сегодня",
"dueTomorrow": "На завтра",
"edit": "Редактировать",
"editTodo": "Редактировать задачу",
"errorEventLogging": "Вести лог ошибок и действий",
"every": "Каждый",
"file": "Файл",
"find": "Найти",
"formErrorWritingFile": "<strong>Ошибка:</strong> Изменения не записаны. Проверьте наличие файла todo.txt file exists и права на запись в него: ",
"formInfoDuplicate": "Такая задача уже есть, дубликаты не будут записаны в файл todo.txt.",
"formInfoIncomplete": "Неполный ввод, введите хотя бы текст (задачи).",
"formInfoNoInput": "Введите задачу в текстовое поле. Если Вы затрудняетесь с синтаксисом, крактая справка по ссылке (на английском) <a href=\"https://github.com/todotxt/todo.txt\" target=\"_blank\">todo.txt syntax</a>.",
"formSelectDueDate": "Не установлен срок",
"todoTxtSyntax": "Используте синтаксис todo.txt (A) @context +project due: rec: h: t:",
"function": "Функция",
"help": "Помощь",
"helpTab3Title": "Контексты и проекты",
"helpTab4Title": "Даты",
"recurrences": "Повторение",
"helpTabContextsProjectsBody": "Если проект состоит из нескольких задач, такие задачи можно пометить знаком \"+\" за которым следует название проекта. Контексты определяются ситуациями, в которых могут быть выполнены задачи. В соотвествии с концепцией David Allen <a href=\"https://en.wikipedia.org/wiki/Getting_Things_Done\" target=\"_blank\">Getting Things Done</a>, \"контекст\" может быть дома, на работе, в магазине, по телефону, на компьютере, с определенной персоной. Для добавления контекста используется символ \"@\" с именем контекста. Больше информации по синтаксису todo.txt есть по ссылке <a href=\"https://github.com/todotxt/todo.txt\" target=\"_blank\">todo.txt</a>.<br><br>Имена проектов и контекстов должны писаться слитно, в одно слово с их символами. Число контекстов и проектов не ограничено.",
"helpTabContextsProjectsTitle": "Добавление контекстов и проектов",
"helpTabDatesBody1": "sleek автоматически добавляет дату начала задачи в момент создания. Если нужно изменить ее, укажите ее в задаче сразу после тега приоритета. Задачи с установленным сроком будут показаны в начале списка. Чем ближе дата выполнения или задача просрочена, тем выше она будет в списке. Задачи на сегодня и просроченные будут выделены красным и будут оставлены в начале списка. Чтобы добавить дату готовности напишите \"due:\" после чего напишите дату в формате <strong>YYYY-MM-DD (например, due:2021-03-07)</strong>. Также можно использовать виджет календаря.",
"helpTabDatesBody2": "Даты можно задавать в терминах <strong>tomorrow</strong>, <strong>next Tuesday</strong> or <strong>end of February</strong>, которые будут конвертированы в форматированные даты. Подробности тут: <a href=\"https://sugarjs.com/dates/#/Parsing\" target=\"_blank\">полный спиок удобных названий для дат.</a>",
"helpTabDatesTitle1": "Добавление дат",
"helpTabDatesTitle2": "Удобные названия для дат",
"helpTabKeyboardSubtitle1": "Когда задача промаркирована",
"helpTabKeyboardSubtitle2": "Когда открыто окно редактирования/добавления задачи",
"helpTabKeyboardTR7TD1": "Установить приоритет",
"helpTabKeyboardTR10TD1": "Отправить задачу",
"helpTabKeyboardTR13TD1": "Повысить/понизить приоритет",
"helpTabKeyboardTR14TD1": "Удалить приоритет",
"helpTabKeyboardTR15TD1": "Сдвинуть дату выполнения",
"helpTabKeyboardTR16TD1": "Удалить дату выполения",
"helpTabKeyboardTR17TD1": "Архивировать выполненные задачи в файл done.txt",
"helpTabKeyboardTR25TD1": "Редактировать",
"helpTabKeyboardTR26TD1": "Отметить Выполнено",
"helpTabKeyboardTR27TD1": "Открыть контекст",
"helpTabPrioritiesBody": "Важные задачи должны быть в начале списка. Напишите \"(A)\" в начале текста задачи, чтобы достичь этого. Кроме \"(A\") можно использовать все буквы от A до Z. Однако только A, B и C будут выделены цветом. Все остальные приоритеты будут иметь нейтральную серую пометку. Для установки приоритетов горячими клавишами, нажмите Alt + A до Z в окне добавления/редактирования задачи",
"helpTabPrioritiesTitle": "Добавление приоритета",
"helpTabRecurrencesBody1": "Если необходимо создать повторяющуюся задачу, укажите интервал повтороения, используя обозначение <strong>rec:</strong> (например, <strong>rec:d</strong> для того, чтобы повторять задачу ежедневно). Интерфейс sleek дает возможность установить атрибут rec: для задачи или можно сделать это, редактируя ее описание. Поддерживаются следующие значения <strong>d</strong> ежедневно, <strong>b</strong> по рабочим дням, <strong>w</strong> еженедельно, <strong>m</strong> ежемесячно, <strong>y</strong> ежегодно. Можно также установить иной интервал, например, <strong>rec:3m</strong> для повтора с интервалом в 3 месяца. <a href=\"https://github.com/ransome1/sleek/wiki/Recurring-todos-(rec:)\" target=\"_blank\">Тут более подробная информация</a>.",
"helpTabRecurrencesTitle1": "Добавление повторов",
"hiddenTodos": "Скрытая",
"inProgress": "В работе",
"invertSorting": "Изменить порядок сортировки",
"language": "Язык",
"messageLoggingBody": "Вы можете помочь проекту, согласившись отправлять обезличенные данные об ошибках и событиях в системе. В этом случае будет вестись журнал ошибок и моментов их возникновения. Вы можете разрешить функцию отправки журнала в настройках программы.",
"messageShareBody": "Мы признательны за чесные отзывы на <br><i class=\"fas fa-star\"></i>&nbsp;<a href=\"https://sourceforge.net/projects/sleek/reviews\" target=\"_blank\">SourceForge</a>, отчеты об ошибках на <i class=\"fab fa-github\"></i>&nbsp;<a href=\"https://github.com/ransome1/sleek/issues\" target=\"_blank\">Github</a> и рекомендации программы.",
"messageShareTitle": "sleek <i class=\"fas fa-heart\"></i> вам",
"month": "месяц",
"month_plural": "месяцы",
"monthly": "Ежемесячно",
"noRecurrence": "Без повторов",
"noResultContainerSubtitle": "Нет результатов с учетом установленных критериев поиска и фильтров",
"noResults": "Нет результатов",
"notifications": "Предупреждения",
"of": "из",
"onboardingContainerBtnOpen": "Выберите существующий todo.txt",
"onboardingContainerSubtitle": "Начните с выбора <strong>имеющегося</strong> файла todo.txt или создайте <strong>новый</strong>.",
"open": "Открыть",
"openFile": "Открыть todo.txt",
"paste": "Вставить",
"priorities": "Приоритеты",
"priority": "Приоритет",
"projects": "Проекты",
"printCurrentView": "Распечатать выведенный список",
"reload": "Перезагрузить",
"resetFilters": "Сбросить фильтры и поиск",
"reviewSourceforge": "Страница sleek на SourceForge",
"reviewWindowsStore": "Страница sleek в Windows Store",
"reviewMacAppStore": "Страница sleek в Mac App Store",
"save": "Сохранить",
"search": "(A) Искать, используя синтаксис todo.txt с учетом @context +project due:",
"select": "Выбрать",
"selectFile": "Выбрать файл todo.txt",
"selected": "Выбранные",
"selectedFilters": "Установленные фильтры",
"settings": "Настройки",
"settingsTabAboutContribute": "sleek - программа с открытым кодом и каждый может внести вклад в ее улучшение",
"settingsTabAboutCopyrightLicense": "Copyright и лицензия",
"settingsTabAboutCopyrightLicenseBody": "Copyright (c) 2021 Robin Ahle. sleek распространяется по лицензии <a href=\"https://opensource.org/licenses/MIT\" target=\"_blank\">MIT license</a>. Полный текст ли доступен по ссылке <a href=\"https://github.com/ransome1/sleek/blob/master/LICENSE\" target=\"_blank\">LICENSE</a>.",
"settingsTabAboutExternalLibraries": "Использованное ПО, которое я не разрабатывал",
"settingsTabAboutPrivacy": "Политика защиты персональных данных",
"settingsTabAboutPrivacyBody": "Мне не интересно, кто использует sleek, и я не буду собирать ненужные мне данные. Однако мне интересно, сколько людей с пользой применяют sleek, и, если пользователь явно подтвердил, то, каким образом используется sleek. Данные анонимизируются до отправки, затем отравляются на частный сервер Matomo с использованием шифрованного SSL-соединения. Подробнее в <a href=\"https://github.com/ransome1/sleek/blob/master/PRIVACY.md\" target=\"_blank\">Политике конфиденциальности</a>.",
"settingsTabSettingsArchive": "Архивировать задачи",
"settingsTabSettingsArchiveBody": "Завершенные задачи будут удалены их рабочего файла todo.txt и перемещены в файл done.txt. Если такого файла нет в текущей папке, то он будет создан.",
"themeBody": "Если обычный интерфейс sleek слишком ярок на ваш вкус или для текущего рабочего окружения, темная тема может быть удачной альтернативой.",
"settingsTabSettingsLanguageBody": "sleek автоматически устанавливает локализацию в зависимости от языка операционной системы. Если вам удобнее другой язык, его можно установить вручную.",
"settingsTabSettingsLoggingBody": "Вы можете помочь этому проекту, разрешив автоматичесскую отсылку анонимизжированной информации об использовании sleek. Подробнее описано в <a href=\"https://github.com/ransome1/sleek/blob/master/PRIVACY.md\" target=\"_blank\">Политике нонфиденциальности</a>.",
"settingsTabSettingsNotificationsBody": "sleek может посылать предупреждения о задачах на сегодня и завтра. Для этого программа должна работать.",
"settingsTabSettingsTray": "Минимизировать в трей",
"settingsTabSettingsTrayBody": "С этой настройкой sleek минимизируется в трей и не будет виден на панели задач.",
"compactViewBody": "В компактном режиме интерфейс sleek занимает меньше места. Этот режим удобен для крупного увеличения экрана или для представления максимального числа задач.",
"fileTabsBody": "Если sleek используется с несколькими файлами задач, то они будут добавлены в панель ярлыков для переключения между ними. Эта установка включает или выключает панель ярлыков.",
"zoomBody": "С использованием масштабирования интерфейс sleek может быть увеличен или уменьшен в размере. Эта настройка удобна для подбора размера элементов интерфейса sleek для текущих настроек дисплея.",
"shareFacebook": "Расскажите о sleek на Facebook",
"shareLinkedin": "Расскажите о sleek в LinkedIn",
"shareTwitter": "Расскажите о sleek в Twitter",
"shortcuts": "Горячие клавиши",
"sleekOnGithub": "sleek в Github",
"sortBy": "Сортировать по",
"sortByFile": "Порядок, как в файле",
"sortCompletedLast": "Пометить ЗАВРШЕНО при окончании",
"submitIssuesOnGithub": "Описать проблему на Github",
"switchToSpecificFile": "Переключиться на определенный файл",
"switchToNextFile": "К следующему файлу",
"switchToPreviousFile": "К предыдущему файлу",
"showHelp": "Показать справку",
"today": "Сегодня",
"todos": "Задачи",
"todoCopiedToClipboard": "Задача в буфере обмена",
"toggleCompletedTodos": "Показать/скрыть завершенные задачи",
"toggleTheme": "Переключить темный режим",
"toggleFilter": "Показать фильтры",
"toggleDeferredTodos": "Показать/скрыть отложенные задачи",
"tomorrow": "Завтра",
"useAsTemplate": "Использовать как шаблон",
"view": "Вид",
"viewHeadlineAppView": "Вид приложения",
"viewHeadlineFilterList": "Боковая панель фильтров",
"viewHeadlineTodoList": "Список задач",
"toggleShowEmptyFilters": "Сброшенные фильтры",
"zoomHeadline": "Зум",
"visibleTodos": "Видимые задачи",
"week": "неделя",
"week_plural": "недели",
"weekly": "Еженедельно",
"welcomeToSleek": "Добро пожаловать в sleek",
"windowButtonCreateFile": "Создать файл todo.txt здесь",
"windowButtonOpenFile": "Открыть",
"windowFileformat": "Текстовый файл",
"windowTitleCreateFile": "Создать todo.txt",
"year": "год",
"year_plural": "годы",
"yearly": "Ежегодно",
"archivingPrompt": "Все завершенные задачи будут перемещены в файл done.txt в этой же папке.",
"confirm": "Подтвердить",
"archivingCompletedTitle": "Архивирование завершено",
"archivingCompletedBody": "Завершенные задачи успешно перемещены в ",
"restartPrompt": "Для этих изменений sleek должен стартовать снова. Если это не произойдет, запустите программу вручную.",
"deleteCategoryPrompt": "Этот фильтр будет безвозвратно удален из всех задач.",
"modalBackgroundAttention": "Окно будет закрыто, а содержимое - очищено.",
"deferredTodos": "Пороговая дата в будущем",
"fileRemovalPrompt": "Это действие лишь удалить название из списка файлов, но сам файл на устройстве останется.",
"fileTabsHeadline": "Ярлыки",
"hint_priority": "Задачи отсортированы по приоритету <code>(A...Z)</code>",
"hint_contexts": "Символ @ добавляет <code>@контекст</code> к задаче",
"hint_projects": "<code>+проект</code> добавляется символом + (плюс)"
}
\ No newline at end of file
#todoContext {
display: none;
position: fixed;
z-index: 40;
z-index: 50;
border-radius: $radius;
box-shadow: 0 0 1em $mid-grey;
a, label {
......
......@@ -103,6 +103,10 @@
width: auto;
cursor: pointer;
color: $dark-grey;
display: flex;
.priority {
align-self: flex-start;
}
/*a {
font-size: 1.1em;
font-family: FreeSansBold;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment