From ae04d50329c1fb0117e186f89fef38b495cbbe9c Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Wed, 8 May 2024 21:45:46 +0200 Subject: [PATCH] feat: add russian translation (#305) chore: add build step for discord notification of new releases --- .github/workflows/build-release.yaml | 7 + includes/i18n/languages.php | 1 + includes/i18n/ru.php | 254 +++++++++++++++++++++++++++ includes/version.php | 2 +- scripts/i18n/ru.js | 36 ++++ service-worker.js | 1 + 6 files changed, 300 insertions(+), 1 deletion(-) create mode 100644 includes/i18n/ru.php create mode 100644 scripts/i18n/ru.js diff --git a/.github/workflows/build-release.yaml b/.github/workflows/build-release.yaml index 86af6d0..d1900fb 100644 --- a/.github/workflows/build-release.yaml +++ b/.github/workflows/build-release.yaml @@ -76,3 +76,10 @@ jobs: platforms: linux/amd64,linux/arm64,linux/arm/v7 cache-from: type=gha cache-to: type=gha,mode=max + - name: Send notification to Discord + if: github.event_name != 'pull_request' + uses: Ilshidur/action-discord@master + with: + args: "A new release has been created: ${{ steps.meta.outputs.tags }}" + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} \ No newline at end of file diff --git a/includes/i18n/languages.php b/includes/i18n/languages.php index 1e68e9e..efc8359 100644 --- a/includes/i18n/languages.php +++ b/includes/i18n/languages.php @@ -14,6 +14,7 @@ "pl" => "Polski", "pt" => "Português", "pt_br" => "Português Brasileiro", + "ru" => "Русский", "sr_lat" => "Srpski", "sr" => "Српски", "tr" => "Türkçe", diff --git a/includes/i18n/ru.php b/includes/i18n/ru.php new file mode 100644 index 0000000..a1ef268 --- /dev/null +++ b/includes/i18n/ru.php @@ -0,0 +1,254 @@ + "Вам необходимо создать учетную запись, прежде чем вы сможете войти в систему", + 'username' => "Имя пользователя", + 'password' => "Пароль", + "email" => "E-mail", + "confirm_password" => "Подтвердите пароль", + "main_currency" => "Основная валюта", + "language" => "Язык", + "passwords_dont_match" => "Пароли не совпадают", + "registration_failed" => "Регистрация не удалась, попробуйте еще раз.", + "register" => "Регистрация", + "restore_database" => "Восстановить базу данных", + // Login Page + 'please_login' => "Пожалуйста, войдите", + 'stay_logged_in' => "Оставаться в системе (30 дней)", + 'login' => "Авторизоваться", + 'login_failed' => "Данные для входа неверны", + // Header + 'subscriptions' => "Подписки", + 'stats' => "Статистика", + 'settings' => "Настройки", + 'about' => "О программе", + 'logout' => "Выйти", + // Subscriptions page + "subscription" => "Подписка", + "no_subscriptions_yet" => "У вас пока нет подписок", + "add_first_subscription" => "Добавить первую подписку", + 'new_subscription' => "Новая подписка", + 'search' => "Поиск", + 'sort' => "Сортировка", + 'name' => "Имя", + 'last_added' => "Последний добавленный", + 'price' => "Стоимость", + 'next_payment' => "Следующий платеж", + 'inactive' => "Отключить подписку", + 'member' => "Член", + 'category' => "Категория", + 'payment_method' => "Способ оплаты", + "Daily" => "День", + "Weekly" => "Неделя", + "Monthly" => "Месяц", + "Yearly" => "Год", + "daily" => "День(и)", + "weekly" => "Неделя(и)", + "monthly" => "Месяц(ы)", + "yearly" => "Год(ы)", + "days" => "дней", + "weeks" => "недель", + "months" => "месяцев", + "years" => "года", + "external_url" => "Посетите внешний URL-адрес", + "empty_page" => "Пустая страница", + "clear_filters" => "Очистить фильтры", + "no_matching_subscriptions" => "Нет подходящих подписок", + // Subscription form + "add_subscription" => "Добавить подписку", + "edit_subscription" => "Изменить подписку", + "subscription_name" => "Название подписки", + "logo_preview" => "Предварительный просмотр логотипа", + "search_logo" => "Поиск логотипа в Интернете", + "web_search" => "Веб-поиск", + "currency" => "Валюта", + "payment_every" => "Оплата каждые", + "frequency" => "Частота", + "cycle" => "Цикл", + "next_payment" => "Следующий платеж", + "payment_method" => "Способ оплаты", + "no_category" => "Нет категории", + "paid_by" => "Оплачивает", + "url" => "URL", + "notes" => "Примечания", + "enable_notifications" => "Включить уведомления для этой подписки", + "delete" => "Удалить", + "cancel" => "Отмена", + "upload_logo" => "Загрузить логотип", + // Statistics page + 'general_statistics' => "Общая статистика", + 'active_subscriptions' => "Активные подписки", + 'inactive_subscriptions' => "Неактивные подписки", + 'monthly_cost' => "Ежемесячная стоимость", + 'yearly_cost' => "Годовая стоимость", + 'average_monthly' => "Средняя ежемесячная стоимость подписки", + 'most_expensive' => "Самая дорогая стоимость подписки", + 'amount_due' => "Сумма к оплате в этом месяце", + 'monthly_savings' => "Ежемесячная экономия (при неактивных подписках)", + 'split_views' => "Подробная статистика", + 'category_split' => "По категориям", + 'household_split' => "По членам семьи", + 'payment_method_split' => "По способам оплаты", + // About page + 'about_and_credits' => "О компании и авторах", + 'license' => "Лицензия", + 'issues_and_requests' => "Проблемы и вопросы", + 'the_author' => "Автор", + 'icons' => "Значки", + 'payment_icons' => "Значки способов оплаты", + // Settings page + 'upload_avatar' => "Загрузить аватар", + 'file_type_error' => "Указанный тип файла не поддерживается.", + 'user_details' => "Данные пользователя", + "household" => "Семья", + "save_member" => "Сохранить члена семьи", + "delete_member" => "Удалить члена семьи", + "cant_delete_member" => "Не могу удалить основного члена семьи", + "cant_delete_member_in_use" => "Невозможно удалить члена семьи, используемого в подписке.", + 'household_info' => "Поле электронной почты позволяет членам семьи получать уведомления об истечении срока действия подписки.", + "notifications" => "Уведомления", + "enable_email_notifications" => "Включить уведомления по электронной почте", + "notify_me" => "Уведомить меня", + "day_before" => "день до события", + "days_before" => "дня до события", + "smtp_address" => "SMTP-адрес", + "port" => "Порт", + "tls" => "TLS", + "ssl" => "SSL", + "smtp_username" => "Имя пользователя SMTP", + "smtp_password" => "Пароль SMTP", + "from_email" => "От кого E-Mail (необязательно)", + "smtp_info" => "Пароль SMTP передается и сохраняется в виде открытого текста. В целях безопасности создайте учетную запись только для Wallos.", + "telegram" => "Telegram", + "telegram_bot_token" => "Токен Telegram-бота", + "telegram_chat_id" => "Telegram Chat ID", + "webhook" => "Webhook", + "webhook_url" => "Webhook URL", + "request_method" => "Метод запроса", + "custom_headers" => "Пользовательские заголовки", + "webhook_payload" => "Webhook Payload", + "webhook_iterator_key" => "Заменить {{subscriptions}} именем ключа.", + "variables_available" => "Доступные переменные", + "gotify" => "Gotify", + "token" => "Токен", + "discord" => "Discord", + "discord_bot_username" => "Имя пользователя бота Discord", + "discord_bot_avatar_url" => "URL-адрес аватара бота Discord", + "pushover" => "Pushover", + "pushover_user_key" => "Ключ пользователя Pushover", + "categories" => "Категории", + "save_category" => "Сохранить категорию", + "delete_category" => "Удалить категорию", + "cant_delete_category_in_use" => "Невозможно удалить категорию, используемую в подписке.", + "currencies" => "Валюты", + "save_currency" => "Сохранить валюту", + "delete_currency" => "Удалить валюту", + "cant_delete_main_currency" => "Не могу удалить основную валюту", + "cant_delete_currency_in_use" => "Невозможно удалить валюту, используемую в подписке.", + "exchange_update" => "Курсы валют последний раз обновлялись", + "currency_info" => "Найдите поддерживаемые валюты и правильные коды валют на", + "currency_performance" => "Для повышения производительности сохраняйте только те валюты, которые вы используете.", + "fixer_api_key" => "Ключ Fixer API", + "api_key" => "API ключ", + "provider" => "Провайдер", + "fixer_info" => "Если вы используете несколько валют и хотите получить точную статистику и сортировку подписок, вам необходим БЕСПЛАТНЫЙ ключ API от Fixer.", + "get_key" => "Получите ключ по адресу", + "get_free_fixer_api_key" => "Получите бесплатный ключ API Fixer", + "get_key_alternative" => "Кроме того, вы можете получить бесплатный ключ API Fixer на сайте", + "display_settings" => "Настройки отображения", + "theme_settings" => "Настройки темы", + "custom_colors" => "Пользовательские цвета", + "dark_theme" => "Темная тема", + "switch_theme" => "Переключить светлую/темную тему", + "calculate_monthly_price" => "Рассчитайть и показать ежемесячную цену для всех подписок", + "convert_prices" => "Всегда конвертировать и показывать цены в моей основной валюте (медленнее)", + "hide_disabled_subscriptions" => "Скрыть отключенные подписки", + "experimental_settings" => "Экспериментальные настройки", + "remove_background" => "Попытка удалить фон логотипов из поиска изображений (экспериментально).", + "experimental_info" => "Экспериментальные настройки, вероятно, не будут работать идеально.", + "payment_methods" => "Способы оплаты", + "payment_methods_info" => "Нажмите на способ оплаты, чтобы отключить/включить его.", + "rename_payment_methods_info" => "Нажмите на название способа оплаты, чтобы переименовать его.", + "cant_delete_payment_method_in_use" => "Невозможно отключить используемый способ оплаты", + "add_custom_payment" => "Добавить собственный способ оплаты", + "payment_method_name" => "Название способа оплаты", + "payment_method_added_successfuly" => "Способ оплаты успешно добавлен", + "payment_method_removed" => "Способ оплаты удален.", + "disable" => "Отключить", + "enable" => "Включить", + "rename_payment_method" => "Переименовать способ оплаты", + "payment_renamed" => "Способ оплаты переименован", + "payment_not_renamed" => "Способ оплаты не переименован", + "test" => "Тест", + "add" => "Добавить", + "save" => "Сохранить", + "reset" => "Перезагрузить", + "backup_and_restore" => "Резервное копирование и восстановление", + "backup" => "Резервное копирование", + "restore" => "Восстановление", + "restore_info" => "Восстановление базы данных отменит все текущие данные. После восстановления вы выйдете из системы.", + // Filters menu + "filter" => "Фильтр", + "clear" => "Очистить", + // Toast + "success" => "Успешно", + // Endpoint responses + "session_expired" => "Срок действия вашей сессии истек. Пожалуйста, войдите снова", + "fields_missing" => "Некоторые поля отсутствуют", + "fill_all_fields" => "Пожалуйста заполните все поля", + "fill_mandatory_fields" => "Пожалуйста, заполните все обязательные поля", + "error" => "Ошибка", + // Category + "failed_add_category" => "Не удалось добавить категорию", + "failed_edit_category" => "Не удалось изменить категорию", + "category_in_use" => "Категория используется в подписках и не может быть удалена.", + "failed_remove_category" => "Не удалось удалить категорию", + "category_saved" => "Категория сохранена", + "category_removed" => "Категория удалена", + "sort_order_saved" => "Порядок сортировки сохранен.", + // Currency + "currency_saved" => "сохранено.", + "error_adding_currency" => "Ошибка добавления валюты.", + "failed_to_store_currency" => "Не удалось сохранить валюту в базе данных.", + "currency_in_use" => "Валюта используется в подписках и не может быть удалена.", + "currency_is_main" => "Валюта установлена ​​в качестве основной и не может быть удалена.", + "failed_to_remove_currency" => "Не удалось удалить валюту из базы данных.", + "failed_to_store_api_key" => "Не удалось сохранить ключ API в базе данных.", + "invalid_api_key" => "Неверный ключ API.", + "api_key_saved" => "Ключ API успешно сохранен", + "currency_removed" => "Валюта удалена", + // Household + "failed_add_household" => "Не удалось добавить члена семьи.", + "failed_edit_household" => "Не удалось изменить члена семьи.", + "failed_remove_household" => "Не удалось удалить члена семьи.", + "household_in_use" => "Член семьи используется в подписках и не может быть удален.", + "member_saved" => "Член семьи сохранен", + "member_removed" => "Член семьи удален", + // Notifications + "error_saving_notifications" => "Ошибка сохранения данных уведомлений.", + "wallos_notification" => "Уведомление от Wallos", + "test_notification" => "Это тестовое уведомление. Если вы видите это, значит, конфигурация правильная.", + "email_error" => "Ошибка отправки электронной почты", + "notification_sent_successfuly" => "Уведомление успешно отправлено", + "notifications_settings_saved" => "Настройки уведомлений успешно сохранены.", + "notification_failed" => "Уведомление не удалось", + // Payments + "payment_in_use" => "Невозможно отключить используемый способ оплаты", + "failed_update_payment" => "Не удалось обновить способ оплаты в базе данных.", + "enabled" => "включено", + "disabled" => "отключено", + // Subscription + "error_fetching_image" => "Ошибка при загрузке изображения.", + "subscription_updated_successfuly" => "Подписка успешно обновлена", + "subscription_added_successfuly" => "Подписка успешно добавлена", + "error_deleting_subscription" => "Ошибка удаления подписки.", + "invalid_request_method" => "Неверный метод запроса.", + // User + "error_updating_user_data" => "Ошибка обновления пользовательских данных.", + "user_details_saved" => "Данные пользователя сохранены.", + +]; + + +?> diff --git a/includes/version.php b/includes/version.php index 1b71902..1f4e478 100644 --- a/includes/version.php +++ b/includes/version.php @@ -1,3 +1,3 @@ diff --git a/scripts/i18n/ru.js b/scripts/i18n/ru.js new file mode 100644 index 0000000..754ed20 --- /dev/null +++ b/scripts/i18n/ru.js @@ -0,0 +1,36 @@ +let i18n = { + // Dashboard + error_reloading_subscription: "Ошибка перезагрузки подписки:", + error_fetching_image_results: "Ошибка при получении результатов изображения:", + subscription_deleted: "Подписка удалена", + error_deleting_subscription: "Ошибка удаления подписки", + failed_to_load_subscription: "Не удалось загрузить подписку", + edit_subscription: "Изменить подписку", + add_subscription: "Добавить подписку", + confirm_delete_subscription: "Вы уверены, что хотите удалить эту подписку?", + // Settings + network_response_error: "Отсутствует сетевое соединение", + failed_add_member: "Не удалось добавить пользователя", + member: "Пользователь", + email: "Электронная почта", + save_member: "Сохранить пользователя", + delete_member: "Удалить пользователя", + failed_remove_member: "Не удалось удалить пользователя", + failed_save_member: "Не удалось сохранить пользователя", + failed_add_category: "Не удалось добавить категорию", + category: "Категория", + save_category: "Сохранить категорию", + delete_category: "Удалить категорию", + failed_remove_category: "Не удалось удалить категорию", + currency: "Валюта", + currency_code: "Код валюты", + save_currency: "Сохранить валюту", + delete_currency: "Удалить валюту", + failed_remove_currency: "Не удалось удалить валюту.", + failed_save_currency: "Не удалось сохранить валюту.", + cant_disable_payment_in_use: "Невозможно отключить используемый платеж", + failed_save_payment_method: "Не удалось сохранить способ оплаты.", + unknown_error: "Неизвестная ошибка. Повторите попытку.", + error_saving_notification_data: "Ошибка сохранения данных уведомления.", + error_sending_notification: "Ошибка отправки уведомления", +} diff --git a/service-worker.js b/service-worker.js index dc6c4d1..56fcd20 100644 --- a/service-worker.js +++ b/service-worker.js @@ -38,6 +38,7 @@ self.addEventListener('install', function(event) { 'scripts/i18n/pl.js', 'scripts/i18n/pt.js', 'scripts/i18n/pt_br.js', + 'scripts/i18n/ru.js', 'scripts/i18n/tr.js', 'scripts/i18n/zh_cn.js', 'scripts/i18n/zh_tw.js',