From 594e9a6039cb6c9d9b382e8c0b14fec41e2c14f8 Mon Sep 17 00:00:00 2001 From: Leonid Shevtsov Date: Mon, 15 Aug 2022 19:13:47 +0300 Subject: [PATCH] Add Ukrainian locale --- locale/locale.go | 1 + locale/plural.go | 40 ++-- locale/translations/uk_UA.json | 373 +++++++++++++++++++++++++++++++++ 3 files changed, 390 insertions(+), 24 deletions(-) create mode 100644 locale/translations/uk_UA.json diff --git a/locale/locale.go b/locale/locale.go index 90cb7f82..67b02af7 100644 --- a/locale/locale.go +++ b/locale/locale.go @@ -23,5 +23,6 @@ func AvailableLanguages() map[string]string { "el_EL": "Ελληνικά", "fi_FI": "Suomi", "hi_IN": "हिन्दी", + "uk_UA": "Українська", } } diff --git a/locale/plural.go b/locale/plural.go index 3b14c386..f805555a 100644 --- a/locale/plural.go +++ b/locale/plural.go @@ -72,32 +72,24 @@ var pluralForms = map[string]pluralFormFunc{ } return 0 }, - // nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); - "ru_RU": func(n int) int { - if n%10 == 1 && n%100 != 11 { - return 0 - } - - if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) { - return 1 - } - - return 2 - }, - // nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); - "sr_RS": func(n int) int { - if n%10 == 1 && n%100 != 11 { - return 0 - } - - if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) { - return 1 - } - - return 2 - }, + "ru_RU": pluralFormRuSrUa, + "uk_UA": pluralFormRuSrUa, + "sr_RS": pluralFormRuSrUa, // nplurals=1; plural=0; "zh_CN": func(n int) int { return 0 }, } + +// nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); +func pluralFormRuSrUa(n int) int { + if n%10 == 1 && n%100 != 11 { + return 0 + } + + if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) { + return 1 + } + + return 2 +} diff --git a/locale/translations/uk_UA.json b/locale/translations/uk_UA.json new file mode 100644 index 00000000..609cb417 --- /dev/null +++ b/locale/translations/uk_UA.json @@ -0,0 +1,373 @@ +{ + "confirm.question": "Ви впевнені?", + "confirm.yes": "так", + "confirm.no": "ні", + "confirm.loading": "В процесі...", + "action.subscribe": "Підписатись", + "action.save": "Зберегти", + "action.or": "або", + "action.cancel": "скасувати", + "action.remove": "Видалити", + "action.remove_feed": "Видалити стрічку", + "action.update": "Зберегти", + "action.edit": "Редагувати", + "action.download": "Завантажити", + "action.import": "Імпортувати", + "action.login": "Увійти", + "action.home_screen": "Додати до головного екрану", + "tooltip.keyboard_shortcuts": "Комбінація клавіш: %s", + "tooltip.logged_user": "Здійснено вхід як %s", + "menu.unread": "Непрочитане", + "menu.starred": "З зірочкою", + "menu.history": "Історія", + "menu.feeds": "Стрічки", + "menu.categories": "Категорії", + "menu.settings": "Налаштування", + "menu.logout": "Вийти", + "menu.preferences": "Уподобання", + "menu.integrations": "Інтеграції", + "menu.sessions": "Сеанси", + "menu.users": "Користувачі", + "menu.about": "Про додаток", + "menu.export": "Експорт", + "menu.import": "Імпорт", + "menu.create_category": "Створити категорію", + "menu.mark_page_as_read": "Відмітити цю сторінку як прочитане", + "menu.mark_all_as_read": "Відмітити все як прочитане", + "menu.show_all_entries": "Показати всі записи", + "menu.show_only_unread_entries": "Показати тільки непрочитані записи", + "menu.refresh_feed": "Оновити", + "menu.refresh_all_feeds": "Оновити всі стрічки у фоновому режимі", + "menu.edit_feed": "Редагувати", + "menu.edit_category": "Редагувати", + "menu.add_feed": "Додати підписку", + "menu.add_user": "Додати користувачв", + "menu.flush_history": "Очистити історію", + "menu.feed_entries": "Записи", + "menu.api_keys": "Ключі API", + "menu.create_api_key": "Створити новий ключ API", + "menu.shared_entries": "Спільні записи", + "search.label": "Пошук", + "search.placeholder": "Шукати...", + "pagination.next": "Вперед", + "pagination.previous": "Назад", + "entry.status.unread": "Непрочитане", + "entry.status.read": "Прочитане", + "entry.status.toast.unread": "Відмічено непрочитаним", + "entry.status.toast.read": "Відмічено прочитаним", + "entry.status.title": "Змінити стан запису", + "entry.bookmark.toggle.on": "Поставити зірочку", + "entry.bookmark.toggle.off": "Прибрати зірочку", + "entry.bookmark.toast.on": "З зірочкою", + "entry.bookmark.toast.off": "Без зірочки", + "entry.state.saving": "Зберігаю...", + "entry.state.loading": "Завантаження...", + "entry.save.label": "Зберегти", + "entry.save.title": "Зберегти цю статтю", + "entry.save.completed": "Готово!", + "entry.save.toast.completed": "Стаття збережена", + "entry.scraper.label": "Завантажити", + "entry.scraper.title": "Отримати оригінальний зміст", + "entry.scraper.completed": "Готово!", + "entry.external_link.label": "Зовнішнє посилання", + "entry.comments.label": "Коментарі", + "entry.comments.title": "Дивитися коментарі", + "entry.share.label": "Поділитись", + "entry.share.title": "Поділитись статтєю", + "entry.unshare.label": "Не ділитися", + "entry.shared_entry.title": "Відкрити публічне посилання", + "entry.shared_entry.label": "Поділитись", + "entry.estimated_reading_time": [ + "читати %d хвилину", + "читати %d хвилини", + "читати %d хвилин" + ], + "page.shared_entries.title": "Спильні записи", + "page.unread.title": "Непрочитане", + "page.starred.title": "З зірочкою", + "page.categories.title": "Категорії", + "page.categories.no_feed": "Немає стрічки.", + "page.categories.entries": "Статті", + "page.categories.feeds": "Підписки", + "page.categories.feed_count": [ + "Є %d стрічка.", + "Є %d стрічки.", + "Є %d стрічок." + ], + "page.categories.unread_counter": "Кількість непрочитаних записів", + "page.new_category.title": "Нова категорія", + "page.new_user.title": "Новий користувач", + "page.edit_category.title": "Редагування категорії: %s", + "page.edit_user.title": "Редагування користувача: %s", + "page.feeds.title": "Стрічки", + "page.feeds.last_check": "Остання перевірка:", + "page.feeds.unread_counter": "Кількість непрочитаних записів", + "page.feeds.read_counter": "Кількість прочитаних записів", + "page.feeds.error_count": ["%d помилка", "%d помилки", "%d помилок"], + "page.history.title": "Історія", + "page.import.title": "Імпорт", + "page.search.title": "Результати пошуку", + "page.about.title": "Про додадок", + "page.about.credits": "Титри", + "page.about.version": "Версія:", + "page.about.build_date": "Дата побудови:", + "page.about.author": "Автор:", + "page.about.license": "Ліцензія:", + "page.about.global_config_options": "Параметри глобальної конфігурації", + "page.about.postgres_version": "Версія Postgres:", + "page.about.go_version": "Версія Go:", + "page.add_feed.title": "Нова підписка", + "page.add_feed.no_category": "Немає категорії. Ви маєте додати принаймні одну категорію.", + "page.add_feed.label.url": "URL", + "page.add_feed.submit": "Знайти підписку", + "page.add_feed.legend.advanced_options": "Розширені опції", + "page.add_feed.choose_feed": "Обрати підписку", + "page.edit_feed.title": "Редагування стрічки: %s", + "page.edit_feed.last_check": "Остання перевірка:", + "page.edit_feed.last_modified_header": "Заголовок LastModified:", + "page.edit_feed.etag_header": "Заголовок ETag:", + "page.edit_feed.no_header": "Немає", + "page.edit_feed.last_parsing_error": "Остання помилка аналізу", + "page.entry.attachments": "Додатки", + "page.keyboard_shortcuts.title": "Комбінації клавиш", + "page.keyboard_shortcuts.subtitle.sections": "Навігація по розділах", + "page.keyboard_shortcuts.subtitle.items": "Навігація по записах", + "page.keyboard_shortcuts.subtitle.pages": "Навігація по сторінках", + "page.keyboard_shortcuts.subtitle.actions": "Дії", + "page.keyboard_shortcuts.go_to_unread": "Перейти до непрочитаних", + "page.keyboard_shortcuts.go_to_starred": "Перейти до закладок", + "page.keyboard_shortcuts.go_to_history": "Перейти до історії", + "page.keyboard_shortcuts.go_to_feeds": "Перейти до стрічок", + "page.keyboard_shortcuts.go_to_categories": "Перейти до категорій", + "page.keyboard_shortcuts.go_to_settings": "Перейти до налаштувань", + "page.keyboard_shortcuts.show_keyboard_shortcuts": "Показати комбінації клавиш", + "page.keyboard_shortcuts.go_to_previous_item": "Перейти до попереднього запису", + "page.keyboard_shortcuts.go_to_next_item": "Перейти до наступного запису", + "page.keyboard_shortcuts.go_to_feed": "Перейти до стрічки", + "page.keyboard_shortcuts.go_to_previous_page": "Перейти до попередньої сторінки", + "page.keyboard_shortcuts.go_to_next_page": "Перейти до наступної сторінки", + "page.keyboard_shortcuts.open_item": "Відкрити виділений запис", + "page.keyboard_shortcuts.open_original": "Відкрити оригінальне посилання", + "page.keyboard_shortcuts.open_original_same_window": "Відкрити оригінальне посилання в поточній вкладці", + "page.keyboard_shortcuts.open_comments": "Відкрити посилання на коментарі", + "page.keyboard_shortcuts.open_comments_same_window": "Відкрити посилання на коментарі в поточній вкладці", + "page.keyboard_shortcuts.toggle_read_status_next": "Переключити статус читання, перейти до наступного", + "page.keyboard_shortcuts.toggle_read_status_prev": "Переключити статус читання, перейти до попереднього", + "page.keyboard_shortcuts.refresh_all_feeds": "Оновити всі стрічки в фоновому режимі", + "page.keyboard_shortcuts.mark_page_as_read": "Відмітити поточну сторінку як прочитане", + "page.keyboard_shortcuts.download_content": "Завантажити оригінальний зміст", + "page.keyboard_shortcuts.toggle_bookmark_status": "Переключити статус закладки", + "page.keyboard_shortcuts.save_article": "Зберегти статтю", + "page.keyboard_shortcuts.scroll_item_to_top": "Прокрутити запис догори", + "page.keyboard_shortcuts.remove_feed": "Видалити цю стрічку", + "page.keyboard_shortcuts.go_to_search": "Поставити фокус на поле пошуку", + "page.keyboard_shortcuts.close_modal": "Закрити модальне діалогове вікно", + "page.users.title": "Користувачі", + "page.users.username": "Ім’я користувача", + "page.users.never_logged": "Ніколи", + "page.users.admin.yes": "Так", + "page.users.admin.no": "Ні", + "page.users.actions": "Дії", + "page.users.last_login": "Дата останнього входу", + "page.users.is_admin": "Адміністратор", + "page.settings.title": "Налаштування ", + "page.settings.link_google_account": "Підключити мій обліковий запис Google", + "page.settings.unlink_google_account": "Відключити мій обліковий запис Google", + "page.settings.link_oidc_account": "Підключити мій обліковий запис OpenID Connect", + "page.settings.unlink_oidc_account": "Відключити мій обліковий запис OpenID Connect", + "page.login.title": "Вхід", + "page.login.google_signin": "Увійти через Google", + "page.login.oidc_signin": "Увійти через OpenID Connect", + "page.integrations.title": "Інтеграції", + "page.integration.miniflux_api": "Miniflux API", + "page.integration.miniflux_api_endpoint": "Адреса доступу API", + "page.integration.miniflux_api_username": "Ім’я користувача", + "page.integration.miniflux_api_password": "Пароль", + "page.integration.miniflux_api_password_value": "Пароль до вашого облікового запису", + "page.integration.bookmarklet": "Букмарклет", + "page.integration.bookmarklet.name": "Додати до Miniflux", + "page.integration.bookmarklet.instructions": "Перетягніть це посилання до своїх закладок.", + "page.integration.bookmarklet.help": "Це спеціальне посилання дозволяє підписатися на веб-сайт безпосередньо за допомогою закладки у вашому веб-браузері.", + "page.sessions.title": "Сеанси", + "page.sessions.table.date": "Дата", + "page.sessions.table.ip": "IP адреса", + "page.sessions.table.user_agent": "User Agent", + "page.sessions.table.actions": "Дії", + "page.sessions.table.current_session": "Поточний сеанс", + "page.api_keys.title": "Ключі API", + "page.api_keys.table.description": "Опис", + "page.api_keys.table.token": "Токен", + "page.api_keys.table.last_used_at": "Дата останнього використання", + "page.api_keys.table.created_at": "Дата створення", + "page.api_keys.table.actions": "Дії", + "page.api_keys.never_used": "Ніколи не використався", + "page.new_api_key.title": "Створити ключ API", + "page.offline.title": "Автономний режим", + "page.offline.message": "Ви офлайн", + "page.offline.refresh_page": "Спробуйте оновити сторінку", + "alert.no_shared_entry": "Немає спільного запису.", + "alert.no_bookmark": "Наразі закладки відсутні.", + "alert.no_category": "Немає категорії.", + "alert.no_category_entry": "У цій категорії немає записів.", + "alert.no_feed_entry": "У цій стрічці немає записів.", + "alert.no_feed": "У вас немає підписок.", + "alert.no_feed_in_category": "У цій категорії немає підписок.", + "alert.no_history": "Наразі історія порожня.", + "alert.feed_error": "З цією стрічкою трапилась помилка", + "alert.no_search_result": "Немає результатів для цього пошуку.", + "alert.no_unread_entry": "Немає непрочитаних статей.", + "alert.no_user": "Ви єдиний користувач.", + "alert.account_unlinked": "Тепер ваш зовнішній обліковий запис підключено!", + "alert.account_linked": "Тепер ваш зовнішній обліковий запис від’єднано!", + "alert.pocket_linked": "Тепер ваш обліковий запис Pocket підключено!", + "alert.prefs_saved": "Уподобання збережено!", + "error.unlink_account_without_password": "Ви маєте встановити пароль, щоб мати можливість увійти наступного разу", + "error.duplicate_linked_account": "Вже є обліковий запис, під’єднаний до цього провайдера!", + "error.duplicate_fever_username": "Вже є обліковий запис з таким самим користувачем Fever!", + "error.duplicate_googlereader_username": "Вже є обліковий запис з таким самим користувачем Google Reader!", + "error.pocket_request_token": "Не вдалося отримати токен доступу з Pocket!", + "error.pocket_access_token": "Не вдалося отримати токен доступу з Pocket!", + "error.category_already_exists": "Така категорія вже існує.", + "error.unable_to_create_category": "Не вдається сворити категорію.", + "error.unable_to_update_category": "Не вдається відредагувати категорію.", + "error.user_already_exists": "Такий користувач вже існує.", + "error.unable_to_create_user": "Не вдається створити користувача.", + "error.unable_to_update_user": "Не вдається оновити користувача.", + "error.unable_to_update_feed": "Не вдається оновити стрічку.", + "error.subscription_not_found": "Не знайшлося жодної підписки.", + "error.invalid_theme": "Недійсна тема.", + "error.invalid_language": "Недійсна мова.", + "error.invalid_timezone": "Недійсний часовий пояс.", + "error.invalid_entry_direction": "Недійсний напрямок запису.", + "error.invalid_display_mode": "Недійсний режим відображення.", + "error.invalid_default_home_page": "Недійсна домашня сторінка за замовчуванням!", + "error.empty_file": "Цей файл порожній.", + "error.bad_credentials": "Невірне ім’я користувача або пароль.", + "error.fields_mandatory": "Всі поля є обов’язковими.", + "error.title_required": "Назва є обов’язковою.", + "error.different_passwords": "Паролі не співпадають.", + "error.password_min_length": "Пароль має складати щонайменше 6 символів.", + "error.settings_mandatory_fields": "Поля імені, теми, мови та часового поясу є обов’язковими.", + "error.settings_reading_speed_is_positive": "Швидкість читання має бути додатнім цілим числом.", + "error.entries_per_page_invalid": "Число записів на сторінку недійсне.", + "error.feed_mandatory_fields": "URL та категорія є обов’язковими.", + "error.feed_already_exists": "Така стрічка вже існує.", + "error.invalid_feed_url": "Недійсна URL-адреса стрічки.", + "error.invalid_site_url": "Недійсна URL-адреса сайту.", + "error.feed_url_not_empty": "URL-адреса стрічки не може бути порожньою.", + "error.site_url_not_empty": "URL-адреса сайту не може бути порожньою.", + "error.feed_title_not_empty": "Назва стрічки не може бути порожньою.", + "error.feed_category_not_found": "Категорія не існує або належить до іншого користувача.", + "error.feed_invalid_blocklist_rule": "Правило списку блокувань недійсне.", + "error.feed_invalid_keeplist_rule": "Правило списку дозволень недійсне.", + "error.user_mandatory_fields": "Ім’я користувача є обов’язковим.", + "error.api_key_already_exists": "Такий ключ API вже існує.", + "error.unable_to_create_api_key": "Не вдається створити такий ключ API", + "form.feed.label.title": "Назва", + "form.feed.label.site_url": "URL-адреса сайту", + "form.feed.label.feed_url": "URL-адреса стрічки", + "form.feed.label.category": "Категорія", + "form.feed.label.crawler": "Завантажувати оригінальний вміст", + "form.feed.label.feed_username": "Ім’я користувача для завантаження", + "form.feed.label.feed_password": "Пароль для завантаження", + "form.feed.label.user_agent": "Назначити User Agent", + "form.feed.label.cookie": "Встановити кукі", + "form.feed.label.scraper_rules": "Правила Scraper", + "form.feed.label.rewrite_rules": "Правила Rewrite", + "form.feed.label.blocklist_rules": "Правила блокування", + "form.feed.label.keeplist_rules": "Правила дозволення", + "form.feed.label.urlrewrite_rules": "Правила перезапису URL-адрес", + "form.feed.label.ignore_http_cache": "Ігнорувати кеш HTTP", + "form.feed.label.allow_self_signed_certificates": "Дозволити сертифікати з власним підписом або недійсні", + "form.feed.label.fetch_via_proxy": "Використати проксі-сервер", + "form.feed.label.disabled": "Не оновлювати цю стрічку", + "form.feed.label.hide_globally": "Приховати записи в глобальному списку непрочитаного", + "form.category.label.title": "Назва", + "form.category.hide_globally": "Приховати записи в глобальному списку непрочитаного", + "form.user.label.username": "Ім’я користувача", + "form.user.label.password": "Пароль", + "form.user.label.confirmation": "Підтверждення паролю", + "form.user.label.admin": "Адміністратор", + "form.prefs.label.language": "Мова", + "form.prefs.label.timezone": "Часовий пояс", + "form.prefs.label.theme": "Тема", + "form.prefs.label.entry_sorting": "Сортування записів", + "form.prefs.label.entries_per_page": "Кількість записів на сторінку", + "form.prefs.label.default_reading_speed": "Швидкість читання для інших мов (слів на хвилину)", + "form.prefs.label.cjk_reading_speed": "Швидкість читання для китайської, корейської та японської мови (символів на хвилину)", + "form.prefs.label.display_mode": "Режим відображення додатку (потребує перевстановлення)", + "form.prefs.select.older_first": "Старіші записи спочатку", + "form.prefs.select.recent_first": "Останні записи спочатку", + "form.prefs.select.fullscreen": "Повний екран", + "form.prefs.select.standalone": "Автономний", + "form.prefs.select.minimal_ui": "Мінімальний", + "form.prefs.select.browser": "Браузер", + "form.prefs.select.publish_time": "Дата публікації запису", + "form.prefs.select.created_time": "Дата створення запису", + "form.prefs.label.keyboard_shortcuts": "Увімкнути комбінації клавиш", + "form.prefs.label.entry_swipe": "Увімкнути жест гортання для записів на мобільних пристроях", + "form.prefs.label.show_reading_time": "Показувати приблизний час читання для записів", + "form.prefs.label.custom_css": "Спеціальний CSS", + "form.prefs.label.entry_order": "Стовпець сортування записів", + "form.prefs.label.default_home_page": "Домашня сторінка за умовчанням", + "form.import.label.file": "Файл OPML", + "form.import.label.url": "URL-адреса", + "form.integration.fever_activate": "Увімкнути API Fever", + "form.integration.fever_username": "Ім’я користувача Fever", + "form.integration.fever_password": "Пароль Fever", + "form.integration.fever_endpoint": "Адреса доступу API Fever:", + "form.integration.googlereader_activate": "Увімкнути API Google Reader", + "form.integration.googlereader_username": "Ім’я користувача Google Reader", + "form.integration.googlereader_password": "Пароль Google Reader", + "form.integration.googlereader_endpoint": "Адреса доступу API Google Reader:", + "form.integration.pinboard_activate": "Зберігати статті до Pinboard", + "form.integration.pinboard_token": "API ключ від Pinboard", + "form.integration.pinboard_tags": "Теги для Pinboard", + "form.integration.pinboard_bookmark": "Відмічати закладку як непрочитану", + "form.integration.instapaper_activate": "Зберігати статті до Instapaper", + "form.integration.instapaper_username": "Ім’я користувача Instapaper", + "form.integration.instapaper_password": "Пароль Instapaper", + "form.integration.pocket_activate": "Зберігати статті до Pocket", + "form.integration.pocket_consumer_key": "Pocket Consumer Key", + "form.integration.pocket_access_token": "Pocket Access Token", + "form.integration.pocket_connect_link": "Підключити ваш обліковий запис Pocket", + "form.integration.wallabag_activate": "Зберігати статті до Wallabag", + "form.integration.wallabag_endpoint": "Wallabag API Endpoint", + "form.integration.wallabag_client_id": "Wallabag Client ID", + "form.integration.wallabag_client_secret": "Wallabag Client Secret", + "form.integration.wallabag_username": "Ім’я користувача Wallabag", + "form.integration.wallabag_password": "Пароль Wallabag", + "form.integration.nunux_keeper_activate": "Зберігати статті до Nunux Keeper", + "form.integration.nunux_keeper_endpoint": "Nunux Keeper API Endpoint", + "form.integration.nunux_keeper_api_key": "Ключ API Nunux Keeper", + "form.integration.espial_activate": "Зберігати статті до Espial", + "form.integration.espial_endpoint": "Espial API Endpoint", + "form.integration.espial_api_key": "Ключ API Espial", + "form.integration.espial_tags": "Теги для Espial", + "form.integration.telegram_bot_activate": "Відправляти нові статті до чату Telegram", + "form.integration.telegram_bot_token": "Токен боту", + "form.integration.telegram_chat_id": "ID чату", + "form.integration.linkding_activate": "Зберігати статті до Linkding", + "form.integration.linkding_endpoint": "Linkding API Endpoint", + "form.integration.linkding_api_key": "Ключ API Linkding", + "form.api_key.label.description": "Назва ключа API", + "form.submit.loading": "Завантаження...", + "form.submit.saving": "Зберігаю...", + "time_elapsed.not_yet": "ще ні", + "time_elapsed.yesterday": "вчора", + "time_elapsed.now": "прямо зараз", + "time_elapsed.minutes": [ + "%d хвилину тому", + "%d хвилини тому", + "%d хвилин тому" + ], + "time_elapsed.hours": ["%d годину тому", "%d години тому", "%d годин тому"], + "time_elapsed.days": ["%d день тому", "%d дні тому", "%d днів тому"], + "time_elapsed.weeks": ["%d тиждень тому", "%d тижня тому", "%d тижнів тому"], + "time_elapsed.months": [ + "%d місяць тому", + "%d місяця тому", + "%d місяців тому" + ], + "time_elapsed.years": ["%d рік тому", "%d роки тому", "%d років тому"] +}