diff --git a/CHANGELOG.md b/CHANGELOG.md index c39809ee..1ac93820 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Mouseover titles for emojis in reaction picker - Support to input emoji into the search box in reaction picker - Added some missing unicode emoji +- Added the upload limit to the Features panel in the About page ### Fixed - Fixed the occasional bug where screen would scroll 1px when typing into a reply form @@ -17,11 +18,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fixed custom emoji not working in profile field names - Fixed pinned statuses not appearing in user profiles - Fixed some elements not being keyboard navigation friendly +- Fixed your latest chat messages disappearing when closing chat view and opening it again during the same session +- Fixed custom emoji not showing in poll options before voting ### Changed - Errors when fetching are now shown with popup errors instead of "Error fetching updates" in panel headers - Made reply/fav/repeat etc buttons easier to hit - Adjusted timeline menu clickable area to match the visible button +- Disabled horizontal textarea resize ## [2.2.1] - 2020-11-11 diff --git a/src/App.scss b/src/App.scss index cdc3209c..48313f57 100644 --- a/src/App.scss +++ b/src/App.scss @@ -332,6 +332,10 @@ input, textarea, .select, .input { box-sizing: border-box; } } + + &.resize-height { + resize: vertical; + } } option { diff --git a/src/components/features_panel/features_panel.js b/src/components/features_panel/features_panel.js index 620a85ea..8b142d08 100644 --- a/src/components/features_panel/features_panel.js +++ b/src/components/features_panel/features_panel.js @@ -1,3 +1,5 @@ +import fileSizeFormatService from '../../services/file_size_format/file_size_format.js' + const FeaturesPanel = { computed: { chat: function () { return this.$store.state.instance.chatAvailable }, @@ -6,7 +8,8 @@ const FeaturesPanel = { whoToFollow: function () { return this.$store.state.instance.suggestionsEnabled }, mediaProxy: function () { return this.$store.state.instance.mediaProxyAvailable }, minimalScopesMode: function () { return this.$store.state.instance.minimalScopesMode }, - textlimit: function () { return this.$store.state.instance.textlimit } + textlimit: function () { return this.$store.state.instance.textlimit }, + uploadlimit: function () { return fileSizeFormatService.fileSizeFormat(this.$store.state.instance.uploadlimit) } } } diff --git a/src/components/features_panel/features_panel.vue b/src/components/features_panel/features_panel.vue index 608b11c8..9605d09d 100644 --- a/src/components/features_panel/features_panel.vue +++ b/src/components/features_panel/features_panel.vue @@ -25,6 +25,7 @@
{{ $t('settings.filtering_explanation') }}
{{ $t('settings.bio') }}
@@ -22,7 +22,7 @@ >diff --git a/src/i18n/en.json b/src/i18n/en.json index ef23efd6..c42126fc 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -50,7 +50,8 @@ "scope_options": "Scope options", "text_limit": "Text limit", "title": "Features", - "who_to_follow": "Who to follow" + "who_to_follow": "Who to follow", + "upload_limit": "Upload limit" }, "finder": { "error_fetching_user": "Error fetching user", diff --git a/src/i18n/messages.js b/src/i18n/messages.js index c3195f10..2624d1d0 100644 --- a/src/i18n/messages.js +++ b/src/i18n/messages.js @@ -33,6 +33,7 @@ const loaders = { ro: () => import('./ro.json'), ru: () => import('./ru.json'), te: () => import('./te.json'), + uk: () => import('./uk.json'), zh: () => import('./zh.json') } diff --git a/src/i18n/ru.json b/src/i18n/ru.json index f636bdf8..3a7c61a9 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -19,7 +19,7 @@ "optional": "не обязательно", "show_less": "Показать меньше", "show_more": "Показать больше", - "peek": "Взглянуть", + "peek": "Свернуть", "dismiss": "Закрыть", "retry": "Попробуйте еще раз", "error_retry": "Пожалуйста попробуйте еще раз", @@ -39,8 +39,11 @@ "recovery_code": "Код восстановления", "heading": { "TotpForm": "Двухфакторная аутентификация", - "RecoveryForm": "Two-factor recovery" - } + "RecoveryForm": "Two-factor recovery", + "totp": "Двухфакторная аутентификация" + }, + "hint": "Войдите чтобы присоединиться к дискуссии", + "description": "Войти с помощью OAuth" }, "nav": { "back": "Назад", @@ -52,7 +55,14 @@ "twkn": "Федеративная лента", "search": "Поиск", "friend_requests": "Запросы на чтение", - "bookmarks": "Закладки" + "bookmarks": "Закладки", + "chats": "Беседы", + "timelines": "Ленты", + "preferences": "Настройки", + "who_to_follow": "Кого читать", + "dms": "Личные Сообщения", + "administration": "Панель администратора", + "about": "О сервере" }, "notifications": { "broken_favorite": "Неизвестный статус, ищем...", @@ -62,12 +72,17 @@ "notifications": "Уведомления", "read": "Прочесть", "repeated_you": "повторил(а) ваш статус", - "follow_request": "хочет читать вас" + "follow_request": "хочет читать вас", + "reacted_with": "добавил реакцию: {0}", + "migrated_to": "мигрировал на", + "no_more_notifications": "Нет дальнейших уведомлений", + "error": "Ошибка при обновлении уведомлений: {0}" }, "interactions": { "favs_repeats": "Повторы и фавориты", - "follows": "Новые подписки", - "load_older": "Загрузить старые взаимодействия" + "follows": "Новые читатели", + "load_older": "Загрузить старые взаимодействия", + "moves": "Миграции пользователей" }, "post_status": { "account_not_locked_warning": "Ваш аккаунт не {0}. Кто угодно может начать читать вас чтобы видеть посты только для подписчиков.", @@ -87,7 +102,21 @@ "private": "Для подписчиков - этот пост видят только подписчики", "public": "Публичный - этот пост виден всем", "unlisted": "Непубличный - этот пост не виден на публичных лентах" - } + }, + "preview_empty": "Пустой предпросмотр", + "media_description_error": "Не удалось обновить вложение, попробуйте еще раз", + "empty_status_error": "Нельзя отправить пустой статус без вложений", + "preview": "Предпросмотр", + "direct_warning_to_first_only": "Это сообщение увидят только пользователи упомянутые в его начале.", + "direct_warning_to_all": "Это сообщение увидят все упомянутые пользователи.", + "content_type": { + "text/bbcode": "BBCode", + "text/html": "HTML", + "text/markdown": "Markdown", + "text/plain": "Простой текст" + }, + "media_description": "Описание вложения", + "new_status": "Написать новый статус" }, "registration": { "bio": "Описание", @@ -103,7 +132,12 @@ "password_required": "не должен быть пустым", "password_confirmation_required": "не должно быть пустым", "password_confirmation_match": "должно совпадать с паролем" - } + }, + "bio_placeholder": "например:\nПривет, я Игорь Печкин.\nРаботаю почтальоном в деревне Простоквашино. С недавних пор велосипедист.", + "fullname_placeholder": "например: Почтальон Печкин", + "username_placeholder": "например: pechkin", + "captcha": "Код подтверждения", + "new_captcha": "Нажмите на изображение чтобы получить новый код" }, "settings": { "enter_current_password_to_confirm": "Введите свой текущий пароль", @@ -202,7 +236,7 @@ "hide_followers_count_description": "Не показывать число моих подписчиков", "show_admin_badge": "Показывать значок администратора в моем профиле", "show_moderator_badge": "Показывать значок модератора в моем профиле", - "nsfw_clickthrough": "Включить скрытие NSFW вложений", + "nsfw_clickthrough": "Включить скрытие NSFW вложений и не показывать изображения в предпросмотре ссылок для NSFW статусов", "oauth_tokens": "OAuth токены", "token": "Токен", "refresh_token": "Рефреш токен", @@ -355,7 +389,60 @@ } }, "allow_following_move": "Разрешить автоматически читать новый аккаунт при перемещении на другой сервер", - "hide_user_stats": "Не показывать статистику пользователей (например количество читателей)" + "hide_user_stats": "Не показывать статистику пользователей (например количество читателей)", + "discoverable": "Разрешить показ аккаунта в поисковиках и других сервисах", + "default_vis": "Видимость постов по умолчанию", + "mutes_and_blocks": "Блокировки и игнорируемые", + "composing": "Составление постов", + "chatMessageRadius": "Сообщения в беседе", + "blocks_tab": "Блокировки", + "import_mutes_from_a_csv_file": "Импортировать игнорируемых из CSV файла", + "mutes_imported": "Игнорируемые импортированы! Обработка может занять некоторое время.", + "mute_import_error": "Произошла ошибка при импорте игнорируемых", + "mute_import": "Импорт игнорируемых", + "block_export_button": "Экспортирует блокировки в CSV файл", + "mute_export_button": "Экспортирует игнорируемых пользователей в CSV файл", + "mute_export": "Экспорт игнорируемых", + "blocks_imported": "Блокировки импортированы! Обработка может занять некоторое время.", + "block_import_error": "Произошла ошибка при импорте блокировок", + "block_import": "Импорт блокировок", + "block_export": "Экспортировать блокировки", + "security": "Безопасность", + "app_name": "Приложение", + "user_mutes": "Пользователи", + "post_status_content_type": "Формат составляемых статусов по умолчанию", + "subject_line_noop": "Не копировать", + "subject_line_mastodon": "Как в Mastodon: скопировать как есть", + "subject_line_email": "Как в e-mail: \"re: тема\"", + "subject_line_behavior": "Копировать тему в ответах", + "no_mutes": "Нет игнорируемых", + "no_blocks": "Нет блокировок", + "notification_visibility_emoji_reactions": "Реакции", + "notification_visibility_moves": "Миграции пользователей", + "use_contain_fit": "Не обрезать вложения в миниатюрах", + "profile_fields": { + "value": "Значение", + "name": "Пункт", + "add_field": "Добавить поле", + "label": "Таблица метаданных профиля" + }, + "play_videos_in_modal": "Проигрывать видео во всплывающей рамке", + "mutes_tab": "Игнорируемые", + "invalid_theme_imported": "Выбраный файл не является темой Pleroma. Изменений в тему не было внесено.", + "import_blocks_from_a_csv_file": "Импортировать блокировки из CSV файла", + "hide_filtered_statuses": "Не показывать отфильтрованные статусы", + "hide_muted_posts": "Не показывать статусы игнорируемых пользователей", + "hide_post_stats": "Не показывать статистику статусов (например количество отметок «Нравится»)", + "use_one_click_nsfw": "Открывать NSFW вложения одним кликом", + "preload_images": "Предварительно загружать изображения", + "max_thumbnails": "Максимальное число миниатюр показываемых в статусе", + "emoji_reactions_on_timeline": "Показывать эмодзи реакции в ленте", + "domain_mutes": "Узлы", + "notification_setting_privacy": "Приватность", + "notification_setting_block_from_strangers": "Не показывать уведомления от пользователей которых вы не читаете", + "notification_setting_filters": "Фильтрация", + "notifications": "Уведомления", + "virtual_scrolling": "Оптимизировать рендеринг ленты" }, "timeline": { "collapse": "Свернуть", @@ -369,7 +456,11 @@ }, "status": { "bookmark": "В закладки", - "unbookmark": "Удалить из закладок" + "unbookmark": "Удалить из закладок", + "status_deleted": "Пост удален", + "reply_to": "Ответ", + "repeats": "Повторы", + "favorites": "Понравилось" }, "user_card": { "block": "Заблокировать", @@ -407,7 +498,11 @@ "quarantine": "Не федерировать посты пользователя", "delete_user": "Удалить пользователя", "delete_user_confirmation": "Вы уверены? Это действие нельзя отменить." - } + }, + "media": "С вложениями", + "mention": "Упомянуть", + "show_repeats": "Показывать повторы", + "hide_repeats": "Скрыть повторы" }, "user_profile": { "timeline_title": "Лента пользователя" @@ -480,12 +575,78 @@ }, "tool_tip": { "accept_follow_request": "Принять запрос на чтение", - "reject_follow_request": "Отклонить запрос на чтение" + "reject_follow_request": "Отклонить запрос на чтение", + "media_upload": "Прикрепить вложение" }, "image_cropper": { "save_without_cropping": "Сохранить не обрезая", "save": "Сохранить", "crop_picture": "Обрезать картинку", - "cancel": "Отмена" + "cancel": "Отменить" + }, + "errors": { + "storage_unavailable": "Pleroma не смогла получить доступ к хранилищу браузера. Ваша сессия и настройки не будут сохранены, и вы можете столкнуться с непредвиденными проблемами. Попробуйте включить файлы cookie." + }, + "polls": { + "not_enough_options": "Недостаточно уникальных вариантов в опросе", + "expired": "Опрос закончился {0} назад", + "expires_in": "Опрос заканчивается через {0}", + "expiry": "Срок опроса", + "multiple_choices": "Несколько вариантов", + "single_choice": "Один вариант", + "type": "Тип опроса", + "vote": "Проголосовать", + "votes": "голосов", + "option": "Вариант", + "add_option": "Добавить вариант", + "add_poll": "Прикрепить опрос" + }, + "media_modal": { + "next": "Следующая", + "previous": "Предыдущая" + }, + "importer": { + "error": "Произошла ошибка при импорте файла.", + "success": "Импорт прошел успешно.", + "submit": "Отправить" + }, + "selectable_list": { + "select_all": "Выбрать все" + }, + "emoji": { + "load_all": "Все {emojiAmount} эмодзи загружаются", + "load_all_hint": "Загружены первые {saneAmount} эмодзи, загрузка всех эмодзи может привести к проблемам с производительностью.", + "unicode": "Стандартные эмодзи", + "custom": "Пользовательские эмодзи", + "add_emoji": "Добавить эмодзи", + "search_emoji": "Поиск эмодзи", + "keep_open": "Оставить окно выбора открытым", + "emoji": "Эмодзи", + "stickers": "Стикеры" + }, + "shoutbox": { + "title": "Болтовня" + }, + "time": { + "days_short": "{0}дн", + "years_short": "{0}г", + "year_short": "{0}г", + "weeks_short": "{0}нед", + "week_short": "{0}нед", + "seconds_short": "{0}сек", + "second_short": "{0}с", + "now_short": "только что", + "now": "только что", + "months_short": "{0}мес", + "month_short": "{0}мес", + "minutes_short": "{0}мин", + "minute_short": "{0}мин", + "in_past": "{0} назад", + "in_future": "через {0}", + "hours_short": "{0}ч", + "hour_short": "{0}ч", + "hour": "{0} час", + "day_short": "{0}д", + "days": "{0} дней" } } diff --git a/src/i18n/uk.json b/src/i18n/uk.json index 73006e6e..f630b2dd 100644 --- a/src/i18n/uk.json +++ b/src/i18n/uk.json @@ -44,19 +44,19 @@ "mute": "Ігнорувати" }, "shoutbox": { - "title": "Для воплів" + "title": "Міні-чат" }, "about": { "staff": "Адміністрація", "mrf": { "simple": { - "media_nsfw_desc": "Даний інстанс примусово позначає вкладення з наступних інстансів як NSFW:", - "media_nsfw": "Примусове визначення вкладення як дратівливого", - "media_removal_desc": "Поточний інстанс видаляє вкладення на перелічених інстансах:", - "media_removal": "Видалення вкладень", + "media_nsfw_desc": "Даний інстанс примусово позначає медіа в наступних інстансах як NSFW:", + "media_nsfw": "Примусове визначення медіа як дратівливого", + "media_removal_desc": "Поточний інстанс видаляє медіа з дописів на перелічених інстансах:", + "media_removal": "Видалення медіа", "ftl_removal_desc": "Цей інстанс видаляє перелічені інстанси з \"Усієї відомої мережі\":", - "ftl_removal": "Видалення з \"Вся відома мережа\"", - "quarantine_desc": "Поточний інстанс буде надсилати тільки публічні пости наступним інстансам:", + "ftl_removal": "Видалення з \"Усієї відомої мережі\"", + "quarantine_desc": "Поточний інстанс буде надсилати тільки публічні дописи наступним інстансам:", "quarantine": "Карантин", "reject_desc": "Поточний інстанс не прийматиме повідомлення з перелічених інстансів:", "accept": "Прийняти", @@ -64,7 +64,7 @@ "accept_desc": "Поточний інстанс приймає повідомлення тільки з перелічених інстансів:", "simple_policies": "Правила поточного інстансу" }, - "mrf_policies_desc": "Правила MRF розповсюджуються на данний інстанс. Наступні правила активні:", + "mrf_policies_desc": "Правила MRF розповсюджуються на даний інстанс. Наступні правила активні:", "mrf_policies": "Активні правила MRF (модуль переписування повідомлень)", "keyword": { "is_replaced_by": "→", @@ -83,7 +83,16 @@ "password": "Пароль", "logout": "Вийти", "description": "Увійти за допомогою OAuth", - "login": "Увійти" + "login": "Увійти", + "recovery_code": "Код відновлення", + "enter_recovery_code": "Введіть код відновлення", + "authentication_code": "Код автентифікації", + "heading": { + "recovery": "Двофакторне відновлення", + "totp": "Двофакторна автентифікація" + }, + "enter_two_factor_code": "Введіть двофакторний код автентифікації", + "placeholder": "напр. stepan" }, "importer": { "error": "Під час імпортування файлу сталася помилка.", @@ -95,5 +104,674 @@ "save_without_cropping": "Зберегти не обрізаючи", "crop_picture": "Обрізати малюнок", "save": "Зберегти" + }, + "polls": { + "expired": "Опитування закінчилось {0} тому", + "expires_in": "Опитування закінчується через {0}", + "expiry": "Термін опитування", + "multiple_choices": "Декілька варіантів", + "single_choice": "Один варіант", + "add_option": "Додати опцію", + "type": "Тип опитування", + "vote": "Проголосувати", + "votes": "голосів", + "option": "Відповідь", + "add_poll": "Додати опитування", + "not_enough_options": "Замало унікальних варіантів в опитуванні" + }, + "notifications": { + "reacted_with": "додав реакцію: {0}", + "migrated_to": "мігрував на", + "no_more_notifications": "Немає більше сповіщень", + "repeated_you": "поширив(-ла) ваш допис", + "read": "Прочитано!", + "notifications": "Сповіщення", + "load_older": "Завантажити давніші сповіщення", + "follow_request": "хоче підписатись на вас", + "followed_you": "підписався(-лась) на вас", + "favorited_you": "вподобав(-ла) ваш допис", + "broken_favorite": "Невідомий допис, шукаю його…", + "error": "Помилка при оновленні сповіщень: {0}" + }, + "nav": { + "chats": "Локальні балачки", + "timelines": "Стрічки", + "twkn": "Уся відома мережа", + "about": "Інформація", + "preferences": "Налаштування", + "friend_requests": "Запити послідовників", + "who_to_follow": "Кого відстежувати", + "search": "Пошук", + "user_search": "Пошук користувача", + "bookmarks": "Закладки", + "timeline": "Домашня стрічка", + "public_tl": "Публічна стрічка", + "dms": "Приватні повідомлення", + "interactions": "Взаємодії", + "mentions": "Згадування", + "back": "Назад", + "administration": "Адміністрування" + }, + "media_modal": { + "next": "Наступна", + "previous": "Попередня" + }, + "password_reset": { + "instruction": "Введіть свою адресу електронної пошти або ім’я користувача. Ми надішлемо вам посилання для скидання пароля.", + "placeholder": "Ваша електронна адреса або ім'я користувача", + "check_email": "Перевірте електронну пошту на наявність посилання для скидання пароля.", + "return_home": "Повернутися на головну сторінку", + "too_many_requests": "Ви досягли ліміту спроб, спробуйте ще раз пізніше.", + "password_reset_required_but_mailer_is_disabled": "Ви повинні скинути свій пароль, але скидання пароля вимкнено. Зверніться до адміністратора інстансу.", + "password_reset_disabled": "Скидання пароля вимкнено. Зверніться до адміністратора інстансу.", + "password_reset_required": "Для входу потрібно скинути пароль.", + "password_reset": "Відновити пароль", + "forgot_password": "Забули пароль?" + }, + "chats": { + "you": "Ви:", + "message_user": "Повідомлення для {nickname}", + "delete": "Видалити", + "chats": "Чати", + "new": "Новий чат", + "empty_message_error": "Не вдається опублікувати порожнє повідомлення", + "more": "Більше", + "delete_confirm": "Ви дійсно хочете видалити це повідомлення?", + "error_loading_chat": "Під час завантаження чату сталася помилка.", + "error_sending_message": "Під час надсилання повідомлення сталася помилка.", + "empty_chat_list_placeholder": "У вас ще немає чатів. Почніть новий чат!" + }, + "file_type": { + "audio": "Аудіо", + "video": "Відео", + "image": "Зображення", + "file": "Файл" + }, + "display_date": { + "today": "Сьогодні" + }, + "interactions": { + "load_older": "Завантажити давніші взаємодії", + "follows": "Нові підписки", + "favs_repeats": "Повтори та вподобайки", + "moves": "Міграції користувачів" + }, + "errors": { + "storage_unavailable": "Pleroma не змогла отримати доступ до сховища браузеру. Ваша сесія та налаштування не будуть збережені, це може спричинити непередбачувані проблеми. Спробуйте увімкнути cookie." + }, + "emoji": { + "stickers": "Стікери", + "custom": "Користувацькі емодзі", + "search_emoji": "Пошук емодзі", + "keep_open": "Тримати панель відкритою", + "add_emoji": "Додати емодзі", + "emoji": "Емодзі", + "load_all": "Всі {emojiAmount} эмодзі завантажуються", + "load_all_hint": "Завантажені перші {saneAmount} емодзі, завантаження всіх емодзі може призвести до проблем з продуктивністю.", + "unicode": "Стандартні емодзі" + }, + "post_status": { + "content_type": { + "text/bbcode": "BBCode", + "text/markdown": "Markdown", + "text/html": "HTML", + "text/plain": "Простий текст" + }, + "attachments_sensitive": "Позначити вкладення як чутливі", + "account_not_locked_warning_link": "замкнена", + "account_not_locked_warning": "Ваша обліковка не {0}. Будь-хто може відстежувати вас для перегляду дописів тільки для відстежувачів.", + "new_status": "Створити допис", + "direct_warning_to_first_only": "Цей допис побачать лише користувачі, що були згадані на початку повідомлення.", + "direct_warning_to_all": "Цей допис побачать всі згадані користувачі.", + "default": "Що нового?", + "content_warning": "Тема (необов'язково)", + "preview": "Попередній перегляд", + "posting": "Відправляється", + "empty_status_error": "Не можу опублікувати пустий статус без вкладень", + "scope": { + "unlisted": "Непублічний - цей допис буде відсутній у публічних стрічках", + "public": "Піблічний - цей допис побачать усі", + "private": "Для читачів - цей допис побачать лише ваші читачі", + "direct": "Приватний - цей допис побачать лише згадані користувачі" + }, + "scope_notice": { + "unlisted": "Цей допис не буде видно в публічній стрічці та усій відомій мережі", + "private": "Цей допис побачать лише ваші підписники", + "public": "Цей допис бачитимуть усі" + }, + "preview_empty": "Пустий", + "media_description_error": "Не вдалось оновити медіа, спробуйте ще раз", + "media_description": "Опис медіа" + }, + "settings": { + "blocks_imported": "Блокування імпортовані! Їх обробка триватиме певний час.", + "block_import_error": "Помилка імпортування блокувань", + "block_import": "Імпорт блокувань", + "block_export_button": "Експорт блокувань у файл CSV", + "block_export": "Експорт блокувань", + "bio": "Про Вас", + "background": "Обкладинка", + "app_name": "Назва програми", + "follow_export": "Експортувати відстежуваних", + "filtering_explanation": "Усі статуси з цими словами будуть приховані, один на рядок", + "filtering": "Фільтрування", + "export_theme": "Зберегти переднабір", + "avatar_size_instruction": "Рекомендований мінімальний розмір для зображень аватара становить 150x150 пікселів.", + "delete_account_instructions": "Введіть ваш пароль в поле нижче, аби підтвердити видалення облікового запису.", + "delete_account_error": "Під час видалення вашого облікового запису виникла проблема. Якщо це трапляється постійно, будь ласка, зверніться до адміністратора вашого сервера.", + "delete_account_description": "Остаточно видалити ваш обліковий запис та усі ваші повідомлення.", + "delete_account": "Видалити обліковий запис", + "default_vis": "Обсяг видимості за замовчуванням", + "data_import_export_tab": "Імпорт/експорт даних", + "current_password": "Поточний пароль", + "confirm_new_password": "Підтвердіть новий пароль", + "composing": "Складання відповіді", + "collapse_subject": "Згорнути дописи з темами", + "changed_password": "Пароль успішно змінено!", + "change_password_error": "Не вдалося змінити пароль.", + "change_password": "Змінити пароль", + "cRed": "Червоний (Скасувати)", + "cGreen": "Зелений (Поширити)", + "cOrange": "Жовтогарячий (Вподобайки)", + "cBlue": "Блакитний (Відповісти, читати)", + "btnRadius": "Кнопки", + "blocks_tab": "Блокування", + "avatarRadius": "Аватарки", + "avatarAltRadius": "Аватарки у сповіщеннях", + "avatar": "Аватар", + "attachments": "Вкладення", + "attachmentRadius": "Вкладення", + "general": "Загальні", + "foreground": "Передній план", + "follows_imported": "Відстежуваних імпортовано! Їхня обробка потребує часу.", + "follow_import_error": "Помилка імпортування відстежуваних", + "follow_import": "Імпортувати відстежуваних", + "follow_export_button": "Експортувати відстежуваних до csv файлу", + "lock_account_description": "Обмежте свій обліковий запис лише схваленими читачами", + "links": "Посилання", + "limited_availability": "Недоступно у вашому браузері", + "invalid_theme_imported": "Вибраний файл не є темою Pleroma. У вашу тему не внесено жодних змін.", + "interfaceLanguage": "Мова оболонки", + "interface": "Оболонка", + "instance_default_simple": "(за замовчуванням)", + "instance_default": "(за замовчуванням: {value})", + "checkboxRadius": "Прапорці", + "inputRadius": "Поля вводу", + "import_theme": "Завантажити переднабір", + "import_followers_from_a_csv_file": "Імпортувати відстежуваних з csv файлу", + "import_blocks_from_a_csv_file": "Імпортувати заблокованих з csv файлу", + "hide_filtered_statuses": "Сховати відфільтровані статуси", + "hide_user_stats": "Приховувати статистику користувачів (напр. кількість відстежувачів)", + "hide_post_stats": "Приховувати статистику дописів (напр. кількість вподобаних)", + "use_one_click_nsfw": "Відкривати NSFW вкладення одним кліком миші", + "preload_images": "Передзавантажувати світлини", + "hide_isp": "Сховати панель з особливостями сервера", + "max_thumbnails": "Максимальна кількість мініатюр на повідомлення", + "hide_muted_posts": "Приховати повідомлення приглушених користувачів", + "hide_attachments_in_tl": "Приховувати вкладення у стрічці", + "hide_attachments_in_convo": "Приховувати вкладення у розмовах", + "mutes_tab": "Заглушені", + "loop_video_silent_only": "Зациклити відео без звуку (напр. Mastodon \"gifs\")", + "loop_video": "Зациклити відео", + "mfa": { + "verify": { + "desc": "Щоб увімкнути двофакторну автентифікацію, введіть код з вашого застосунку для двофакторної автентифікації:" + }, + "scan": { + "desc": "Відскануйте цей QR-код за допомогою програми двофакторної автентифікації або введіть текстовий ключ:", + "title": "Сканування", + "secret_code": "Ключ" + }, + "authentication_methods": "Методи автентифікації", + "recovery_codes_warning": "Запишіть ці коди і тримайте в безпечному місці - інакше ви їх ніколи не побачите. Якщо ви втратите доступ до OTP додатку - без резервних кодів ви не зможете отримати доступ до свого облікового запису.", + "waiting_a_recovery_codes": "Отримую резервні коди…", + "recovery_codes": "Резервні коди.", + "warning_of_generate_new_codes": "Після отримання нових резервних кодів, старі перестануть працювати.", + "generate_new_recovery_codes": "Згенерувати нові резервні коди", + "title": "Двофакторна автентифікація", + "confirm_and_enable": "Підтвердити та увімкнути OTP", + "wait_pre_setup_otp": "попереднє налаштування OTP", + "setup_otp": "Налаштування OTP", + "otp": "OTP" + }, + "enter_current_password_to_confirm": "Введіть свій поточний пароль", + "security": "Безпека", + "domain_mutes": "Домени", + "discoverable": "Дозволити виявлення цього облікового запису в результатах пошуку та інших службах", + "mutes_and_blocks": "Заглушені та блоковані", + "changed_email": "Email успішно змінено!", + "change_email_error": "Сталася помилка під час зміни email.", + "change_email": "Змінити email", + "bot": "Це обліковий запис бота", + "import_mutes_from_a_csv_file": "Імпорт заглушених з csv файлу", + "mutes_imported": "Заглушені імпортовані! Їх обробка триватиме певний час.", + "mute_export_button": "Експорт заглушених у csv файл", + "mute_import_error": "Під час імпорту заглушених сталася помилка", + "mute_import": "Імпорт ігнорувань", + "mute_export": "Експорт ігнорувань", + "new_password": "Новий пароль", + "new_email": "Нова ел. пошта", + "name_bio": "Особисті дані", + "set_new_profile_banner": "Встановити новий банер", + "set_new_avatar": "Встановити новий аватар", + "security_tab": "Безпека", + "saving_ok": "Налаштування збережені", + "saving_err": "Помилка при збереженні налаштувань", + "reply_visibility_self": "Показувати лише адресовані мені відповіді", + "reply_visibility_following": "Показувати відповіді адресовані лише мені або користувачам, яких я читаю", + "reply_visibility_all": "Показати всі відповіді", + "replies_in_timeline": "Відповіді в стрічці", + "profile_tab": "Профіль", + "profile_banner": "Банер профілю", + "profile_background": "Обкладинка профілю", + "revoke_token": "Відкликати", + "oauth_tokens": "OAuth ключі", + "token": "Ключ", + "refresh_token": "Оновити ключ", + "valid_until": "Діє до", + "use_contain_fit": "Не обрізати краї мініатюр", + "name": "Ім'я", + "profile_fields": { + "value": "Зміст", + "name": "Назва", + "add_field": "Додати поле", + "label": "Метадані профілю" + }, + "play_videos_in_modal": "Відтворювати відео у спливаючій рамці", + "accent": "Акцент", + "chatMessageRadius": "Повідомлення в бесіді", + "notification_mutes": "Щоб перестати отримувати сповіщення від певного користувача, заглушіть його.", + "user_mutes": "Користувачі", + "no_mutes": "Заглушені відсутні", + "emoji_reactions_on_timeline": "Показувати реакції емоджі на стрічці", + "pad_emoji": "Додавати простір з обидвох сторін емоджі, при додаванні з панелі", + "allow_following_move": "Дозволити автостеження при переміщенні на інший інстанс", + "set_new_profile_background": "Встановити нову обкладинку профілю", + "radii_help": "Радіус заокруглення кутів інтерфейсу (в пікселях)", + "presets": "Переднабір", + "show_moderator_badge": "Показувати значок модератора в моєму профілі", + "show_admin_badge": "Показувати значок адміністратора в моєму профілі", + "hide_followers_description": "Не показувати хто підписаний на мене", + "hide_follows_description": "Не показувати на кого я підписаний", + "no_rich_text_description": "Видалення всього форматування тексту з усіх дописів", + "notification_visibility_emoji_reactions": "Реакції", + "notification_visibility_moves": "Міграція користувача", + "notification_visibility_repeats": "Поширення допису", + "notification_visibility_mentions": "Згадування", + "notification_visibility_likes": "Вподобайки", + "notification_visibility_follows": "Нові підписки", + "notification_visibility": "Отримувати сповіщення про наступні події", + "settings": "Налаштування", + "panelRadius": "Панелі", + "text": "Текст", + "tooltipRadius": "Підказки/попередження", + "values": { + "true": "так", + "false": "ні" + }, + "user_settings": "Користувацькі налаштування", + "upload_a_photo": "Завантажити фото", + "theme": "Тема", + "style": { + "switcher": { + "keep_fonts": "Залишити шрифти", + "keep_roundness": "Залишити скруглення", + "keep_opacity": "Залишити прозорості", + "keep_shadows": "Залишити тіні", + "keep_color": "Залишити кольори", + "use_source": "Нова версія", + "use_snapshot": "Стара версія", + "load_theme": "Завантажити тему", + "reset": "Скинути", + "clear_all": "Очистити все", + "help": { + "older_version_imported": "Імпортований файл було створено в старішій версії FE.", + "future_version_imported": "Імпортований файл було створено в новішій версії FE.", + "v2_imported": "Файл, який ви імпортували, був створений для старішої версії інтерфейсу Pleroma. Ми намагаємось покращити сумісність, але все одно можуть бути розбіжності.", + "upgraded_from_v2": "PleromaFE було оновлено, тема може дещо відрізнятися від тієї, яку ви пам’ятаєте.", + "snapshot_source_mismatch": "Конфлікт версій: Швидше за все, FE повернуто до попередньої версії та оновлено знову, якщо ви змінили тему за допомогою старішої версії FE, швидше за все, ви хочете використовувати стару версію, інакше використовуйте нову версію.", + "migration_napshot_gone": "З якоїсь причини знімок зник, деякі речі можуть бути не такими, як ви пам’ятаєте.", + "migration_snapshot_ok": "Для безпеки, знімок теми завантажено. Ви можете спробувати завантажити дані теми.", + "fe_downgraded": "Версію PleromaFE змінено на старшу.", + "fe_upgraded": "Двигун теми PleromaFE оновлено.", + "snapshot_missing": "У файлі немає жодного знімка теми, тому він може виглядати інакше, ніж передбачалося спочатку.", + "snapshot_present": "Знімок теми завантажено, тому всі значення було перезаписано. Натомість ви можете завантажити правильні дані теми." + }, + "keep_as_is": "Залишити як є", + "clear_opacity": "Очистити прозорість", + "save_load_hint": "Параметри \"Зберегти\" зберігають встановлені на даний момент параметри під час вибору або завантаження тем, вони також зберігають зазначені параметри під час експорту теми. Коли всі прапорці знято, експортування теми збереже все." + }, + "common": { + "color": "Колір", + "contrast": { + "context": { + "text": "для тексту", + "18pt": "для великого (18pt+) тексту" + }, + "level": { + "bad": "Не відповідає жодним вимогам щодо доступності", + "aaa": "відповідає вимогам рівня ААA (рекомендований)", + "aa": "відповідає вимогам рівня АА (мінімальний)" + }, + "hint": "Рівень контрасту: {ratio}, {level} {context}" + }, + "opacity": "Прозорість" + }, + "preview": { + "mono": "змісту", + "text": "Трохи більше {0} та {1}", + "button": "Кнопка", + "error": "Приклад помилки", + "content": "Зміст", + "header": "Попередній перегляд", + "link": "невеличке посилання", + "header_faint": "Це нормально", + "input": "Що нового?", + "checkbox": "Я переглянув умови використання", + "fine_print": "Прочитайте наш {0} аби нічого нового не дізнатись!", + "faint_link": "корисний підручник" + }, + "shadows": { + "components": { + "button": "Кнопка", + "input": "Поле вводу", + "panel": "Панель", + "panelHeader": "Заголовок панелі", + "avatarStatus": "Аватар користувача (в стрічці)", + "avatar": "Аватар користувача (профіль)", + "buttonPressedHover": "Кнопка (натиснута + наведенний курсор)", + "buttonPressed": "Кнопка (натиснута)", + "buttonHover": "Кнопка (при наведенні)", + "popup": "Спливаючі вікна та підказки" + }, + "component": "Компонент", + "filter_hint": { + "inset_classic": "Тіні спрямовані всередину використовуватимуть {0}", + "spread_zero": "Тіні з поширенням > 0 відображатимуться так, ніби було встановлено нуль", + "avatar_inset": "Зауважте, що використання як вставних, так і невставних тіней на аватарах може привести до непередбачуваних результатів із прозорими аватарами.", + "drop_shadow_syntax": "{0} не підтримує параметр {1} та ключове слово {2}.", + "always_drop_shadow": "Увага! Ця тінь завжди використовує {0}, якщо підтримується браузером." + }, + "inset": "Всередину", + "blur": "Розмиття", + "shadow_id": "Тінь №{value}", + "override": "Перевизначити", + "_tab_label": "Тінь і підсвічування", + "hintV3": "Для тіней ви також можете використовувати позначення {0} для використання іншого кольорового слота." + }, + "fonts": { + "components": { + "input": "Поля вводу", + "interface": "Інтерфейс", + "postCode": "Моноширинний текст в дописі (форматований текст)", + "post": "Текст допису" + }, + "_tab_label": "Шрифти", + "size": "Розмір (в пікселях)", + "custom": "Нестандартний", + "weight": "Товщина", + "family": "Назва шрифту", + "help": "Виберіть шрифт для елементів інтерфейсу. Для \"нестандартного\" потрібно ввести точну назву шрифту, так як вона відображається в системі." + }, + "advanced_colors": { + "alert_warning": "Попередження", + "underlay": "Тло", + "inputs": "Поля входу", + "buttons": "Кнопки", + "borders": "Кордони", + "top_bar": "Верхня панель", + "panel_header": "Заголовок панелі", + "badge_notification": "Сповіщення", + "popover": "Підказки, меню, поповери", + "badge": "Тло значків", + "post": "Дописи/Дані користувачів", + "alert_neutral": "Нейтральний", + "alert_error": "Помилки", + "alert": "Фон сповіщень", + "_tab_label": "Додатково", + "selectedPost": "Вибраний допис", + "highlight": "Виділені елементи", + "poll": "Діаграма опитування", + "icons": "Іконки", + "faint_text": "Затемнений текст", + "chat": { + "border": "Кайма", + "outgoing": "Вихідні повідомлення", + "incoming": "Вхідні повідомлення" + }, + "toggled": "Переключено", + "disabled": "Вимкнено", + "selectedMenu": "Вибраний пункт меню", + "tabs": "Вкладки", + "pressed": "Натиснуто" + }, + "common_colors": { + "rgbo": "Піктограми, акценти, значки", + "foreground_hint": "Перегляньте вкладку \"Додатково\" для більшого контролю", + "main": "Загальні кольори", + "_tab_label": "Загальні" + }, + "radii": { + "_tab_label": "Округлість" + } + }, + "enable_web_push_notifications": "Увімкнути web push-сповіщення", + "notifications": "Сповіщення", + "fun": "Розваги", + "notification_setting_privacy": "Приватність", + "notification_setting_filters": "Фільтри", + "reset_avatar": "Скинути аватар", + "reset_profile_background": "Скинути обкладинку профілю", + "reset_avatar_confirm": "Ви дійсно хочете скинути аватар?", + "reset_profile_banner": "Скинули банер профілю", + "hide_follows_count_description": "Не показувати на кого я підписаний", + "reset_banner_confirm": "Ви дійсно хочете скинути банер?", + "reset_background_confirm": "Ви дійсно хочете скинути обкладинку?", + "subject_line_behavior": "Вигляд теми при відповіді", + "subject_input_always_show": "Завжди показувати поле для вводу теми", + "minimal_scopes_mode": "Мінімізувати набір варіантів осягу для допису", + "scope_copy": "Копіювати осяг при відповіді (завжди ввімкнено для особистих повідомлень)", + "search_user_to_mute": "Шукайте кого ви хочете заглушити", + "search_user_to_block": "Шукайте кого ви хочете заблокувати", + "autohide_floating_post_button": "Автоматично ховати кнопку \"Новий допис\" (в мобільній версії)", + "pause_on_unfocused": "Призупинити трансляцію, коли вкладка неактивна", + "hide_followers_count_description": "Не показувати кількість читачів", + "notification_blocks": "Блокування користувача зупиняє всі сповіщення від нього, а також скасовує його відстеження.", + "notification_setting_hide_notification_contents": "Ховати відправника та вміст push-сповіщень", + "notification_setting_block_from_strangers": "Блокувати сповіщення від користувачів за якими ви не слідкуєте", + "type_domains_to_mute": "Пошук доменів для заглушення", + "nsfw_clickthrough": "Увімкнути приховування NSFW медіа", + "greentext": "Мемний текст", + "virtual_scrolling": "Оптимізувати оновлення стрчки", + "theme_help_v2_2": "Піктограми під деякими записами є показниками контрасту між фоном та текстом. Коли ви наведете на них курсор, ви отримаєте детальну інформацію. Пам'ятайте, якщо ви використовуєте прозорість, індикатори показують найгірший варіант.", + "theme_help_v2_1": "Ви також можете замінити кольори та видимість окремих компонентів, перемикаючи прапорці, використовуйте \"Очистити все\", щоб видалити всі заміни.", + "theme_help": "Використовувати шістнадцяткові коди кольору (#rrggbb) щоб редагувати тему.", + "no_blocks": "Блокування відсутні", + "subject_line_mastodon": "Як в mastodon: просто скопіювати", + "subject_line_email": "Як в email: \"re: тема\"", + "useStreamingApiWarning": "(Не рекомендується, експериментально, повідомлення можуть зникати)", + "useStreamingApi": "Отримувати повідомлення та сповіщення в режимі реального часу", + "streaming": "Ввімкнути автоматичне завантаження нових повідомлень при прокручуванні вгору", + "stop_gifs": "Відтворювати GIF анімації тільки при наведенні", + "post_status_content_type": "Тип вмісту допису", + "subject_line_noop": "Не копіювати", + "version": { + "frontend_version": "Версія фронтенду", + "backend_version": "Версія бекенду", + "title": "Версія" + } + }, + "selectable_list": { + "select_all": "Вибрати все" + }, + "remote_user_resolver": { + "error": "Не знайдено.", + "searching_for": "Шукаю", + "remote_user_resolver": "Пошукова система для віддалених користувачів" + }, + "registration": { + "validations": { + "password_confirmation_match": "пароль та підтвердження паролю мають співпадати", + "password_confirmation_required": "не може бути порожнім", + "password_required": "не може бути порожнім", + "email_required": "не може бути порожнім", + "fullname_required": "не може бути порожнім", + "username_required": "не може бути порожнім" + }, + "bio_placeholder": "напр.\nНаш народ завжди прагне волі для себе і бажає її для інших народів. Він боровся і бореться за правду і справедливість. Ми хочемо жити у згоді і взаємному шануванні з усіми народами доброї волі. Такі самі права визнаємо за іншими народами, за які боремося для себе.", + "fullname_placeholder": "напр. Степан Бандера", + "username_placeholder": "напр. stepan", + "new_captcha": "Натисніть на зображення, щоб оновити код, якщо він нерозбірливий", + "token": "Ключ запрошення", + "registration": "Реєстрація", + "password_confirm": "Підтвердження паролю", + "fullname": "Відображене ім'я", + "email": "Ел. пошта", + "bio": "Про себе", + "captcha": "CAPTCHA" + }, + "who_to_follow": { + "who_to_follow": "На кого підписатися", + "more": "Більше" + }, + "tool_tip": { + "repeat": "Поширити", + "reply": "Відповісти", + "add_reaction": "Додати реакцію", + "user_settings": "Налаштування користувача", + "favorite": "Подобається", + "reject_follow_request": "Відхилити запит на підписку", + "accept_follow_request": "Прийняти запит на підписку", + "media_upload": "Завантажити медіа" + }, + "upload": { + "error": { + "base": "Збій при завантаженні.", + "file_too_big": "Файл завеликий [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", + "default": "Спробуйте ще раз пізніше" + }, + "file_size_units": { + "TiB": "ТіБ", + "GiB": "ГіБ", + "MiB": "МіБ", + "KiB": "КіБ", + "B": "Б" + } + }, + "time": { + "weeks_short": "{0}тижд.", + "week_short": "{0}тижд.", + "years_short": "{0}р", + "year_short": "{0}р", + "years": "{0} роки", + "year": "{0} рік", + "weeks": "{0} тижднів", + "week": "{0} тиждень", + "second_short": "{0}с", + "second": "{0} секунда", + "now_short": "щойно", + "now": "щойно", + "months_short": "{0}міс.", + "month_short": "{0}міс.", + "months": "{0} місяці", + "month": "{0} місяць", + "minutes_short": "{0}хв", + "hours_short": "{0}год", + "hour_short": "{0}год", + "day_short": "{0}д", + "minute_short": "{0}хв", + "minutes": "{0} хвилини", + "minute": "{0} хвилина", + "in_past": "{0} тому", + "hours": "{0} години", + "hour": "{0} година", + "days_short": "{0}д", + "days": "{0} дні", + "day": "{0} день", + "seconds_short": "{0}с", + "seconds": "{0} секунди", + "in_future": "через {0}" + }, + "search": { + "no_results": "Немає результатів", + "hashtags": "Хештеги", + "people": "Люди" + }, + "user_card": { + "statuses": "Дописи", + "message": "Повідомлення", + "follow": "Підписатись", + "follow_unfollow": "Відписатись", + "follow_again": "Відправити запит знову?", + "follow_sent": "Запит відправлено!", + "blocked": "Заблоковано!", + "admin_menu": { + "activate_account": "Активувати обліковий запис", + "deactivate_account": "Деактивувати обліковий запис", + "delete_account": "Видалити аккаунт", + "moderation": "Модерація", + "delete_user_confirmation": "Ви абсолютно впевнені? Цю дію неможливо буде скасовувати.", + "delete_user": "Видалити обліковий запис", + "strip_media": "Вилучити медіа з дописів користувача", + "force_nsfw": "Позначити всі дописи як NSFW" + }, + "deny": "Відмовити", + "block": "Заблокувати", + "approve": "Схвалити", + "mention": "Згадати", + "unsubscribe": "Відписатись", + "subscribe": "Підписатись", + "report": "Поскаржитись", + "per_day": "на день", + "favorites": "Вподобання", + "media": "Медіа" + }, + "status": { + "copy_link": "Скопіювати посилання на допис", + "status_unavailable": "Допис недоступний", + "replies_list": "Відповіді:", + "delete_confirm": "Ви дійсно хочете видалити цей допис?", + "delete": "Видалити допис", + "pin": "Закріпити в профілі", + "status_deleted": "Цей допис був видалений", + "favorites": "Вподобане", + "hide_content": "Сховати вміст", + "show_content": "Показати вміст", + "hide_full_subject": "Сховати всю тему", + "show_full_subject": "Показати всю тему", + "thread_muted_and_words": ", має слова:", + "mute_conversation": "Заглушити розмову", + "reply_to": "Відповідь", + "unbookmark": "Видалити із закладок", + "bookmark": "Додати до закладок", + "pinned": "Закріплено", + "unpin": "Відкріпити від профілю", + "repeats": "Повтори" + }, + "timeline": { + "no_more_statuses": "Більше немає дописів", + "up_to_date": "Оновлено", + "reload": "Оновити", + "show_new": "Показати нові", + "load_older": "Завантажити давніші дописи", + "error": "Помилка завантаження стрічки: {0}", + "collapse": "Згорнути", + "conversation": "Розмова", + "no_statuses": "Ніяких статусів", + "repeated": "поширив(-ла)", + "no_retweet_hint": "Запис, позначено як \"тільки для відстежувачів\" або \"особисте\" і тому не може бути повторений" + }, + "user_reporting": { + "submit": "Відправити", + "forward_to": "Переслати до {0}", + "forward_description": "Цей обліковий запис належить іншому інстансу. Відправити їм копію скарги?", + "additional_comments": "Додаткове пояснення", + "add_comment_description": "Скарга буде надіслана модераторам вашого інстансу. Нижче Ви можете додати пояснення чому ви вирішили поскаржитись на цей обліковий запис:", + "title": "Поскаржитись на {0}", + "generic_error": "Виникла помилка під час обробки вашого запиту." + }, + "user_profile": { + "profile_loading_error": "Вибачте, під час завантаження цього профілю виникла помилка.", + "profile_does_not_exist": "Вибачте, цей профіль більше не існує." } } diff --git a/src/services/chat_service/chat_service.js b/src/services/chat_service/chat_service.js index 1fc4e390..e653ebc1 100644 --- a/src/services/chat_service/chat_service.js +++ b/src/services/chat_service/chat_service.js @@ -21,7 +21,7 @@ const clear = (storage) => { failedMessageIds.push(message.id) } else { delete storage.idIndex[message.id] - delete storage.idempotencyKeyIndex[message.id] + delete storage.idempotencyKeyIndex[message.idempotency_key] } } diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index e3a52489..b1e68df5 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -280,7 +280,7 @@ export const parseStatus = (data) => { if (output.poll) { output.poll.options = (output.poll.options || []).map(field => ({ ...field, - title_html: addEmojis(field.title, data.emojis) + title_html: addEmojis(escape(field.title), data.emojis) })) } output.pinned = data.pinned