Compare commits

...

14 Commits

Author SHA1 Message Date
syuilo
d10ad1b413 12.56.0 2020-11-14 14:34:04 +09:00
syuilo
34063a0b84 New Crowdin updates (#6820)
* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Russian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Ukrainian)
2020-11-14 14:32:53 +09:00
syuilo
8c9d975d69 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2020-11-14 14:32:04 +09:00
syuilo
03b072b894 Resolve #6704 2020-11-14 14:32:01 +09:00
futchitwo
d1bed49808 typoらしきものを修正 (#6825)
mame→name
2020-11-14 12:52:38 +09:00
syuilo
6c3417d9b5 Improve MkRadios 2020-11-14 12:50:24 +09:00
syuilo
ba65226460 UI整理 2020-11-14 12:16:28 +09:00
syuilo
9c9cd168ee Improve emoji picker 2020-11-14 11:47:30 +09:00
syuilo
abb3d2a8d9 Fix #6832 2020-11-14 09:59:33 +09:00
syuilo
637fe8a04b Update dependencies 🚀 2020-11-14 09:54:39 +09:00
syuilo
be321e95e5 Bump node version 2020-11-14 09:45:16 +09:00
MeiMei
ed46c1486c Fix toHtml (#6824) 2020-11-10 21:00:14 +09:00
syuilo
c9fcfc6862 Better MFM rendering 2020-11-09 22:32:01 +09:00
syuilo
8495e37566 Fix router 2020-11-09 22:31:50 +09:00
27 changed files with 618 additions and 401 deletions

View File

@@ -1 +1 @@
v14.4.0
v15.0.1

View File

@@ -1,4 +1,4 @@
FROM node:14.4.0-alpine AS base
FROM node:15.0.1-alpine AS base
ENV NODE_ENV=production

View File

@@ -604,13 +604,53 @@ system: "System"
switchUi: "UI wechseln"
desktop: "Desktop"
_mfm:
cheatSheet: "MFM Spickzettel"
intro: "MFM ist eine an vielen Stellen verwendbare und Misskey-exklusive Markup-Sprache. Hier kannst du eine Liste von verfügbarer MFM-Syntax anschauen."
dummy: "Misskey erweitert die Welt des Fediverse"
mention: "Erwähnung"
mentionDescription: "Mit At-Zeichen und Nutzername kann ein individueller Nutzer angegeben werden."
hashtag: "Hashtag"
hashtagDescription: "Mit einer Raute und Text kann ein Hashtag angegeben werden."
url: "URL"
urlDescription: "URLs können angezeigt werden."
link: "Link"
center: "Bestandteile zentrieren"
quote: "Zitieren"
linkDescription: "Ein spezifizierter Textabschnitt kann als URL angezeigt werden."
bold: "Fett"
boldDescription: "Zeichen zur Betonung dicker erscheinen lassen."
small: "Klein"
smallDescription: "Inhalt klein und dünn erscheinen lassen."
center: "Zentrieren"
centerDescription: "Inhalt zentriert anzeigen lassen."
inlineCode: "Code (Eingebettet)"
inlineCodeDescription: "Syntax-Hervorhebung für (Programm-)Code eingebettet anzeigen lassen."
blockCode: "Code (Block)"
blockCodeDescription: "Syntax-Hervorhebung für mehrzeiligen (Programm-)Code als Block anzeigen lassen."
inlineMath: "Mathe (Eingebettet)"
inlineMathDescription: "Mathematische Formeln (KaTeX) eingebettet anzeigen."
blockMath: "Mathe (Block)"
blockMathDescription: "Mehrzeilige mathematische Formeln (KaTeX) als Block einbetten."
quote: "Zitationen"
quoteDescription: "Inhalt als Zitat anzeigen lassen."
emoji: "Benutzerdefinierte Emojis"
search: "Suchen"
emojiDescription: "Emoji-Namen mit Doppelpunkten umschließen, um benutzerdefinierte Emojis anzeigen zu lassen."
search: "Suche"
searchDescription: "Eine vorgefertige Suchanfragebox anzeigen lassen."
flip: "Spiegelung"
flipDescription: "Inhalt horizontal oder vertikal gespiegelt anzeigen lassen."
jelly: "Animation (Dehnen)"
jellyDescription: "Verleiht eine sich dehnende Animation."
tada: "Animation (Tada)"
tadaDescription: "Verleiht eine Animation mit \"Tada!\"-Gefühl"
jump: "Animation (Sprung)"
jumpDescription: "Verleiht eine springende Animation."
bounce: "Animation (Federn)"
bounceDescription: "Erzeugt eine federnde Animation."
shake: "Animation (Zittern)"
shakeDescription: "Verleiht eine zitternde Animation."
twitch: "Animation (Zucken)"
twitchDescription: "Verleiht eine sehr stark zuckende Animation."
spin: "Animation (Rotieren)"
spinDescription: "Verleiht eine rotierende Animation."
_reversi:
reversi: "Reversi"
gameSettings: "Spieleinstellungen"

View File

@@ -604,13 +604,53 @@ system: "System"
switchUi: "Switch UI"
desktop: "Desktop"
_mfm:
cheatSheet: "MFM Cheatsheet"
intro: "MFM is a Misskey-exclusive markup language that can be used in many places. Here you can view a list of all available MFM syntax."
dummy: "Misskey expands the world of the Fediverse"
mention: "Mention"
mentionDescription: "Using an At-Symbol and a username, you can specify a specific user."
hashtag: "Hashtag"
hashtagDescription: "Using a number sign and text, you can specify a hashtag."
url: "URL"
urlDescription: "URLs can be displayed."
link: "Link"
center: "Center elements"
linkDescription: "Specific parts of text can be displayed as URL."
bold: "Bold"
boldDescription: "Highlights letters by making them thicker."
small: "Small"
smallDescription: "Displays contents small and thinn."
center: "Center"
centerDescription: "Displays content centered."
inlineCode: "Code (Inline)"
inlineCodeDescription: "Displays inline syntax highlighting for (program-)code."
blockCode: "Code (Block)"
blockCodeDescription: "Displays syntax highlighting for multi-line (program-)code in a block."
inlineMath: "Math (In-line)"
inlineMathDescription: "Display math formulas (KaTeX) in-line"
blockMath: "Math (Block)"
blockMathDescription: "Display multi-line Math formulas (KaTeX) in a block"
quote: "Quote"
quoteDescription: "Displays content as quote."
emoji: "Custom Emoji"
emojiDescription: "By surrounding a custom emoji name with colons, custom emoji can be displayed."
search: "Search"
searchDescription: "Displays a search box with pre-entered text."
flip: "Flip"
flipDescription: "Flips content horizontally or vertically."
jelly: "Animation (Jelly)"
jellyDescription: "Infuses a jelly-like animation."
tada: "Animation (Tada)"
tadaDescription: "Infuses a \"Tada!\"-like animation."
jump: "Animation (Jump)"
jumpDescription: "Infuses a jumping animation."
bounce: "Animation (Bounce)"
bounceDescription: "Causes a bouncy animation."
shake: "Animation (Shake)"
shakeDescription: "Infuses a shaking animation."
twitch: "Animation (Twitch)"
twitchDescription: "Infuses a strongly twitching animation."
spin: "Animation (Spin)"
spinDescription: "Infuses a spinning animation."
_reversi:
reversi: "Reversi"
gameSettings: "Game settings"

View File

@@ -540,6 +540,7 @@ pluginInstallWarn: "Por favor no instale plugins que no son de confianza"
deck: "Deck"
undeck: "Quitar deck"
useBlurEffectForModal: "Usar efecto borroso en modales"
useFullReactionPicker: "Reacción"
generateAccessToken: "Generar token de acceso"
permission: "Permisos"
enableAll: "Activar todo"
@@ -603,13 +604,22 @@ system: "Sistema"
switchUi: "Cambiar interfaz de usuario"
desktop: "Escritorio"
_mfm:
cheatSheet: "Hoja de referencia de MFM"
intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares dentro de Misskey. Aquí puede ver una lista de sintaxis disponibles en MFM."
mention: "Menciones"
mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar para notificar a un usuario en particular."
hashtag: "Hashtag"
url: "URL"
link: "Vínculo"
bold: "Negrita"
center: "Centrar"
blockCode: "Código (bloque)"
blockCodeDescription: "Código de resaltado de sintaxis, como programas de varias líneas con bloques."
quote: "Citar"
emoji: "Emojis personalizados"
search: "Buscar"
flip: "Echar de un capirotazo"
flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda / derecha."
_reversi:
reversi: "Reversi"
gameSettings: "Configuración del juego"

View File

@@ -214,6 +214,7 @@ imageUrl: "画像URL"
remove: "削除"
removed: "削除しました"
removeAreYouSure: "「{x}」を削除しますか?"
resetAreYouSure: "リセットしますか?"
saved: "保存しました"
messaging: "チャット"
upload: "アップロード"

View File

@@ -11,7 +11,7 @@ ok: "Окей"
gotIt: "Ясно!"
cancel: "Отмена"
enterUsername: "Введите имя пользователя"
renotedBy: "{user} передаёт"
renotedBy: "{user} делится"
noNotes: "Нет ни одной заметки"
noNotifications: "Нет ни одного уведомления"
instance: "Инстанс"
@@ -266,7 +266,7 @@ unableToDelete: "Удаление невозможно"
inputNewFileName: "Введите имя нового файла"
inputNewFolderName: "Пожалуйста, введите новое имя папки!"
circularReferenceFolder: "Вы пытаетесь переместить папку внутрь себя."
hasChildFilesOrFolders: "В этой папке что-то есть, так что она не может быть удалена."
hasChildFilesOrFolders: "Эта папка не пуста и не может быть удалена."
copyUrl: "Копировать ссылку"
rename: "Переименовать"
avatar: "Аватар"
@@ -604,13 +604,53 @@ system: "Система"
switchUi: "Выбор вида"
desktop: "Стол"
_mfm:
cheatSheet: "Подсказка по разметке MFM"
intro: "MFM — язык оформления текста, придуманный специально для Misskey, который здесь можно много где использовать. На этой странице собраны и кратко изложены способы его применения."
dummy: "Misskey расширяет границы Федиверса."
mention: "Упоминание"
mentionDescription: "При помощи знака «собака» перед именем можно упомянуть какого-нибудь пользователя."
hashtag: "Хэштег"
link: "Ссылка"
hashtagDescription: "При помощи знака «решётка» перед словом задаётся хэштег."
url: "Простая ссылка (URL)"
urlDescription: "Ссылки могут отображаться непосредственно."
link: "Ссылка с пояснением"
linkDescription: "Можно ссылку оформить в виде произвольного текста."
bold: "Жирный шрифт"
boldDescription: "Выделяет текст, делая буквы жирнее."
small: "Мелкий шрифт"
smallDescription: "Делает текст маленьким и незаметным."
center: "Выровнять элементы по центру"
centerDescription: "Так можно выровнять что-то по центру."
inlineCode: "Программа (в тексте)"
inlineCodeDescription: "Подсвечивает фрагмент программы внутри сплошного текста."
blockCode: "Программа (блок)"
blockCodeDescription: "Оформляет текст программы в виде отдельного блокоа. Он может состоять из множества строк."
inlineMath: "Математическое выражение (в тексте)"
inlineMathDescription: "Позволяет вставлять математические выражения внутрь текста при помощи языка KaTeX."
blockMath: "Математическое выражение (блок)"
blockMathDescription: "Оформляет математическое выражение (KaTeX) на отдельной строке."
quote: "Цитата"
quoteDescription: "Так можно процитировать чей-то текст."
emoji: "Эмодзи пользователя"
emojiDescription: "Можно вставить эмодзи в текст, окружив название двоеточиями."
search: "Поиск"
searchDescription: "Можно добавить форму для поиска, сразу задав, что искать."
flip: "Переворот"
flipDescription: "Позволяет отразить текст зеркально по вертикали или горизонтали."
jelly: "Анимация желе (шлёп-плёп)"
jellyDescription: "Напоминает горку джема, дёргающуюся от шлепков."
tada: "Анимация (та-дам!)"
tadaDescription: "Получается нечто выпрыгивающее, как бы крича: «а вот и я!»"
jump: "Анимация прыжков (прыг-скок)"
jumpDescription: "Побуждает радостно подпрыгивать."
bounce: "Анимация отскоков (бум-бум)"
bounceDescription: "Это будет скакать как мяч."
shake: "Анимация дрожи (б-р-р-р)"
shakeDescription: "Такое дрожит, словно от холода. Или от страха."
twitch: "Анимация тряски"
twitchDescription: "Заставляет трястись как одержимого"
spin: "Вращение"
spinDescription: "Так можно крутить содержимое в разных направлениях."
_reversi:
reversi: "Реверси"
gameSettings: "Настройки игры"

View File

@@ -5,6 +5,7 @@ search: "Пошук"
notifications: "Сповіщення"
username: "Ім'я користувача"
password: "Пароль"
fetchingAsApObject: "Отримуємо з федіверсу..."
ok: "OK"
gotIt: "Зрозуміло!"
cancel: "Скасувати"
@@ -110,6 +111,7 @@ editWidgetsExit: "Готово"
customEmojis: "Кастомні емоджі"
emoji: "Емоджі"
emojiName: "Назва емоджі"
emojiUrl: "URL емодзі"
addEmoji: "Додати емодзі"
settingGuide: "Рекомендована конфігурація"
cacheRemoteFiles: "Кешувати дані з інших інстансів"
@@ -141,6 +143,7 @@ storageUsage: "Використання простіру"
charts: "Графіки"
perHour: "Щогодини"
perDay: "Щоденно"
stopActivityDelivery: "Припинити розсилання активності"
blockThisInstance: "Заблокувати цей інстанс"
operations: "Операції"
software: "Програмне забезпечення"
@@ -155,7 +158,9 @@ disk: "Диск"
instanceInfo: "Про цей інстанс"
statistics: "Статистика"
clearQueue: "Очистити чергу"
clearQueueConfirmTitle: "Ви впевнені, що хочете очистити чергу?"
clearCachedFiles: "Очистити кеш"
clearCachedFilesConfirm: "Ви впевнені, що хочете видалити всі кешовані файли?"
blockedInstances: "Заблоковані інстанси"
muteAndBlock: "Ігнор і блокування"
mutedUsers: "Ігноровані користувачі"
@@ -172,6 +177,7 @@ noCustomEmojis: "Немає кастомних емоджі"
noJobs: "Немає завдань"
federating: "Федерується"
blocked: "Заблоковано"
suspended: "Призупинено"
notResponding: "Не відповідає"
changePassword: "Змінити пароль"
security: "Безпека"
@@ -195,7 +201,9 @@ fromUrl: "З URL"
uploadFromUrl: "Завантажити з URL"
explore: "Огляд"
games: "Ігри Misskey"
noMoreHistory: "Подальшої історії немає"
start: "Розпочати"
home: "Домівка"
activity: "Активність"
images: "Зображення"
birthday: "День народження"
@@ -221,17 +229,30 @@ createFolder: "Створити теку"
renameFolder: "Перейменувати теку"
deleteFolder: "Видалити теку"
addFile: "Додати файл"
emptyDrive: "Диск порожній"
emptyFolder: "Тека порожня"
unableToDelete: "Видалення неможливе"
inputNewFileName: "Введіть ім'я нового файлу"
inputNewFolderName: "Введіть ім'я нової теки"
hasChildFilesOrFolders: "Ця тека не порожня і не може бути видалена"
copyUrl: "Копіювати URL"
rename: "Перейменувати"
avatar: "Аватар"
banner: "Банер"
nsfw: "NSFW"
disconnectedFromServer: "Підключення до сервера було перервано"
reload: "Оновити"
doNothing: "Нічого не робити"
reloadConfirm: "Перезавантажити стрічку?"
watch: "Стежити"
unwatch: "Не стежити"
accept: "Прийняти"
reject: "Відхилити"
instanceName: "Назва інстансу"
instanceDescription: "Описання інстансу"
maintainerName: "Ім'я адміністратора"
maintainerEmail: "Email адміністратора"
tosUrl: "URL умов використання"
thisYear: "Рік"
thisMonth: "Місяць"
today: "День"
@@ -239,19 +260,149 @@ dayX: "{day}"
monthX: "{month}"
yearX: "{year}"
pages: "Сторінки"
integration: "Інтеграція"
connectSerice: "Під’єднатися"
disconnectSerice: "Відключитися"
enableLocalTimeline: "Увімкнути локальну стрічку"
enableGlobalTimeline: "Увімкнути глобальну стрічку"
registration: "Реєстрація"
enableRegistration: "Дозволити реєстрацію"
invite: "Запрошення"
proxyRemoteFiles: "Проксувати файли з інших інстансів"
iconUrl: "URL аватара"
bannerUrl: "URL банера"
basicInfo: "Основна інформація"
pinnedUsers: "Закріплені користувачі"
hcaptcha: "hCaptcha"
enableHcaptcha: "Увімкнути hCaptcha"
hcaptchaSiteKey: "Ключ сайту"
hcaptchaSecretKey: "Секретний ключ"
recaptcha: "reCAPTCHA"
enableRecaptcha: "Увімкнути reCAPTCHA"
recaptchaSiteKey: "Ключ сайту"
recaptchaSecretKey: "Секретний ключ"
antennas: "Антени"
manageAntennas: "Налаштування антен"
name: "Ім'я"
antennaSource: "Джерело антени"
antennaKeywords: "Ключові слова антени"
antennaExcludeKeywords: "Винятки"
serviceworker: "ServiceWorker"
enableServiceworker: "Ввімкнути ServiceWorker"
caseSensitive: "З урахуванням регістру"
notesAndReplies: "Дописи та відповіді"
popularUsers: "Популярні користувачі"
recentlyUpdatedUsers: "Нещодавно активні користувачі"
recentlyRegisteredUsers: "Нещодавно зареєстровані користувачі"
recentlyDiscoveredUsers: "Нещодавно знайдені користувачі"
exploreUsersCount: "{count} користувачів"
exploreFediverse: "Огляд федіверсу"
popularTags: "Популярні теги"
userList: "Списки"
about: "Інформація"
aboutMisskey: "Про Misskey"
administrator: "Адмін"
token: "Токен"
twoStepAuthentication: "Двохфакторна аутентифікація"
moderator: "Модератор"
securityKey: "Ключ захисту"
securityKeyName: "Назва ключа"
registerSecurityKey: "Зареєструвати ключ захисту"
lastUsed: "Востаннє використано"
unregister: "Скасувати реєстрацію"
passwordLessLogin: "Налаштувати вхід без пароля"
resetPassword: "Скинути пароль"
newPasswordIs: "Новий пароль: {password}"
share: "Поділитись"
notFound: "Не знайдено"
cacheClear: "Очистити кеш"
help: "Допомога"
inputMessageHere: "Введіть повідомлення тут"
close: "Закрити"
group: "Група"
groups: "Групи"
createGroup: "Створити групу"
ownedGroups: "Власні групи"
invites: "Запрошення"
groupName: "Назва групи"
transfer: "Передача"
messagingWithUser: "Чат з користувачами"
messagingWithGroup: "Чат з групою"
title: "Тема"
text: "Текст"
next: "Далі"
retype: "Введіть ще раз"
noteOf: "Допис {user}"
inviteToGroup: "Запрошення до групи"
maxNoteTextLength: "Максимальна довжина допису"
quoteAttached: "Цитата"
quoteQuestion: "Ви хочете додати цитату?"
noMessagesYet: "Ще немає повідомлень"
newMessageExists: "Є нові повідомлення"
onlyOneFileCanBeAttached: "До повідомлення можна вкласти лише один файл"
signinRequired: "Будь ласка, авторизуйтесь"
invitations: "Запрошення"
invitationCode: "Код запрошення"
checking: "Перевірка…"
available: "Доступно"
unavailable: "Недоступно"
usernameInvalidFormat: "літери, цифри та _ є прийнятними"
tooShort: "Занадто короткий"
tooLong: "Занадто довгий"
weakPassword: "Слабкий пароль"
strongPassword: "Міцний пароль"
passwordMatched: "Все вірно"
passwordNotMatched: "Паролі не співпадають"
signinWith: "Увійти за допомогою {x}"
uiLanguage: "Мова інтерфейсу"
aboutX: "Про {x}"
useOsNativeEmojis: "Використовувати емодзі ОС"
youHaveNoGroups: "Немає груп"
noHistory: "Історія порожня"
disableAnimatedMfm: "Відключити анімації MFM"
doing: "Виконується"
category: "Категорія"
tags: "Теги"
docSource: "Джерело цього документа"
createAccount: "Створити акаунт"
existingAcount: "Існуючий акаунт"
regenerate: "Оновити"
fontSize: "Розмір шрифту"
noFollowRequests: "Немає запитів на підписку"
dashboard: "Панель приладів"
local: "Локальні"
remote: "Віддалений"
total: "Всього"
appearance: "Вигляд"
clientSettings: "Налаштування клієнта"
accountSettings: "Налаштування акаунта"
promotion: "Просування"
promote: "Просунути"
numberOfDays: "Кількість днів"
hideThisNote: "Сховати цей допис"
showInPage: "Показати на сторінці"
sort: "Сортування"
ascendingOrder: "За зростанням"
descendingOrder: "За спаданням"
script: "Скрипт"
deleteAllFiles: "Видалити всі файли"
deleteAllFilesConfirm: "Ви дійсно хочете видалити всі файли?"
sidebar: "Бокова панель"
rooms: "Кімнати"
relays: "Ретранслятори"
addRelay: "Додати ретранслятор"
smtpHost: "Хост"
smtpUser: "Ім'я користувача"
smtpPass: "Пароль"
regenerateLoginToken: "Оновити Login Token"
_mfm:
cheatSheet: " Довідка MFM"
mention: "Згадка"
quote: "Цитата"
emoji: "Кастомні емоджі"
search: "Пошук"
_reversi:
total: "Всього"
_sidebar:
icon: "Аватар"
_theme:
@@ -272,17 +423,21 @@ _widgets:
_cw:
show: "Показати більше"
_visibility:
home: "Головна"
home: "Домівка"
followers: "Підписники"
localOnly: "Лише локально"
_postForm:
replyPlaceholder: "Відповідь на допис..."
_profile:
name: "Ім'я"
username: "Ім'я користувача"
_exportOrImport:
followingList: "Підписки"
muteList: "Ігнорувати"
blockingList: "Заблокувати"
userLists: "Списки"
_timelines:
home: "Домівка"
_rooms:
_roomType:
default: "За умовчанням"
@@ -322,5 +477,6 @@ _deck:
_columns:
notifications: "Сповіщення"
tl: "Стрічка"
antenna: "Антени"
list: "Списки"
mentions: "Згадки"

View File

@@ -84,7 +84,7 @@ followRequest: "关注申请"
followRequests: "关注申请"
unfollow: "取消关注"
followRequestPending: "发送关注申请"
enterEmoji: "输入Emoji"
enterEmoji: "输入表情符号"
renote: "转发"
unrenote: "取消转发"
quote: "引用"
@@ -117,9 +117,9 @@ editWidgets: "编辑小工具"
editWidgetsExit: "完成编辑"
customEmojis: "自定义Emoji"
emoji: "表情符号"
emojiName: "Emoji 名称"
emojiUrl: "emoji 地址"
addEmoji: "添加Emoji"
emojiName: "表情符号名称"
emojiUrl: "表情符号地址"
addEmoji: "添加表情符号"
settingGuide: "推荐配置"
cacheRemoteFiles: "远程文件缓存"
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
@@ -185,7 +185,7 @@ done: "完成"
processing: "处理中"
preview: "预览"
default: "默认"
noCustomEmojis: "自定义Emoji"
noCustomEmojis: "没有自定义表情符号"
noJobs: "没有任务"
federating: "联合中"
blocked: "已拦截"
@@ -430,7 +430,7 @@ or: "或者"
uiLanguage: "显示语言"
groupInvited: "群组招待"
aboutX: "关于 {x}"
useOsNativeEmojis: "使用OS原生Emoji"
useOsNativeEmojis: "使用OS原生表情符号"
youHaveNoGroups: "没有群组"
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
noHistory: "没有历史记录"
@@ -549,7 +549,7 @@ tokenRequested: "允许访问账户"
pluginTokenRequestedDescription: "此插件将能够拥有此处设置的权限"
notificationType: "通知类型"
edit: "编辑"
useStarForReactionFallback: "如果回应的颜文字未知,则使用★作为代替"
useStarForReactionFallback: "如果回应的是未知表情符号,则使用★作为代替"
emailConfig: "邮件服务器设置"
enableEmail: "启用发送邮件功能"
emailConfigInfo: "用于确认电子邮件和密码重置"
@@ -604,13 +604,53 @@ system: "系统"
switchUi: "切换界面"
desktop: "桌面"
_mfm:
cheatSheet: "MFM代码速查表"
intro: "MFM是一种在Misskey中的各个位置使用的专用标记语言。在这里您可以看到MFM中可用的语法列表。"
dummy: "通过Misskey扩展Fediverse的世界"
mention: "提及"
mentionDescription: "可以使用 @+用户名 来指示特定用户"
hashtag: "话题标签"
hashtagDescription: "可以使用井号+文字来表示话题标签。"
url: "URL"
urlDescription: "可以表示URL地址。"
link: "链接"
linkDescription: "可以将部分文字和URL关联起来。"
bold: "粗体"
boldDescription: "可以将文字显示为粗体来表示强调。"
small: "缩小"
smallDescription: "可以使内容文字变小、变淡。"
center: "居中"
centerDescription: "可以将内容居中显示。"
inlineCode: "代码(内嵌)"
inlineCodeDescription: "将文字中的程序代码语法高亮显示。"
blockCode: "代码(块)"
blockCodeDescription: "语法高亮显示整块程序代码。"
inlineMath: "数学公式(内嵌)"
inlineMathDescription: "显示内嵌的KaTex公式。"
blockMath: "数学公式(块)"
blockMathDescription: "显示整块的多行KaTex数学公式。"
quote: "引用"
emoji: "自定义Emoji"
quoteDescription: "可以用来表示引用的内容。"
emoji: "自定义表情符号"
emojiDescription: "可以将自定义表情符号使用冒号括起来,就可以显示自定义表情符号了。"
search: "搜索"
searchDescription: "显示含有搜索内容示例的搜索框。"
flip: "翻转"
flipDescription: "将内容上下或左右翻转。"
jelly: "动画(果冻)"
jellyDescription: "显示果冻一样的动画效果。"
tada: "动画(锵锵)"
tadaDescription: "显示\"锵锵!\"的动画效果。"
jump: "动画(跳动)"
jumpDescription: "显示跳动的动画效果。"
bounce: "动画(弹性)"
bounceDescription: "显示弹性一样的动画效果。"
shake: "动画(摇晃)"
shakeDescription: "显示摇晃的动画效果。"
twitch: "动画(颤抖)"
twitchDescription: "显示强烈颤抖的动画效果。"
spin: "动画(回转)"
spinDescription: "显示回转的动画效果。"
_reversi:
reversi: "黑白棋"
gameSettings: "对局设置"

View File

@@ -1,7 +1,7 @@
{
"name": "misskey",
"author": "syuilo <syuilotan@yahoo.co.jp>",
"version": "12.55.0",
"version": "12.56.0",
"codename": "indigo",
"repository": {
"type": "git",
@@ -246,10 +246,10 @@
"vue-json-pretty": "1.7.1",
"vue-loader": "16.0.0-beta.8",
"vue-prism-editor": "1.2.2",
"vue-router": "4.0.0-beta.13",
"vue-router": "4.0.0-rc.2",
"vue-style-loader": "4.1.2",
"vue-template-compiler": "2.6.12",
"vuex": "4.0.0-beta.4",
"vuex": "4.0.0-rc.1",
"vuex-persistedstate": "3.1.0",
"web-push": "3.4.4",
"webpack": "5.4.0",

View File

@@ -1,7 +1,7 @@
<template>
<MkModal ref="modal" :src="src" @click="$refs.modal.close()" @closed="$emit('closed')">
<div class="omfetrab _popup">
<input ref="search" class="search" v-model.trim="q" :placeholder="$t('search')" @paste.stop="paste" @keyup.enter="done()" autofocus>
<div class="omfetrab _popup" :class="{ compact }">
<input ref="search" class="search" :class="{ filled: q != null && q != '' }" v-model.trim="q" :placeholder="$t('search')" @paste.stop="paste" @keyup.enter="done()">
<div class="emojis">
<section class="result">
<div v-if="searchResultCustom.length > 0">
@@ -30,7 +30,7 @@
</section>
<div class="index">
<section>
<section v-if="showPinned">
<div>
<button v-for="emoji in pinned"
class="_button"
@@ -43,7 +43,7 @@
</section>
<section>
<header class="_acrylic"><Fa :icon="faHistory" fixed-width/> {{ $t('recentUsed') }}</header>
<header class="_acrylic"><Fa :icon="faClock" fixed-width/> {{ $t('recentUsed') }}</header>
<div>
<button v-for="emoji in $store.state.device.recentlyUsedEmojis"
class="_button"
@@ -94,7 +94,7 @@
import { defineComponent, markRaw } from 'vue';
import { emojilist } from '../../misc/emojilist';
import { getStaticImageUrl } from '@/scripts/get-static-image-url';
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice, faGlobe, faHistory, faUser, faChevronDown } from '@fortawesome/free-solid-svg-icons';
import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice, faGlobe, faClock, faUser, faChevronDown } from '@fortawesome/free-solid-svg-icons';
import { faHeart, faFlag, faLaugh } from '@fortawesome/free-regular-svg-icons';
import MkModal from '@/components/ui/modal.vue';
import Particle from '@/components/particle.vue';
@@ -109,7 +109,11 @@ export default defineComponent({
src: {
required: false
},
overridePinned: {
showPinned: {
required: false,
default: true
},
compact: {
required: false
},
},
@@ -120,14 +124,14 @@ export default defineComponent({
return {
emojilist: markRaw(emojilist),
getStaticImageUrl,
pinned: this.overridePinned || this.$store.state.settings.reactions,
pinned: this.$store.state.settings.reactions,
customEmojiCategories: this.$store.getters['instance/emojiCategories'],
customEmojis: this.$store.state.instance.meta.emojis,
visibleCategories: {},
q: null,
searchResultCustom: [],
searchResultUnicode: [],
faGlobe, faHistory, faChevronDown,
faGlobe, faClock, faChevronDown,
categories: [{
name: 'face',
icon: faLaugh,
@@ -311,9 +315,12 @@ export default defineComponent({
},
mounted() {
this.$refs.search.focus({
preventScroll: true
});
const isIos = navigator.userAgent.includes('WebKit') && !navigator.userAgent.includes('Chrome');
if (!isIos) {
this.$refs.search.focus({
preventScroll: true
});
}
},
methods: {
@@ -379,8 +386,19 @@ export default defineComponent({
<style lang="scss" scoped>
.omfetrab {
width: 350px;
$eachSize: 40px;
$pad: 8px;
display: flex;
flex-direction: column;
width: ($eachSize * 7) + ($pad * 2);
contain: content;
--height: 300px;
&.compact {
width: ($eachSize * 5) + ($pad * 2);
--height: 210px;
}
> .search {
width: 100%;
@@ -391,17 +409,27 @@ export default defineComponent({
border: none;
background: transparent;
color: var(--fg);
&:not(.filled) {
order: 1;
z-index: 2;
box-shadow: 0px -1px 0 0px var(--divider);
}
}
> .emojis {
$height: 300px;
height: $height;
height: var(--height);
overflow-y: auto;
overflow-x: hidden;
scrollbar-width: none;
&::-webkit-scrollbar {
display: none;
}
> .index {
min-height: $height;
min-height: var(--height);
position: relative;
border-bottom: solid 1px var(--divider);
@@ -428,45 +456,33 @@ export default defineComponent({
}
> div {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
gap: 4px;
padding: 8px;
padding: $pad;
> button {
position: relative;
padding: 0;
width: 100%;
width: $eachSize;
height: $eachSize;
border-radius: 4px;
&:focus {
outline: solid 2px var(--focus);
z-index: 1;
}
&:before {
content: '';
display: block;
width: 1px;
height: 0;
padding-bottom: 100%;
&:hover {
background: rgba(0, 0, 0, 0.05);
}
&:hover {
> * {
transform: scale(1.2);
transition: transform 0s;
}
&:active {
background: var(--accent);
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
}
> * {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: contain;
font-size: 28px;
transition: transform 0.2s ease;
font-size: 24px;
height: 1.25em;
vertical-align: -.25em;
pointer-events: none;
}
}
@@ -474,6 +490,10 @@ export default defineComponent({
&.result {
border-bottom: solid 1px var(--divider);
&:empty {
display: none;
}
}
&.unicode {

View File

@@ -130,9 +130,13 @@ export default defineComponent({
break;
}
}
return h('span', {
style: 'display: inline-block;' + style,
}, genEl(token.children));
if (style == null) {
return h('span', {}, ['[', token.node.props.name, ...genEl(token.children), ']']);
} else {
return h('span', {
style: 'display: inline-block;' + style,
}, genEl(token.children));
}
}
case 'small': {

View File

@@ -498,36 +498,20 @@ export default defineComponent({
react(viaKeyboard = false) {
pleaseLogin();
this.blur();
if (this.$store.state.device.useFullReactionPicker) {
os.popup(import('@/components/emoji-picker.vue'), {
src: this.$refs.reactButton,
}, {
done: reaction => {
if (reaction) {
os.api('notes/reactions/create', {
noteId: this.appearNote.id,
reaction: reaction
});
}
this.focus();
},
}, 'closed');
} else {
os.popup(import('@/components/reaction-picker.vue'), {
showFocus: viaKeyboard,
src: this.$refs.reactButton,
}, {
done: reaction => {
if (reaction) {
os.api('notes/reactions/create', {
noteId: this.appearNote.id,
reaction: reaction
});
}
this.focus();
},
}, 'closed');
}
os.popup(import('@/components/emoji-picker.vue'), {
src: this.$refs.reactButton,
compact: !this.$store.state.device.useFullReactionPicker
}, {
done: reaction => {
if (reaction) {
os.api('notes/reactions/create', {
noteId: this.appearNote.id,
reaction: reaction
});
}
this.focus();
},
}, 'closed');
},
reactDirectly(reaction) {

View File

@@ -1,214 +0,0 @@
<template>
<MkModal ref="modal" :src="src" @click="$refs.modal.close()" @closed="$emit('closed')">
<div class="rdfaahpb _popup" v-hotkey="keymap">
<div class="buttons" ref="buttons" :class="{ showFocus }">
<button class="_button" v-for="(reaction, i) in rs" :key="reaction" @click="react(reaction)" :tabindex="i + 1" :title="reaction" v-particle><XReactionIcon :reaction="reaction"/></button>
</div>
<input class="text" ref="text" v-model.trim="text" :placeholder="$t('enterEmoji')" @keyup.enter="reactText" @input="tryReactText">
</div>
</MkModal>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { emojiRegex } from '../../misc/emoji-regex';
import XReactionIcon from '@/components/reaction-icon.vue';
import MkModal from '@/components/ui/modal.vue';
import { Autocomplete } from '@/scripts/autocomplete';
export default defineComponent({
components: {
XReactionIcon,
MkModal,
},
props: {
reactions: {
required: false
},
showFocus: {
type: Boolean,
required: false,
default: false
},
src: {
required: false
},
},
emits: ['done', 'closed'],
data() {
return {
rs: this.reactions || this.$store.state.settings.reactions,
text: null,
focus: null
};
},
computed: {
keymap(): any {
return {
'esc': this.close,
'enter|space|plus': this.choose,
'up|k': this.focusUp,
'left|h|shift+tab': this.focusLeft,
'right|l|tab': this.focusRight,
'down|j': this.focusDown,
'1': () => this.react(this.rs[0]),
'2': () => this.react(this.rs[1]),
'3': () => this.react(this.rs[2]),
'4': () => this.react(this.rs[3]),
'5': () => this.react(this.rs[4]),
'6': () => this.react(this.rs[5]),
'7': () => this.react(this.rs[6]),
'8': () => this.react(this.rs[7]),
'9': () => this.react(this.rs[8]),
'0': () => this.react(this.rs[9]),
};
},
},
watch: {
focus(i) {
this.$refs.buttons.children[i].focus({
preventScroll: true
});
}
},
mounted() {
this.$nextTick(() => {
this.focus = 0;
});
// TODO: detach when unmount
new Autocomplete(this.$refs.text, this, { model: 'text' });
},
methods: {
close() {
this.$emit('done');
this.$refs.modal.close();
},
react(reaction) {
this.$emit('done', reaction);
this.$refs.modal.close();
},
reactText() {
if (!this.text) return;
this.react(this.text);
},
tryReactText() {
if (!this.text) return;
if (!this.text.match(emojiRegex)) return;
this.reactText();
},
focusUp() {
this.focus = this.focus == 0 ? 9 : this.focus < 5 ? (this.focus + 4) : (this.focus - 5);
},
focusDown() {
this.focus = this.focus == 9 ? 0 : this.focus >= 5 ? (this.focus - 4) : (this.focus + 5);
},
focusRight() {
this.focus = this.focus == 9 ? 0 : (this.focus + 1);
},
focusLeft() {
this.focus = this.focus == 0 ? 9 : (this.focus - 1);
},
choose() {
this.$refs.buttons.children[this.focus].click();
},
}
});
</script>
<style lang="scss" scoped>
.rdfaahpb {
> .buttons {
padding: 6px 6px 0 6px;
width: 212px;
box-sizing: border-box;
text-align: center;
@media (max-width: 1025px) {
padding: 8px 8px 0 8px;
width: 256px;
}
&.showFocus {
> button:focus {
position: relative;
z-index: 1;
&:after {
content: "";
pointer-events: none;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
border: 2px solid var(--focus);
border-radius: 4px;
}
}
}
> button {
padding: 0;
width: 40px;
height: 40px;
font-size: 24px;
border-radius: 2px;
@media (max-width: 1025px) {
width: 48px;
height: 48px;
font-size: 26px;
}
> * {
height: 1em;
}
&:hover {
background: rgba(0, 0, 0, 0.05);
}
&:active {
background: var(--accent);
box-shadow: inset 0 0.15em 0.3em rgba(27, 31, 35, 0.15);
}
}
}
> .text {
width: 208px;
padding: 8px;
margin: 0 0 6px 0;
box-sizing: border-box;
text-align: center;
font-size: 16px;
outline: none;
border: none;
background: transparent;
color: var(--fg);
@media (max-width: 1025px) {
width: 256px;
margin: 4px 0 8px 0;
}
}
}
</style>

View File

@@ -18,7 +18,6 @@
<script lang="ts">
import { defineComponent } from 'vue';
import * as os from '@/os';
export default defineComponent({
props: {
@@ -51,7 +50,7 @@ export default defineComponent({
.novjtctn {
position: relative;
display: inline-block;
margin: 16px 32px 0 0;
margin: 8px 20px 0 0;
text-align: left;
cursor: pointer;
transition: all 0.3s;

View File

@@ -0,0 +1,58 @@
<script lang="ts">
import { defineComponent, h } from 'vue';
import MkRadio from '@/components/ui/radio.vue';
export default defineComponent({
components: {
MkRadio
},
props: {
defs: {
required: true
},
modelValue: {
required: false
},
},
data() {
return {
value: this.modelValue,
}
},
watch: {
value() {
this.$emit('update:modelValue', this.value);
}
},
render() {
const label = this.$slots.desc();
const options = this.$slots.default();
return h('div', {
class: 'novjtcto'
}, [
h('div', label),
...options.map(option => h(MkRadio, {
key: option.props.value,
value: option.props.value,
modelValue: this.value,
'onUpdate:modelValue': value => this.value = value,
}, option.children))
]);
}
});
</script>
<style lang="scss" scoped>
.novjtcto {
margin: 32px 0;
&:first-child {
margin-top: 0;
}
&:last-child {
margin-bottom: 0;
}
}
</style>

View File

@@ -275,10 +275,11 @@ export async function selectDriveFolder(multiple: boolean) {
});
}
export async function pickEmoji(src?: HTMLElement) {
export async function pickEmoji(src?: HTMLElement, opts) {
return new Promise((resolve, reject) => {
popup(import('@/components/emoji-picker.vue'), {
src
src,
...opts
}, {
done: emoji => {
resolve(emoji);

View File

@@ -1,38 +1,40 @@
<template>
<div class="_section">
<div class="">
<section class="_card _vMargin">
<div class="_title"><Fa :icon="faCog"/> {{ $t('general') }}</div>
<div class="_content">
<div>{{ $t('defaultNavigationBehaviour') }}</div>
<MkSwitch v-model:value="defaultSideView">{{ $t('openInSideView') }}</MkSwitch>
</div>
<div class="_content">
<div>{{ $t('whenServerDisconnected') }}</div>
<MkRadio v-model="serverDisconnectedBehavior" value="reload">{{ $t('_serverDisconnectedBehavior.reload') }}</MkRadio>
<MkRadio v-model="serverDisconnectedBehavior" value="dialog">{{ $t('_serverDisconnectedBehavior.dialog') }}</MkRadio>
<MkRadio v-model="serverDisconnectedBehavior" value="quiet">{{ $t('_serverDisconnectedBehavior.quiet') }}</MkRadio>
</div>
<div class="_content">
<MkRadios v-model="serverDisconnectedBehavior">
<template #desc>{{ $t('whenServerDisconnected') }}</template>
<option value="reload">{{ $t('_serverDisconnectedBehavior.reload') }}</option>
<option value="dialog">{{ $t('_serverDisconnectedBehavior.dialog') }}</option>
<option value="quiet">{{ $t('_serverDisconnectedBehavior.quiet') }}</option>
</MkRadios>
<MkSwitch v-model:value="imageNewTab">{{ $t('openImageInNewTab') }}</MkSwitch>
<MkSwitch v-model:value="showFixedPostForm">{{ $t('showFixedPostForm') }}</MkSwitch>
<MkSwitch v-model:value="enableInfiniteScroll">{{ $t('enableInfiniteScroll') }}</MkSwitch>
<MkSwitch v-model:value="disablePagesScript">{{ $t('disablePagesScript') }}</MkSwitch>
</div>
<div class="_content">
<div>{{ $t('chatOpenBehavior') }}</div>
<MkRadio v-model="chatOpenBehavior" value="page">{{ $t('showInPage') }}</MkRadio>
<MkRadio v-model="chatOpenBehavior" value="window">{{ $t('openInWindow') }}</MkRadio>
<MkRadio v-model="chatOpenBehavior" value="popout">{{ $t('popout') }}</MkRadio>
</div>
<div class="_content">
<MkSelect v-model:value="lang">
<template #label>{{ $t('uiLanguage') }}</template>
<option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option>
</MkSelect>
</div>
</section>
<section class="_card _vMargin">
<div class="_title"><Fa :icon="faCog"/> {{ $t('defaultNavigationBehaviour') }}</div>
<div class="_content">
<MkSwitch v-model:value="defaultSideView">{{ $t('openInSideView') }}</MkSwitch>
</div>
<div class="_content">
<MkRadios v-model="chatOpenBehavior">
<template #desc>{{ $t('chatOpenBehavior') }}</template>
<option value="page">{{ $t('showInPage') }}</option>
<option value="window">{{ $t('openInWindow') }}</option>
<option value="popout">{{ $t('popout') }}</option>
</MkRadios>
</div>
</section>
<section class="_card _vMargin">
<div class="_title"><Fa :icon="faCog"/> {{ $t('appearance') }}</div>
<div class="_content">
@@ -43,19 +45,19 @@
{{ $t('useOsNativeEmojis') }}
<template #desc><Mfm text="🍮🍦🍭🍩🍰🍫🍬🥞🍪"/></template>
</MkSwitch>
</div>
<div class="_content">
<div>{{ $t('fontSize') }}</div>
<MkRadio v-model="fontSize" value="small"><span style="font-size: 14px;">Aa</span></MkRadio>
<MkRadio v-model="fontSize" :value="null"><span style="font-size: 16px;">Aa</span></MkRadio>
<MkRadio v-model="fontSize" value="large"><span style="font-size: 18px;">Aa</span></MkRadio>
<MkRadio v-model="fontSize" value="veryLarge"><span style="font-size: 20px;">Aa</span></MkRadio>
</div>
<div class="_content">
<div>{{ $t('instanceTicker') }}</div>
<MkRadio v-model="instanceTicker" value="none">{{ $t('_instanceTicker.none') }}</MkRadio>
<MkRadio v-model="instanceTicker" value="remote">{{ $t('_instanceTicker.remote') }}</MkRadio>
<MkRadio v-model="instanceTicker" value="always">{{ $t('_instanceTicker.always') }}</MkRadio>
<MkRadios v-model="fontSize">
<template #desc>{{ $t('fontSize') }}</template>
<option value="small"><span style="font-size: 14px;">Aa</span></option>
<option :value="null"><span style="font-size: 16px;">Aa</span></option>
<option value="large"><span style="font-size: 18px;">Aa</span></option>
<option value="veryLarge"><span style="font-size: 20px;">Aa</span></option>
</MkRadios>
<MkRadios v-model="instanceTicker">
<template #desc>{{ $t('instanceTicker') }}</template>
<option value="none">{{ $t('_instanceTicker.none') }}</option>
<option value="remote">{{ $t('_instanceTicker.remote') }}</option>
<option value="always">{{ $t('_instanceTicker.always') }}</option>
</MkRadios>
</div>
</section>
@@ -88,6 +90,7 @@ import MkButton from '@/components/ui/button.vue';
import MkSwitch from '@/components/ui/switch.vue';
import MkSelect from '@/components/ui/select.vue';
import MkRadio from '@/components/ui/radio.vue';
import MkRadios from '@/components/ui/radios.vue';
import MkRange from '@/components/ui/range.vue';
import { langs } from '@/config';
import { clientDb, set } from '@/db';
@@ -99,6 +102,7 @@ export default defineComponent({
MkSwitch,
MkSelect,
MkRadio,
MkRadios,
MkRange,
},

View File

@@ -31,9 +31,7 @@
</div>
</div>
<div class="main">
<transition :name="($store.state.device.animation && !narrow) ? 'view-slide' : ''" appear mode="out-in">
<component :is="component" @info="onInfo"/>
</transition>
<component :is="component" @info="onInfo"/>
</div>
</div>
</template>
@@ -109,14 +107,6 @@ export default defineComponent({
</script>
<style lang="scss" scoped>
.view-slide-enter-active, .view-slide-leave-active {
transition: opacity 0.3s, transform 0.3s !important;
}
.view-slide-enter-from, .view-slide-leave-to {
opacity: 0;
transform: translateX(32px);
}
.vvcocwet {
> .nav {
> .menu {
@@ -133,7 +123,7 @@ export default defineComponent({
width: 100%;
box-sizing: border-box;
padding: 0 32px;
line-height: 48px;
line-height: 40px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
@@ -168,10 +158,22 @@ export default defineComponent({
> .nav {
width: 30%;
max-width: 300px;
font-size: 0.95em;
border-right: solid 1px var(--divider);
}
> .main {
flex: 1;
padding: 32px;
--baseContentWidth: 100%;
::v-deep(._section) {
padding: 0 0 32px 0;
& + ._section {
padding-top: 32px;
}
}
}
}
}

View File

@@ -3,15 +3,20 @@
<div class="_card">
<div class="_title"><Fa :icon="faLaugh"/> {{ $t('reaction') }}</div>
<div class="_content">
<MkInput v-model:value="reactions" style="font-family: 'Segoe UI Emoji', 'Noto Color Emoji', Roboto, HelveticaNeue, Arial, sans-serif">
{{ $t('reaction') }}<template #desc>{{ $t('reactionSettingDescription') }} <button class="_textButton" @click="chooseEmoji">{{ $t('chooseEmoji') }}</button></template>
</MkInput>
<MkButton inline @click="setDefault"><Fa :icon="faUndo"/> {{ $t('default') }}</MkButton>
<XDraggable class="zoaiodol" :list="reactions" animation="150" delay="100" delay-on-touch-only="true">
<button class="_button item" v-for="reaction in reactions" :key="reaction" @click="remove(reaction, $event)">
<MkEmoji :emoji="reaction" :normal="true"/>
</button>
<template #footer>
<button>a</button>
</template>
</XDraggable>
<div class="_caption" style="padding: 8px;">{{ $t('reactionSettingDescription') }} <button class="_textButton" @click="chooseEmoji">{{ $t('chooseEmoji') }}</button></div>
<MkSwitch v-model:value="useFullReactionPicker">{{ $t('useFullReactionPicker') }}</MkSwitch>
</div>
<div class="_footer">
<MkButton @click="save()" primary inline :disabled="!changed"><Fa :icon="faSave"/> {{ $t('save') }}</MkButton>
<MkButton inline @click="preview"><Fa :icon="faEye"/> {{ $t('preview') }}</MkButton>
<MkButton inline @click="setDefault"><Fa :icon="faUndo"/> {{ $t('default') }}</MkButton>
</div>
</div>
</div>
@@ -21,6 +26,7 @@
import { defineComponent } from 'vue';
import { faLaugh, faSave, faEye } from '@fortawesome/free-regular-svg-icons';
import { faUndo } from '@fortawesome/free-solid-svg-icons';
import { VueDraggableNext } from 'vue-draggable-next';
import MkInput from '@/components/ui/input.vue';
import MkButton from '@/components/ui/button.vue';
import MkSwitch from '@/components/ui/switch.vue';
@@ -33,6 +39,7 @@ export default defineComponent({
MkInput,
MkButton,
MkSwitch,
XDraggable: VueDraggableNext,
},
emits: ['info'],
@@ -43,17 +50,12 @@ export default defineComponent({
title: this.$t('reaction'),
icon: faLaugh
},
reactions: this.$store.state.settings.reactions.join(''),
changed: false,
reactions: JSON.parse(JSON.stringify(this.$store.state.settings.reactions)),
faLaugh, faSave, faEye, faUndo
}
},
computed: {
splited(): any {
return this.reactions.match(emojiRegexWithCustom);
},
useFullReactionPicker: {
get() { return this.$store.state.device.useFullReactionPicker; },
set(value) { this.$store.commit('device/set', { key: 'useFullReactionPicker', value: value }); }
@@ -63,7 +65,7 @@ export default defineComponent({
watch: {
reactions: {
handler() {
this.changed = true;
this.save();
},
deep: true
}
@@ -75,34 +77,59 @@ export default defineComponent({
methods: {
save() {
this.$store.dispatch('settings/set', { key: 'reactions', value: this.splited });
this.changed = false;
this.$store.dispatch('settings/set', { key: 'reactions', value: this.reactions });
},
remove(reaction, ev) {
os.modalMenu([{
text: this.$t('remove'),
action: () => {
this.reactions = this.reactions.filter(x => x !== reaction)
}
}], ev.currentTarget || ev.target);
},
preview(ev) {
if (this.$store.state.device.useFullReactionPicker) {
os.popup(import('@/components/emoji-picker.vue'), {
overridePinned: this.splited,
src: ev.currentTarget || ev.target,
}, {}, 'closed');
} else {
os.popup(import('@/components/reaction-picker.vue'), {
reactions: this.splited,
showFocus: false,
src: ev.currentTarget || ev.target,
}, {}, 'closed');
}
os.popup(import('@/components/emoji-picker.vue'), {
compact: !this.$store.state.device.useFullReactionPicker,
src: ev.currentTarget || ev.target,
}, {}, 'closed');
},
setDefault() {
this.reactions = defaultSettings.reactions.join('');
async setDefault() {
const { canceled } = await os.dialog({
type: 'warning',
text: this.$t('resetAreYouSure'),
showCancelButton: true
});
if (canceled) return;
this.reactions = JSON.parse(JSON.stringify(defaultSettings.reactions));
},
chooseEmoji(ev) {
os.pickEmoji(ev.currentTarget || ev.target).then(emoji => {
this.reactions += emoji;
os.pickEmoji(ev.currentTarget || ev.target, {
showPinned: false
}).then(emoji => {
if (!this.reactions.includes(emoji)) {
this.reactions.push(emoji);
}
});
}
}
});
</script>
<style lang="scss" scoped>
.zoaiodol {
border: solid 1px var(--divider);
border-radius: var(--radius);
padding: 16px;
> .item {
display: inline-block;
padding: 8px;
cursor: move;
}
}
</style>

View File

@@ -1,5 +1,5 @@
<template>
<div class="_section">
<div class="">
<div class="rfqxtzch _card _vMargin">
<div class="_content">
<div class="darkMode" :class="{ disabled: syncDeviceDarkMode }">
@@ -22,8 +22,12 @@
</label>
</div>
</div>
</div>
<div class="_content">
<MkSwitch v-model:value="syncDeviceDarkMode">{{ $t('syncDeviceDarkMode') }}</MkSwitch>
</div>
</div>
<div class="_card _vMargin">
<div class="_content">
<MkSelect v-model:value="lightTheme">
<template #label>{{ $t('themeForLightMode') }}</template>

View File

@@ -73,6 +73,7 @@ export const router = createRouter({
{ path: '/games/reversi', component: page('reversi/index') },
{ path: '/games/reversi/:gameId', component: page('reversi/game'), props: route => ({ gameId: route.params.gameId }) },
{ path: '/mfm-cheat-sheet', component: page('mfm-cheat-sheet') },
{ path: '/api-console', component: page('api-console') },
{ path: '/test', component: page('test') },
{ path: '/auth/:token', component: page('auth') },
{ path: '/miauth/:session', component: page('miauth') },

View File

@@ -253,7 +253,7 @@ export const store = createStore({
init(state, x) {
for (const [key, value] of Object.entries(defaultDeviceUserSettings)) {
if (x[key]) {
if (Object.prototype.hasOwnProperty.call(x, key)) {
state[key] = x[key];
} else {
state[key] = value;
@@ -471,7 +471,7 @@ export const store = createStore({
init(state, x) {
for (const [key, value] of Object.entries(defaultSettings)) {
if (x[key]) {
if (Object.prototype.hasOwnProperty.call(x, key)) {
state[key] = x[key];
} else {
state[key] = value;

View File

@@ -244,7 +244,7 @@ hr {
> ._title {
margin: 0;
padding: 22px 32px;
font-size: 1.1em;
font-size: 1em;
border-bottom: solid 1px var(--panelHeaderDivider);
font-weight: bold;
background: var(--panelHeaderBg);

View File

@@ -6,7 +6,7 @@ Misskey Webクライアントのプラグイン機能を使うと、クライア
プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。
メタデータは次のプロパティを含むオブジェクトです。
### mame
### name
プラグイン名
### author

View File

@@ -52,7 +52,7 @@ export function toHtml(tokens: MfmForest | null, mentionedRemoteUsers: IMentione
blockCode(token) {
const pre = doc.createElement('pre');
const inner = doc.createElement('code');
inner.innerHTML = token.node.props.code;
inner.textContent = token.node.props.code;
pre.appendChild(inner);
return pre;
},

View File

@@ -10416,10 +10416,10 @@ vue-prism-editor@1.2.2:
resolved "https://registry.yarnpkg.com/vue-prism-editor/-/vue-prism-editor-1.2.2.tgz#023cfd4329848f191aac851f2f5e6c7a8c2e059f"
integrity sha512-Lq2VgVygTx3Whn/tC8gD4m1ajA4lzSyCTqPLZA1Dq/ErbBaZA93FWRblwCoDR7AD2nXhGWuiTzb5ih3guzB7DA==
vue-router@4.0.0-beta.13:
version "4.0.0-beta.13"
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.0.0-beta.13.tgz#4611d09a9e44f231cc401ecc294a7f2dcb30e6a6"
integrity sha512-dYv9qpHPaojQlfujViiTkPkf1Bf5RCFzkCkdVFc1cENzWJYAGJanpIHiyjyKoM4u7IDFBZMItci+U4ieaEWA8A==
vue-router@4.0.0-rc.2:
version "4.0.0-rc.2"
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.0.0-rc.2.tgz#8545cab76a05ca4f6dffbe6c6a671a4dbf585ab2"
integrity sha512-51mBp39rzBFpk1nyU9SkhPcwR67gBzWIH8p3pyeDmtNYgWzGF3q8MneD/xbMwsfTQkw2H1qBk6uwRaVy3M8Nxw==
vue-style-loader@4.1.2:
version "4.1.2"
@@ -10454,10 +10454,10 @@ vuex-persistedstate@3.1.0:
deepmerge "^4.2.2"
shvl "^2.0.0"
vuex@4.0.0-beta.4:
version "4.0.0-beta.4"
resolved "https://registry.yarnpkg.com/vuex/-/vuex-4.0.0-beta.4.tgz#7b319ead2ef30432b7eaa4e37258ea3c5e44f698"
integrity sha512-/+4E1dokq5cwbl4mohOqOj8h0vOLOWmLSqlqTf++bfmN9/JKWtwYfsBrzlK0sYrNfuYcpQeX0BVxQHoHXDfYZQ==
vuex@4.0.0-rc.1:
version "4.0.0-rc.1"
resolved "https://registry.yarnpkg.com/vuex/-/vuex-4.0.0-rc.1.tgz#160cd5957972a61c7c01ab585995b78e092a298d"
integrity sha512-zgXVCQygF1Sm7ezyudEEMynoV2PBxZdcjE12D0BY1xIKZMrA7GFP6xqADTEAzwfVemXboExJ+/KThfxJFtM/5w==
w3c-hr-time@^1.0.2:
version "1.0.2"