Merge branch 'develop' into feat/scylladb

This commit is contained in:
Namekuji 2023-09-21 17:32:52 -04:00
commit 0a25419d47
No known key found for this signature in database
GPG key ID: 1D62332C07FBA532
33 changed files with 254 additions and 352 deletions

View file

@ -1179,7 +1179,7 @@ emptyToDisableSmtpAuth: Deixa el nom d'usuari i la contrasenya sense emplenar pe
desactivar la verificació SMTP desactivar la verificació SMTP
smtpSecureInfo: Desactiva això quant facis servir STARTTLS smtpSecureInfo: Desactiva això quant facis servir STARTTLS
testEmail: Envia un correu electrònic de verificació testEmail: Envia un correu electrònic de verificació
wordMute: Silenciar paraules wordMute: Paraules i llenguatge silenciats
regexpError: Error a la Expressió Regular regexpError: Error a la Expressió Regular
regexpErrorDescription: 'Hi ha un error a la expressió regular a la línea {line} de regexpErrorDescription: 'Hi ha un error a la expressió regular a la línea {line} de
la teva {tab} de paraules silenciades:' la teva {tab} de paraules silenciades:'
@ -2040,6 +2040,13 @@ _wordMute:
s'afegeixin a la línia de temps. A més, aquestes publicacions no s'afegiran a s'afegeixin a la línia de temps. A més, aquestes publicacions no s'afegiran a
la línia de temps encara que es modifiquin les condicions. la línia de temps encara que es modifiquin les condicions.
mutedNotes: Publicacions silenciades mutedNotes: Publicacions silenciades
muteLangsDescription2: Fes servir el codi del l'idioma. Per exemple en, fr, ja,
zh.
lang: Idioma
langDescription: Amagar les publicacions que coincideixin amb l'idioma a la línia
de temps.
muteLangs: Llenguatges silenciats
muteLangsDescription: Separar amb espais o línies no es per una condició OR.
_auth: _auth:
shareAccessAsk: Estàs segur que vols autoritzar aquesta aplicació per accedir al shareAccessAsk: Estàs segur que vols autoritzar aquesta aplicació per accedir al
teu compte? teu compte?
@ -2190,3 +2197,6 @@ detectPostLanguage: Detecta l'idioma automàticament i mostra un botó per els a
indexableDescription: Permet al cercador intern mostrar els missatges públics indexableDescription: Permet al cercador intern mostrar els missatges públics
indexable: Indexable indexable: Indexable
languageForTranslation: Idioma de traducció d'articles languageForTranslation: Idioma de traducció d'articles
openServerInfo: Mostra la informació del servidor fent clic al símbol del servidor
en un missatge
vibrate: Activar vibracions

View file

@ -2213,3 +2213,5 @@ indexableDescription: Der integrierten Suche erlauben, Ihre öffentlichen Beitr
anzuzeigen anzuzeigen
indexable: Indexierbar indexable: Indexierbar
languageForTranslation: Übersetzungssprache veröffentlichen languageForTranslation: Übersetzungssprache veröffentlichen
openServerInfo: Anzeigen von Serverinformationen durch Anklicken des Server-Tickers
in einem Beitrag

View file

@ -724,8 +724,8 @@ no: "Non"
driveFilesCount: "Nombre de fichiers dans le Drive" driveFilesCount: "Nombre de fichiers dans le Drive"
driveUsage: "Utilisation du Drive" driveUsage: "Utilisation du Drive"
noCrawle: "Refuser l'indexation par les robots" noCrawle: "Refuser l'indexation par les robots"
noCrawleDescription: "Demandez aux moteurs de recherche de ne pas indexer votre page noCrawleDescription: "Demandez aux moteurs de recherche externes de ne pas indexer
de profil, vos publications, vos pages, etc." votre contenu."
lockedAccountInfo: "À moins que vous ne définissiez la visibilité de votre publication lockedAccountInfo: "À moins que vous ne définissiez la visibilité de votre publication
sur \"Abonné-e-s\", vos publications sont visibles par tous, même si vous exigez sur \"Abonné-e-s\", vos publications sont visibles par tous, même si vous exigez
que les demandes d'abonnement soient approuvées manuellement." que les demandes d'abonnement soient approuvées manuellement."
@ -2210,3 +2210,11 @@ confirm: Confirmer
importZip: Importer ZIP importZip: Importer ZIP
exportZip: Exporter ZIP exportZip: Exporter ZIP
emojiPackCreator: Créateur de pack démoji emojiPackCreator: Créateur de pack démoji
detectPostLanguage: Détecte automatiquement le langage et affiche un bouton de traduction
pour les langues étrangères
indexableDescription: Permettre à la recherche interne dafficher vos publications
publiques
openServerInfo: Afficher les informations du serveur en cliquant sur le bandeau de
serveur dune publication
indexable: Indexable
languageForTranslation: Langage post-traduction

View file

@ -637,7 +637,7 @@ emptyToDisableSmtpAuth: "Kosongkan nama pengguna dan kata sandi untuk menonaktif
smtpSecure: "Gunakan SSL/TLS implisit untuk koneksi SMTP" smtpSecure: "Gunakan SSL/TLS implisit untuk koneksi SMTP"
smtpSecureInfo: "Matikan ini ketika menggunakan STARTTLS" smtpSecureInfo: "Matikan ini ketika menggunakan STARTTLS"
testEmail: "Tes pengiriman surel" testEmail: "Tes pengiriman surel"
wordMute: "Bisukan kata" wordMute: "Bisukan kata dan bahasa"
regexpError: "Kesalahan ekspresi reguler" regexpError: "Kesalahan ekspresi reguler"
regexpErrorDescription: "Galat terjadi pada baris {line} ekspresi reguler dari {tab} regexpErrorDescription: "Galat terjadi pada baris {line} ekspresi reguler dari {tab}
kata yang dibisukan:" kata yang dibisukan:"
@ -1135,6 +1135,12 @@ _wordMute:
soft: "Lembut" soft: "Lembut"
hard: "Keras" hard: "Keras"
mutedNotes: "Postingan yang dibisukan" mutedNotes: "Postingan yang dibisukan"
muteLangsDescription2: Gunakan kode bahasa misalnya en, fr, ja, zh.
lang: Bahasa
langDescription: Sembunyikan postingan yang cocok dengan bahasa yang ditetapkan
dari timeline.
muteLangs: Bahasa yang dibisukan
muteLangsDescription: Pisahkan dengan spasi atau jeda baris untuk kondisi ATAU.
_instanceMute: _instanceMute:
instanceMuteDescription: "Pengaturan ini akan membisukan postingan/pembagian apa instanceMuteDescription: "Pengaturan ini akan membisukan postingan/pembagian apa
saja dari server yang terdaftar, termasuk pengguna yang membalas pengguna lain saja dari server yang terdaftar, termasuk pengguna yang membalas pengguna lain
@ -2173,3 +2179,6 @@ detectPostLanguage: Deteksi bahasa secara otomatis dan tampilkan tombol terjemah
indexableDescription: Perbolehkan pencarian di sini untuk menampilkan kiriman publikmu indexableDescription: Perbolehkan pencarian di sini untuk menampilkan kiriman publikmu
indexable: Dapat diindeks indexable: Dapat diindeks
languageForTranslation: Bahasa terjemahan kiriman languageForTranslation: Bahasa terjemahan kiriman
openServerInfo: Tampilkan informasi server dengan mengeklik ticker server di sebuah
kiriman
vibrate: Putar getaran

View file

@ -2162,3 +2162,5 @@ detectPostLanguage: Riconosci la lingua automaticamente e mostra il bottone per
indexableDescription: Mostra i tuoi post pubblici tramite il sistema di ricerca indexableDescription: Mostra i tuoi post pubblici tramite il sistema di ricerca
indexable: Indicizzabile indexable: Indicizzabile
languageForTranslation: Linguaggio di traduzione dei post languageForTranslation: Linguaggio di traduzione dei post
openServerInfo: Mostra informazioni sul server cliccando sul riquadro del server in
un post

View file

@ -66,7 +66,7 @@ import: "インポート"
export: "エクスポート" export: "エクスポート"
files: "ファイル" files: "ファイル"
download: "ダウンロード" download: "ダウンロード"
driveFileDeleteConfirm: "ファイル「{name}」を削除しますか?これにより、このファイルが添付されている投稿も削除されます。" driveFileDeleteConfirm: "ファイル「{name}」を削除しますか?これにより、添付ファイルとして含まれているすべての投稿から削除されます。"
unfollowConfirm: "{name}さんのフォローを解除しますか?" unfollowConfirm: "{name}さんのフォローを解除しますか?"
exportRequested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、「ドライブ」に追加されます。" exportRequested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、「ドライブ」に追加されます。"
importRequested: "インポートをリクエストしました。これには時間がかかる場合があります。" importRequested: "インポートをリクエストしました。これには時間がかかる場合があります。"

View file

@ -285,7 +285,7 @@ pinnedPagesDescription: Bu sunucunun üst kısmına sabitlemek istediğiniz Sayf
yollarını satır sonundan ayırarak girin. yollarını satır sonundan ayırarak girin.
enableHcaptcha: hCaptcha'yı Aktif Et enableHcaptcha: hCaptcha'yı Aktif Et
notifyAntenna: Yeni gönderileri bildir notifyAntenna: Yeni gönderileri bildir
recentlyUpdatedUsers: En son aktif kullanıcılar recentlyUpdatedUsers: En son aktif olan kullanıcılar
about: Hakkında about: Hakkında
twoStepAuthentication: İki-adımlı doğrulama twoStepAuthentication: İki-adımlı doğrulama
securityKeyName: Anahtar ismi securityKeyName: Anahtar ismi

View file

@ -486,15 +486,16 @@ hideThisNote: "隐藏这条帖子"
showFeaturedNotesInTimeline: "在时间线上显示热门推荐" showFeaturedNotesInTimeline: "在时间线上显示热门推荐"
objectStorage: "对象存储" objectStorage: "对象存储"
useObjectStorage: "使用对象存储" useObjectStorage: "使用对象存储"
objectStorageBaseUrl: "Base URL" objectStorageBaseUrl: "根 URL"
objectStorageBaseUrlDesc: "用于引用的 URL。如果您正在使用 CDN 或反向代理,请指定其 URL。\n例如S3“https://<bucket>.s3.amazonaws.com”GCS“https://storage.googleapis.com/<bucket>”,其它同理。" objectStorageBaseUrlDesc: "用于引用的 URL。如果您正在使用 CDN 或反向代理,请指定其 URL。\n例如S3\"https://<bucket>.s3.amazonaws.com\"\
GCS\"https://storage.googleapis.com/<bucket>\",其它同理。"
objectStorageBucket: "存储桶" objectStorageBucket: "存储桶"
objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。" objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。"
objectStoragePrefix: "前缀" objectStoragePrefix: "前缀"
objectStoragePrefixDesc: "文件将存储在此前缀的目录下。" objectStoragePrefixDesc: "文件将存储在此前缀的目录下。"
objectStorageEndpoint: "Endpoint" objectStorageEndpoint: "端点 (Endpoint)"
objectStorageEndpointDesc: "如果您使用 AWS S3 请留空。否则请根据您使用的服务商的说明来进行设置,指定 Endpoint 形式为 objectStorageEndpointDesc: "如果您使用 AWS S3 请留空。否则请根据您使用的服务商的说明来进行设置,指定端点 (Endpoint)
\"<host>\" 或 \"<host>:<port>\"。" 形式为 \"<host>\" 或 \"<host>:<port>\"。"
objectStorageRegion: "可用区" objectStorageRegion: "可用区"
objectStorageRegionDesc: "指定一个可用区,例如 \"xx-east-1\"。 如果您的对象存储服务没有可用区概念,请将其留空或填写 \"\ objectStorageRegionDesc: "指定一个可用区,例如 \"xx-east-1\"。 如果您的对象存储服务没有可用区概念,请将其留空或填写 \"\
us-east-1\"。\n对于 Cloudflare R2可以填为 \"auto\"。" us-east-1\"。\n对于 Cloudflare R2可以填为 \"auto\"。"
@ -502,7 +503,7 @@ objectStorageUseSSL: "使用 SSL"
objectStorageUseSSLDesc: "如果不使用 HTTPS 进行 API 连接,请关闭" objectStorageUseSSLDesc: "如果不使用 HTTPS 进行 API 连接,请关闭"
objectStorageUseProxy: "使用代理" objectStorageUseProxy: "使用代理"
objectStorageUseProxyDesc: "如果您不使用代理进行 API 连接,请将其关闭" objectStorageUseProxyDesc: "如果您不使用代理进行 API 连接,请将其关闭"
objectStorageSetPublicRead: "上传时设置为 public-read" objectStorageSetPublicRead: "上传时设置为 \"public-read\""
serverLogs: "服务器日志" serverLogs: "服务器日志"
deleteAll: "全部删除" deleteAll: "全部删除"
showFixedPostForm: "在时间线顶部显示发帖框" showFixedPostForm: "在时间线顶部显示发帖框"
@ -599,7 +600,7 @@ emptyToDisableSmtpAuth: "留空用户名和密码以禁用 SMTP 验证"
smtpSecure: "在 SMTP 连接中使用隐式 SSL / TLS" smtpSecure: "在 SMTP 连接中使用隐式 SSL / TLS"
smtpSecureInfo: "使用 STARTTLS 时关闭" smtpSecureInfo: "使用 STARTTLS 时关闭"
testEmail: "邮件发送测试" testEmail: "邮件发送测试"
wordMute: "文字过滤" wordMute: "文字和语言过滤"
regexpError: "正则表达式错误" regexpError: "正则表达式错误"
regexpErrorDescription: "{tab} 文字过滤的第 {line} 行的正则表达式有错误:" regexpErrorDescription: "{tab} 文字过滤的第 {line} 行的正则表达式有错误:"
instanceMute: "服务器静音" instanceMute: "服务器静音"
@ -608,7 +609,7 @@ makeActive: "启用"
display: "显示" display: "显示"
copy: "复制" copy: "复制"
metrics: "指标" metrics: "指标"
overview: "服务器概况" overview: "概况"
logs: "日志" logs: "日志"
delayed: "滞后" delayed: "滞后"
database: "数据库" database: "数据库"
@ -745,7 +746,7 @@ unlikeConfirm: "取消赞?"
fullView: "全屏" fullView: "全屏"
quitFullView: "退出全屏" quitFullView: "退出全屏"
addDescription: "添加描述" addDescription: "添加描述"
userPagePinTip: "在帖子的菜单中选择“置顶”,即可显示该条帖子。" userPagePinTip: "在帖子的菜单中选择「置顶」,即可在此显示该条帖子。"
notSpecifiedMentionWarning: "有未指定的提及" notSpecifiedMentionWarning: "有未指定的提及"
info: "关于" info: "关于"
userInfo: "用户信息" userInfo: "用户信息"
@ -805,7 +806,7 @@ accountDeletionInProgress: "正在删除账号"
usernameInfo: "在服务器上唯一标识您的账号的名称。您可以使用字母 (a ~ z, A ~ Z)、数字 (0 ~ 9) 和下划线 (_)。用户名以后不能更改。" usernameInfo: "在服务器上唯一标识您的账号的名称。您可以使用字母 (a ~ z, A ~ Z)、数字 (0 ~ 9) 和下划线 (_)。用户名以后不能更改。"
aiChanMode: "小蓝模式" aiChanMode: "小蓝模式"
keepCw: "保留内容警告" keepCw: "保留内容警告"
pubSub: "推送 (Pub)/订阅 (Sub) 账号" pubSub: "推送 (Pub) / 订阅 (Sub) 账号"
lastCommunication: "最近通信" lastCommunication: "最近通信"
resolved: "已解决" resolved: "已解决"
unresolved: "未解决" unresolved: "未解决"
@ -1113,7 +1114,7 @@ _wordMute:
muteLangs: "过滤语言" muteLangs: "过滤语言"
muteWordsDescription: "AND 条件用空格分隔OR 条件用换行符分隔。" muteWordsDescription: "AND 条件用空格分隔OR 条件用换行符分隔。"
muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。" muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。"
muteLangsDescription: "OR 条件用空格,换行符分隔" muteLangsDescription: "OR 条件用空格或换行符分隔。"
muteLangsDescription2: "使用语言代码。例: en, fr, ja, zh." muteLangsDescription2: "使用语言代码。例: en, fr, ja, zh."
softDescription: "隐藏时间线中指定条件的帖子。" softDescription: "隐藏时间线中指定条件的帖子。"
langDescription: "从时间线中隐藏与设置语言匹配的帖子。" langDescription: "从时间线中隐藏与设置语言匹配的帖子。"
@ -1839,8 +1840,8 @@ customMOTD: 自定义 MOTD启动屏幕消息
sendPushNotificationReadMessageCaption: 会短暂显示 "{emptyPushNotificationMessage}" 的通知,如果启用,可能会增加您的设备的耗电量。 sendPushNotificationReadMessageCaption: 会短暂显示 "{emptyPushNotificationMessage}" 的通知,如果启用,可能会增加您的设备的耗电量。
adminCustomCssWarn: 仅当您知道此设置的作用时才应使用它。输入不正确的值可能会导致每个人的客户端停止正常运行。请在用户设置中进行测试来确保您的 CSS adminCustomCssWarn: 仅当您知道此设置的作用时才应使用它。输入不正确的值可能会导致每个人的客户端停止正常运行。请在用户设置中进行测试来确保您的 CSS
正常工作。 正常工作。
customMOTDDescription: 自定义 MOTD启动屏幕消息一行一个每次用户加载/刷新页面时都会随机显示。 customMOTDDescription: 自定义 MOTD启动屏幕消息一行一个每次用户加载 / 重新加载页面时都会随机显示。
customSplashIconsDescription: 用换行符隔开的自定义启动屏幕图标的 URL在用户每次加载/重新载入页面时随机显示。请确保图片是在一个静态的 customSplashIconsDescription: 用换行符隔开的自定义启动屏幕图标的 URL在用户每次加载 / 重新加载页面时随机显示。请确保图片是在一个静态的
URL 上,最好全部调整为 192x192 的大小。 URL 上,最好全部调整为 192x192 的大小。
recommendedInstancesDescription: 推荐的服务器一行一个,它们将出现在推荐时间线中。 recommendedInstancesDescription: 推荐的服务器一行一个,它们将出现在推荐时间线中。
splash: 启动画面 splash: 启动画面
@ -1863,7 +1864,7 @@ customSplashIcons: 自定义启动屏幕图标urls
alt: 替代文字 alt: 替代文字
pushNotificationNotSupported: 您的浏览器或者服务器不支持推送通知 pushNotificationNotSupported: 您的浏览器或者服务器不支持推送通知
showAds: 显示社区横幅 showAds: 显示社区横幅
enterSendsMessage: 按回车键发送信息(关闭则是 Ctrl + Retun 发送) enterSendsMessage: 按回车键发送信息(关闭则是 Ctrl + Return 发送)
recommendedInstances: 推荐服务器 recommendedInstances: 推荐服务器
updateAvailable: 可能有可用更新! updateAvailable: 可能有可用更新!
swipeOnMobile: 允许在页面之间滑动 swipeOnMobile: 允许在页面之间滑动
@ -1976,7 +1977,7 @@ confirm: 确认
importZip: 导入 ZIP importZip: 导入 ZIP
exportZip: 导出 ZIP exportZip: 导出 ZIP
emojiPackCreator: 表情包创建工具 emojiPackCreator: 表情包创建工具
objectStorageS3ForcePathStyleDesc: 打开此选项可构建格式为 's3.amazonaws.com/<bucket>/' 而非 '<bucket>.s3.amazonaws.com' objectStorageS3ForcePathStyleDesc: 打开此选项可构建格式为 "s3.amazonaws.com/<bucket>/" 而非 "<bucket>.s3.amazonaws.com"
的端点 URL。 的端点 URL。
objectStorageS3ForcePathStyle: 使用基于路径的端点 URL objectStorageS3ForcePathStyle: 使用基于路径的端点 URL
delete2fa: 禁用 2FA delete2fa: 禁用 2FA
@ -1989,3 +1990,5 @@ detectPostLanguage: 自动检测语言,并显示外文帖子的翻译按钮
indexableDescription: 允许内置搜索显示您的公开帖子 indexableDescription: 允许内置搜索显示您的公开帖子
indexable: 可索引的 indexable: 可索引的
languageForTranslation: 帖子翻译语言 languageForTranslation: 帖子翻译语言
vibrate: 播放振动
openServerInfo: 点击帖子上的服务器滚动条时显示服务器信息

View file

@ -12,7 +12,7 @@ ok: "OK"
gotIt: "知道了!" gotIt: "知道了!"
cancel: "取消" cancel: "取消"
enterUsername: "輸入使用者名稱" enterUsername: "輸入使用者名稱"
renotedBy: "{user} 轉了" renotedBy: "{user} 轉了"
noNotes: "無貼文" noNotes: "無貼文"
noNotifications: "沒有通知" noNotifications: "沒有通知"
instance: "伺服器" instance: "伺服器"
@ -292,7 +292,7 @@ inputNewFileName: "輸入檔案名稱"
inputNewDescription: "請輸入新標題" inputNewDescription: "請輸入新標題"
inputNewFolderName: "輸入新資料夾的名稱" inputNewFolderName: "輸入新資料夾的名稱"
circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。" circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。"
hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。" hasChildFilesOrFolders: "此資料夾不是空的,無法刪除。"
copyUrl: "複製網址" copyUrl: "複製網址"
rename: "重新命名" rename: "重新命名"
avatar: "大頭貼" avatar: "大頭貼"
@ -325,7 +325,7 @@ connectService: "己連結"
disconnectService: "己斷開" disconnectService: "己斷開"
enableLocalTimeline: "開啟本地時間線" enableLocalTimeline: "開啟本地時間線"
enableGlobalTimeline: "啟用公開時間線" enableGlobalTimeline: "啟用公開時間線"
disablingTimelinesInfo: "即使您關閉了時間線功能,管理員和版主始終可以訪問所有的時間線。" disablingTimelinesInfo: "即使您關閉了時間線功能,管理員和板主仍可訪問所有的時間線。"
registration: "註冊" registration: "註冊"
enableRegistration: "開啟新使用者註冊" enableRegistration: "開啟新使用者註冊"
invite: "邀請" invite: "邀請"
@ -773,7 +773,7 @@ gallery: "相簿"
recentPosts: "最新貼文" recentPosts: "最新貼文"
popularPosts: "熱門的貼文" popularPosts: "熱門的貼文"
shareWithNote: "在貼文中分享" shareWithNote: "在貼文中分享"
ads: "廣告" ads: "社群橫幅"
expiration: "期限" expiration: "期限"
memo: "備忘錄" memo: "備忘錄"
priority: "優先級" priority: "優先級"
@ -801,7 +801,7 @@ translatedFrom: "從 {x} 翻譯"
accountDeletionInProgress: "正在刪除帳戶" accountDeletionInProgress: "正在刪除帳戶"
usernameInfo: "在伺服器上您的帳戶是唯一的識別名稱。您可以使用字母 (a ~ z, A ~ Z)、數字 (0 ~ 9) 和下底線 (_)。之後帳戶名是不能更改的。" usernameInfo: "在伺服器上您的帳戶是唯一的識別名稱。您可以使用字母 (a ~ z, A ~ Z)、數字 (0 ~ 9) 和下底線 (_)。之後帳戶名是不能更改的。"
aiChanMode: "小藍模式" aiChanMode: "小藍模式"
keepCw: "保持CW" keepCw: "保持內容警告"
pubSub: "Pub/Sub 帳戶" pubSub: "Pub/Sub 帳戶"
lastCommunication: "最近的通信" lastCommunication: "最近的通信"
resolved: "已解決" resolved: "已解決"
@ -1067,7 +1067,7 @@ _mfm:
position: 位置 position: 位置
alwaysPlay: 自動播放所有MFM動畫 alwaysPlay: 自動播放所有MFM動畫
positionDescription: 按指定數量移動內容。 positionDescription: 按指定數量移動內容。
advancedDescription: 如果禁用,則僅允許基本標記,除非正在播放 MFM 動畫 advancedDescription: 如果停用僅顯示基礎MFM及正在播放的MFM動畫
advanced: 高級MFM advanced: 高級MFM
fade: 淡出 fade: 淡出
foreground: 文字顏色 foreground: 文字顏色
@ -1114,6 +1114,11 @@ _wordMute:
soft: "軟性靜音" soft: "軟性靜音"
hard: "硬性靜音" hard: "硬性靜音"
mutedNotes: "已靜音的貼文" mutedNotes: "已靜音的貼文"
muteLangsDescription2: '使用語言代碼。例: en, fr, ja, zh.'
lang: 語言
langDescription: 將指定語言的貼文從時間線中隱藏。
muteLangs: 被靜音的語言
muteLangsDescription: OR條件以空格或換行進行分隔。
_instanceMute: _instanceMute:
instanceMuteDescription: "包括對被靜音伺服器上的用戶的回覆,被設定的伺服器上所有貼文及轉發都會被靜音。" instanceMuteDescription: "包括對被靜音伺服器上的用戶的回覆,被設定的伺服器上所有貼文及轉發都會被靜音。"
instanceMuteDescription2: "設定時以換行進行分隔" instanceMuteDescription2: "設定時以換行進行分隔"
@ -1355,9 +1360,9 @@ _cw:
files: "{count} 個檔案" files: "{count} 個檔案"
_poll: _poll:
noOnlyOneChoice: "至少需要兩個選項" noOnlyOneChoice: "至少需要兩個選項"
choiceN: "選{n}" choiceN: "選{n}"
noMore: "沒辦法再添加選項了" noMore: "沒辦法再添加選項了"
canMultipleVote: "可以多次投票" canMultipleVote: "允許複選"
expiration: "期限" expiration: "期限"
infinite: "無期限" infinite: "無期限"
at: "結束時間" at: "結束時間"
@ -1366,7 +1371,7 @@ _poll:
deadlineTime: "小時" deadlineTime: "小時"
duration: "時長" duration: "時長"
votesCount: "{n}票" votesCount: "{n}票"
totalVotes: "一共{n}票" totalVotes: "總計{n}票"
vote: "投票" vote: "投票"
showResult: "顯示結果" showResult: "顯示結果"
voted: "已投票" voted: "已投票"
@ -1777,6 +1782,7 @@ _notification:
reply: "回覆" reply: "回覆"
renote: "轉發" renote: "轉發"
reacted: 對您的貼文做出了反應 reacted: 對您的貼文做出了反應
renoted: 轉發了您的貼文
_deck: _deck:
alwaysShowMainColumn: "總是顯示主欄" alwaysShowMainColumn: "總是顯示主欄"
columnAlign: "對齊欄位" columnAlign: "對齊欄位"
@ -1823,13 +1829,13 @@ adminCustomCssWarn: 除非你知道它的作用,否則請不要使用此設定
CSS 正常工作。 CSS 正常工作。
showUpdates: Firefish 更新時顯示彈出視窗 showUpdates: Firefish 更新時顯示彈出視窗
recommendedInstances: 建議的伺服器 recommendedInstances: 建議的伺服器
caption: 自動字幕 caption: 自動加上替代文字(alt)
enterSendsMessage: 在 Messaging 中按 Return 發送消息 (如關閉則是 Ctrl + Return) enterSendsMessage: 在 Messaging 中按 Return 發送消息 (如關閉則是 Ctrl + Return)
migrationConfirm: "您確定要將你的帳戶遷移到 {account} 嗎? 一旦這樣做,你將無法復原,而你將無法再次正常使用您的帳戶。\n另外請確保你已將此當前帳戶設置為您要遷移的帳戶。" migrationConfirm: "您確定要將你的帳戶遷移到 {account} 嗎? 一旦這樣做,你將無法復原,而你將無法再次正常使用您的帳戶。\n另外請確保你已將此當前帳戶設置為您要遷移的帳戶。"
customSplashIconsDescription: 每次用戶加載/重新加載頁面時,以換行符號分隔的自定啟動畫面圖標的網址將隨機顯示。請確保圖片位於靜態網址上,最好所有圖片解析度調整為 customSplashIconsDescription: 每次用戶加載/重新加載頁面時,以換行符號分隔的自定啟動畫面圖標的網址將隨機顯示。請確保圖片位於靜態網址上,最好所有圖片解析度調整為
192x192。 192x192。
accountMoved: '該使用者已遷移至新帳戶:' accountMoved: '該使用者已遷移至新帳戶:'
showAds: 顯示廣告 showAds: 顯示社群橫幅
noThankYou: 不用了,謝謝 noThankYou: 不用了,謝謝
selectInstance: 選擇伺服器 selectInstance: 選擇伺服器
enableRecommendedTimeline: 啟用推薦時間線 enableRecommendedTimeline: 啟用推薦時間線
@ -1863,9 +1869,10 @@ silencedInstances: 已靜音的伺服器
silenced: 已靜音 silenced: 已靜音
_experiments: _experiments:
title: 試驗功能 title: 試驗功能
enablePostImports: 啟用匯入貼文的功能
findOtherInstance: 找找另一個伺服器 findOtherInstance: 找找另一個伺服器
noGraze: 瀏覽器擴展 "Graze for Mastodon" 會與Firefish發生衝突請停用該擴展。 noGraze: 瀏覽器擴展 "Graze for Mastodon" 會與Firefish發生衝突請停用該擴展。
userSaysSomethingReasonRenote: '{name} 轉了包含 {reason} 的貼文' userSaysSomethingReasonRenote: '{name} 轉了包含 {reason} 的貼文'
pushNotificationNotSupported: 你的瀏覽器或伺服器不支援推送通知 pushNotificationNotSupported: 你的瀏覽器或伺服器不支援推送通知
accessibility: 輔助功能 accessibility: 輔助功能
userSaysSomethingReasonReply: '{name} 回覆了包含 {reason} 的貼文' userSaysSomethingReasonReply: '{name} 回覆了包含 {reason} 的貼文'
@ -1909,7 +1916,7 @@ channelFederationWarn: 頻道功能尚未與聯邦宇宙連動
swipeOnMobile: 允許以滑動在頁面之間切換 swipeOnMobile: 允許以滑動在頁面之間切換
sendPushNotificationReadMessage: 閱讀相關通知或消息後刪除推送通知 sendPushNotificationReadMessage: 閱讀相關通知或消息後刪除推送通知
image: 圖片 image: 圖片
seperateRenoteQuote: 別獨立的轉傳及引用按鈕 seperateRenoteQuote: 開轉發及引用的按鈕
clipsDesc: 摘錄就像一個可以分享的書籤。 你可以從每個貼文的菜單創建新摘錄或將貼文加入已有的摘錄。 clipsDesc: 摘錄就像一個可以分享的書籤。 你可以從每個貼文的菜單創建新摘錄或將貼文加入已有的摘錄。
noteId: 貼文 ID noteId: 貼文 ID
sendModMail: 發送審核通知 sendModMail: 發送審核通知
@ -1919,7 +1926,7 @@ reactionPickerSkinTone: 首選表情符號膚色
indexFromDescription: 留空以索引每個貼文 indexFromDescription: 留空以索引每個貼文
preventAiLearning: 防止 AI 機器人抓取 preventAiLearning: 防止 AI 機器人抓取
preventAiLearningDescription: 請求第三方 AI 語言模型不要研究您上傳的內容,例如貼文和圖像。 preventAiLearningDescription: 請求第三方 AI 語言模型不要研究您上傳的內容,例如貼文和圖像。
indexFrom: 從貼文 ID 開始的索引 indexFrom: 建立此貼文ID以後的索引
isLocked: 該帳戶已獲得以下批准 isLocked: 該帳戶已獲得以下批准
isModerator: 板主 isModerator: 板主
isAdmin: 管理員 isAdmin: 管理員
@ -1927,7 +1934,7 @@ isPatron: Firefish 項目贊助者
silencedWarning: 顯示此頁面是因為這些使用者來自您伺服器管理員已靜音的伺服器,因此他們可能是垃圾訊息。 silencedWarning: 顯示此頁面是因為這些使用者來自您伺服器管理員已靜音的伺服器,因此他們可能是垃圾訊息。
signupsDisabled: 該伺服器上的註冊當前已被禁用,但您隨時可以在另一台伺服器上註冊!或是您有該伺服器的邀請碼,請在下面輸入。 signupsDisabled: 該伺服器上的註冊當前已被禁用,但您隨時可以在另一台伺服器上註冊!或是您有該伺服器的邀請碼,請在下面輸入。
showPopup: 通過彈出式視窗通知用戶 showPopup: 通過彈出式視窗通知用戶
showWithSparkles: 閃閃發光的顯示 showWithSparkles: 讓標題閃閃發光
youHaveUnreadAnnouncements: 您有未讀的公告 youHaveUnreadAnnouncements: 您有未讀的公告
donationLink: 連結到贊助頁面 donationLink: 連結到贊助頁面
neverShow: 不再顯示 neverShow: 不再顯示
@ -1962,3 +1969,11 @@ emojiPackCreator: 表情包的作者
importZip: 匯入ZIP importZip: 匯入ZIP
delete2fa: 停用二階段認證(2FA) delete2fa: 停用二階段認證(2FA)
confirm: 確認 confirm: 確認
deletePasskeysConfirm: 此帳號的所有通行密鑰及安全密鑰將被完全刪除。此動作無法復原,是否繼續?
deletePasskeys: 刪除通行密鑰
detectPostLanguage: 自動判定貼文的語言,並在外文貼文顯示翻譯按鈕
indexableDescription: 允許內建搜尋引擎顯示您的公開貼文
addRe: 在回覆有內容警告的貼文時,在標題前面加上 "re:"
vibrate: 播放振動
openServerInfo: 點擊貼文中的伺服器名稱以顯示伺服器資訊
languageForTranslation: 貼文翻譯語言

View file

@ -1,6 +1,6 @@
{ {
"name": "firefish", "name": "firefish",
"version": "1.0.5-dev14", "version": "1.0.5-dev16",
"codename": "aqua", "codename": "aqua",
"repository": { "repository": {
"type": "git", "type": "git",

View file

@ -145,7 +145,7 @@
}, },
"devDependencies": { "devDependencies": {
"@swc/cli": "^0.1.62", "@swc/cli": "^0.1.62",
"@swc/core": "1.3.82", "@swc/core": "1.3.78",
"@types/adm-zip": "^0.5.0", "@types/adm-zip": "^0.5.0",
"@types/bcryptjs": "2.4.2", "@types/bcryptjs": "2.4.2",
"@types/escape-regexp": "0.0.1", "@types/escape-regexp": "0.0.1",

View file

@ -110,9 +110,8 @@ export function fromHtml(html: string, hashtagNames?: string[]): string {
} }
case "h1": { case "h1": {
text += "【";
appendChildren(node.childNodes); appendChildren(node.childNodes);
text += "\n"; text += "\n";
break; break;
} }

View file

@ -1,28 +0,0 @@
export default function (reaction: string): string {
switch (reaction) {
case "like":
return "👍";
case "love":
return "❤️";
case "laugh":
return "😆";
case "hmm":
return "🤔";
case "surprise":
return "😮";
case "congrats":
return "🎉";
case "angry":
return "💢";
case "confused":
return "😥";
case "rip":
return "😇";
case "pudding":
return "🍮";
case "star":
return "⭐";
default:
return reaction;
}
}

View file

@ -6,21 +6,7 @@ import { IsNull } from "typeorm";
import { EmojiCache } from "@/misc/populate-emojis.js"; import { EmojiCache } from "@/misc/populate-emojis.js";
import type { Emoji } from "@/models/entities/emoji.js"; import type { Emoji } from "@/models/entities/emoji.js";
const legacies = new Map([ export async function getFallbackReaction() {
["like", "👍"],
["love", "❤️"],
["laugh", "😆"],
["hmm", "🤔"],
["surprise", "😮"],
["congrats", "🎉"],
["angry", "💢"],
["confused", "😥"],
["rip", "😇"],
["pudding", "🍮"],
["star", "⭐"],
]);
async function getFallbackReaction() {
const meta = await fetchMeta(); const meta = await fetchMeta();
const name = meta.defaultReaction; const name = meta.defaultReaction;
@ -40,39 +26,17 @@ async function getFallbackReaction() {
return { name, emoji }; return { name, emoji };
} }
export function convertLegacyReactions(reactions: Record<string, number>) { export function convertReactions(reactions: Record<string, number>) {
const _reactions = new Map(); const result = new Map();
const decodedReactions = new Map();
for (const reaction in reactions) { for (const reaction in reactions) {
if (reactions[reaction] <= 0) continue; if (reactions[reaction] <= 0) continue;
let decodedReaction; const decoded = decodeReaction(reaction).reaction;
if (decodedReactions.has(reaction)) { result.set(decoded, (result.get(decoded) || 0) + reactions[reaction]);
decodedReaction = decodedReactions.get(reaction);
} else {
decodedReaction = decodeReaction(reaction);
decodedReactions.set(reaction, decodedReaction);
}
const emoji = legacies.get(decodedReaction.reaction);
if (emoji) {
_reactions.set(emoji, (_reactions.get(emoji) || 0) + reactions[reaction]);
} else {
_reactions.set(
reaction,
(_reactions.get(reaction) || 0) + reactions[reaction],
);
}
} }
const _reactions2 = new Map(); return Object.fromEntries(result);
for (const [reaction, count] of _reactions) {
const decodedReaction = decodedReactions.get(reaction);
_reactions2.set(decodedReaction.reaction, count);
}
return Object.fromEntries(_reactions2);
} }
export async function toDbReaction( export async function toDbReaction(
@ -83,9 +47,7 @@ export async function toDbReaction(
const _reacterHost = toPunyNullable(reacterHost); const _reacterHost = toPunyNullable(reacterHost);
// Convert string-type reactions to unicode if (reaction === "♥️") return { name: "❤️", emoji: null };
const emoji = legacies.get(reaction) || (reaction === "♥️" ? "❤️" : null);
if (emoji) return { name: emoji, emoji: null };
// Allow unicode reactions // Allow unicode reactions
const match = emojiRegex.exec(reaction); const match = emojiRegex.exec(reaction);
@ -152,9 +114,3 @@ export function decodeReaction(str: string): DecodedReaction {
host: undefined, host: undefined,
}; };
} }
export function convertLegacyReaction(reaction: string): string {
const decoded = decodeReaction(reaction).reaction;
if (legacies.has(decoded)) return legacies.get(decoded)!;
return decoded;
}

View file

@ -2,7 +2,7 @@ import { db } from "@/db/postgre.js";
import { NoteReaction } from "@/models/entities/note-reaction.js"; import { NoteReaction } from "@/models/entities/note-reaction.js";
import { Notes, Users } from "../index.js"; import { Notes, Users } from "../index.js";
import type { Packed } from "@/misc/schema.js"; import type { Packed } from "@/misc/schema.js";
import { convertLegacyReaction } from "@/misc/reaction-lib.js"; import { decodeReaction } from "@/misc/reaction-lib.js";
import type { User } from "@/models/entities/user.js"; import type { User } from "@/models/entities/user.js";
export const NoteReactionRepository = db.getRepository(NoteReaction).extend({ export const NoteReactionRepository = db.getRepository(NoteReaction).extend({
@ -27,7 +27,7 @@ export const NoteReactionRepository = db.getRepository(NoteReaction).extend({
id: reaction.id, id: reaction.id,
createdAt: reaction.createdAt.toISOString(), createdAt: reaction.createdAt.toISOString(),
user: await Users.pack(reaction.user ?? reaction.userId, me), user: await Users.pack(reaction.user ?? reaction.userId, me),
type: convertLegacyReaction(reaction.reaction), type: decodeReaction(reaction.reaction).reaction,
...(opts.withNote ...(opts.withNote
? { ? {
// may throw error // may throw error

View file

@ -14,11 +14,7 @@ import {
import type { Packed } from "@/misc/schema.js"; import type { Packed } from "@/misc/schema.js";
import { nyaize } from "@/misc/nyaize.js"; import { nyaize } from "@/misc/nyaize.js";
import { awaitAll } from "@/prelude/await-all.js"; import { awaitAll } from "@/prelude/await-all.js";
import { import { convertReactions, decodeReaction } from "@/misc/reaction-lib.js";
convertLegacyReaction,
convertLegacyReactions,
decodeReaction,
} from "@/misc/reaction-lib.js";
import type { NoteReaction } from "@/models/entities/note-reaction.js"; import type { NoteReaction } from "@/models/entities/note-reaction.js";
import { import {
aggregateNoteEmojis, aggregateNoteEmojis,
@ -38,7 +34,7 @@ import {
} from "@/db/scylla.js"; } from "@/db/scylla.js";
import { LocalFollowingsCache } from "@/misc/cache.js"; import { LocalFollowingsCache } from "@/misc/cache.js";
import { userByIdCache } from "@/services/user-cache.js"; import { userByIdCache } from "@/services/user-cache.js";
import { detect as detectLanguage_ } from "tinyld"; import { detect as detectLanguage } from "tinyld";
export async function populatePoll( export async function populatePoll(
note: Note | ScyllaNote, note: Note | ScyllaNote,
@ -136,7 +132,7 @@ async function populateMyReaction(
if (_hint_?.myReactions) { if (_hint_?.myReactions) {
const reaction = _hint_.myReactions.get(note.id); const reaction = _hint_.myReactions.get(note.id);
if (reaction) { if (reaction) {
return convertLegacyReaction(reaction.reaction); return decodeReaction(reaction.reaction).reaction;
} else if (reaction === null) { } else if (reaction === null) {
return undefined; return undefined;
} }
@ -161,7 +157,7 @@ async function populateMyReaction(
} }
if (reaction) { if (reaction) {
return convertLegacyReaction(reaction.reaction); return decodeReaction(reaction.reaction).reaction;
} }
return undefined; return undefined;
@ -304,7 +300,8 @@ export const NoteRepository = db.getRepository(Note).extend({
host, host,
); );
const lang = detectLanguage_(`${note.cw ?? ''}\n${note.text ?? ''}`) ?? "unknown" const lang =
detectLanguage(`${note.cw ?? ""}\n${note.text ?? ""}`) ?? "unknown";
const reactionEmoji = await populateEmojis(reactionEmojiNames, host); const reactionEmoji = await populateEmojis(reactionEmojiNames, host);
const packed: Packed<"Note"> = await awaitAll({ const packed: Packed<"Note"> = await awaitAll({
id: note.id, id: note.id,
@ -321,7 +318,7 @@ export const NoteRepository = db.getRepository(Note).extend({
note.visibility === "specified" ? note.visibleUserIds : undefined, note.visibility === "specified" ? note.visibleUserIds : undefined,
renoteCount: note.renoteCount, renoteCount: note.renoteCount,
repliesCount: note.repliesCount, repliesCount: note.repliesCount,
reactions: convertLegacyReactions(note.reactions), reactions: convertReactions(note.reactions),
reactionEmojis: reactionEmoji, reactionEmojis: reactionEmoji,
emojis: noteEmoji, emojis: noteEmoji,
tags: note.tags.length > 0 ? note.tags : undefined, tags: note.tags.length > 0 ? note.tags : undefined,

View file

@ -258,7 +258,7 @@ export async function createNote(
// Quote // Quote
let quote: Note | undefined | null; let quote: Note | undefined | null;
if (note._misskey_quote || note.quoteUrl || note.quoteUri) { if (note.quoteUrl || note.quoteUri) {
const tryResolveNote = async ( const tryResolveNote = async (
uri: string, uri: string,
): Promise< ): Promise<
@ -295,7 +295,7 @@ export async function createNote(
}; };
const uris = unique( const uris = unique(
[note._misskey_quote, note.quoteUrl, note.quoteUri].filter( [note.quoteUrl, note.quoteUri].filter(
(x): x is string => typeof x === "string", (x): x is string => typeof x === "string",
), ),
); );
@ -321,8 +321,6 @@ export async function createNote(
typeof note.source?.content === "string" typeof note.source?.content === "string"
) { ) {
text = note.source.content; text = note.source.content;
} else if (typeof note._misskey_content !== "undefined") {
text = note._misskey_content;
} else if (typeof note.content === "string") { } else if (typeof note.content === "string") {
text = htmlToMfm(note.content, note.tag); text = htmlToMfm(note.content, note.tag);
} }
@ -624,8 +622,6 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) {
typeof post.source?.content === "string" typeof post.source?.content === "string"
) { ) {
text = post.source.content; text = post.source.content;
} else if (typeof post._misskey_content !== "undefined") {
text = post._misskey_content;
} else if (typeof post.content === "string") { } else if (typeof post.content === "string") {
text = htmlToMfm(post.content, post.tag); text = htmlToMfm(post.content, post.tag);
} }

View file

@ -306,7 +306,7 @@ export async function createPerson(
tags, tags,
isBot, isBot,
isCat: (person as any).isCat === true, isCat: (person as any).isCat === true,
speakAsCat: person.speakAsCat, speakAsCat: (person as any).speakAsCat === true,
isIndexable: person.indexable, isIndexable: person.indexable,
}), }),
)) as IRemoteUser; )) as IRemoteUser;
@ -557,6 +557,7 @@ export async function updatePerson(
tags, tags,
isBot: getApType(object) !== "Person", isBot: getApType(object) !== "Person",
isCat: (person as any).isCat === true, isCat: (person as any).isCat === true,
speakAsCat: (person as any).speakAsCat === true,
isIndexable: person.indexable, isIndexable: person.indexable,
isLocked: !!person.manuallyApprovesFollowers, isLocked: !!person.manuallyApprovesFollowers,
movedToUri: person.movedTo || null, movedToUri: person.movedTo || null,

View file

@ -35,13 +35,14 @@ export const renderActivity = (x: any): IActivity | null => {
schema: "http://schema.org#", schema: "http://schema.org#",
PropertyValue: "schema:PropertyValue", PropertyValue: "schema:PropertyValue",
value: "schema:value", value: "schema:value",
// Firefish
firefish: "https://joinfirefish.org/ns#",
speakAsCat: "firefish:speakAsCat",
// Misskey // Misskey
misskey: "https://misskey-hub.net/ns#", misskey: "https://misskey-hub.net/ns#",
_misskey_content: "misskey:_misskey_content", _misskey_talk: "misskey:_misskey_talk",
_misskey_quote: "misskey:_misskey_quote",
_misskey_reaction: "misskey:_misskey_reaction", _misskey_reaction: "misskey:_misskey_reaction",
_misskey_votes: "misskey:_misskey_votes", _misskey_votes: "misskey:_misskey_votes",
_misskey_talk: "misskey:_misskey_talk",
isCat: "misskey:isCat", isCat: "misskey:isCat",
// Fedibird // Fedibird
fedibird: "http://fedibird.com/ns#", fedibird: "http://fedibird.com/ns#",

View file

@ -1,4 +1,5 @@
import { In, IsNull } from "typeorm"; import { In, IsNull } from "typeorm";
import { detect as detectLanguage } from "tinyld";
import config from "@/config/index.js"; import config from "@/config/index.js";
import type { Note, IMentionedRemoteUsers } from "@/models/entities/note.js"; import type { Note, IMentionedRemoteUsers } from "@/models/entities/note.js";
import type { DriveFile } from "@/models/entities/drive-file.js"; import type { DriveFile } from "@/models/entities/drive-file.js";
@ -157,6 +158,11 @@ export default async function renderNote(
}), }),
); );
const lang = detectLanguage(text);
const contentMap = lang ? {
[lang]: content
} : null;
const emojis = await getEmojis(note.emojis); const emojis = await getEmojis(note.emojis);
const apemojis = emojis.map((emoji) => renderEmoji(emoji)); const apemojis = emojis.map((emoji) => renderEmoji(emoji));
@ -221,12 +227,11 @@ export default async function renderNote(
attributedTo, attributedTo,
summary, summary,
content, content,
_misskey_content: text, contentMap,
source: { source: {
content: text, content: text,
mediaType: "text/x.misskeymarkdown", mediaType: "text/x.misskeymarkdown",
}, },
_misskey_quote: quote,
quoteUri: quote, quoteUri: quote,
quoteUrl: quote, quoteUrl: quote,
published: note.createdAt.toISOString(), published: note.createdAt.toISOString(),

View file

@ -14,6 +14,7 @@ export interface IObject {
inReplyTo?: any; inReplyTo?: any;
replies?: ICollection; replies?: ICollection;
content?: string; content?: string;
contentMap?: obj;
name?: string; name?: string;
startTime?: Date; startTime?: Date;
endTime?: Date; endTime?: Date;
@ -134,7 +135,6 @@ export interface IPost extends IObject {
content: string; content: string;
mediaType: string; mediaType: string;
}; };
_misskey_quote?: string;
quoteUrl?: string; quoteUrl?: string;
quoteUri?: string; quoteUri?: string;
_misskey_talk: boolean; _misskey_talk: boolean;
@ -146,7 +146,6 @@ export interface IQuestion extends IObject {
content: string; content: string;
mediaType: string; mediaType: string;
}; };
_misskey_quote?: string;
quoteUrl?: string; quoteUrl?: string;
oneOf?: IQuestionChoice[]; oneOf?: IQuestionChoice[];
anyOf?: IQuestionChoice[]; anyOf?: IQuestionChoice[];

View file

@ -69,6 +69,7 @@ describe("ユーザー", () => {
avatarBlurhash: user.avatarBlurhash, avatarBlurhash: user.avatarBlurhash,
isBot: user.isBot, isBot: user.isBot,
isCat: user.isCat, isCat: user.isCat,
speakAsCat: user.speakAsCat,
instance: user.instance, instance: user.instance,
emojis: user.emojis, emojis: user.emojis,
onlineStatus: user.onlineStatus, onlineStatus: user.onlineStatus,
@ -401,6 +402,7 @@ describe("ユーザー", () => {
assert.strictEqual(response.avatarBlurhash, null); assert.strictEqual(response.avatarBlurhash, null);
assert.strictEqual(response.isBot, false); assert.strictEqual(response.isBot, false);
assert.strictEqual(response.isCat, false); assert.strictEqual(response.isCat, false);
assert.strictEqual(response.speakAsCat, false);
assert.strictEqual(response.instance, undefined); assert.strictEqual(response.instance, undefined);
assert.deepStrictEqual(response.emojis, {}); assert.deepStrictEqual(response.emojis, {});
assert.strictEqual(response.onlineStatus, "unknown"); assert.strictEqual(response.onlineStatus, "unknown");
@ -538,6 +540,8 @@ describe("ユーザー", () => {
{ parameters: (): object => ({ isBot: false }) }, { parameters: (): object => ({ isBot: false }) },
{ parameters: (): object => ({ isCat: true }) }, { parameters: (): object => ({ isCat: true }) },
{ parameters: (): object => ({ isCat: false }) }, { parameters: (): object => ({ isCat: false }) },
{ parameters: (): object => ({ speakAsCat: true }) },
{ parameters: (): object => ({ speakAsCat: false }) },
{ parameters: (): object => ({ injectFeaturedNote: true }) }, { parameters: (): object => ({ injectFeaturedNote: true }) },
{ parameters: (): object => ({ injectFeaturedNote: false }) }, { parameters: (): object => ({ injectFeaturedNote: false }) },
{ parameters: (): object => ({ receiveAnnouncementEmail: true }) }, { parameters: (): object => ({ receiveAnnouncementEmail: true }) },

View file

@ -1,83 +0,0 @@
/*
import * as assert from 'assert';
import { toDbReaction } from '../src/misc/reaction-lib.js';
describe('toDbReaction', async () => {
it('既存の文字列リアクションはそのまま', async () => {
assert.strictEqual(await toDbReaction('like'), 'like');
});
it('Unicodeプリンは寿司化不能とするため文字列化しない', async () => {
assert.strictEqual(await toDbReaction('🍮'), '🍮');
});
it('プリン以外の既存のリアクションは文字列化する like', async () => {
assert.strictEqual(await toDbReaction('👍'), 'like');
});
it('プリン以外の既存のリアクションは文字列化する love', async () => {
assert.strictEqual(await toDbReaction('❤️'), 'love');
});
it('プリン以外の既存のリアクションは文字列化する love 異体字セレクタなし', async () => {
assert.strictEqual(await toDbReaction('❤'), 'love');
});
it('プリン以外の既存のリアクションは文字列化する laugh', async () => {
assert.strictEqual(await toDbReaction('😆'), 'laugh');
});
it('プリン以外の既存のリアクションは文字列化する hmm', async () => {
assert.strictEqual(await toDbReaction('🤔'), 'hmm');
});
it('プリン以外の既存のリアクションは文字列化する surprise', async () => {
assert.strictEqual(await toDbReaction('😮'), 'surprise');
});
it('プリン以外の既存のリアクションは文字列化する congrats', async () => {
assert.strictEqual(await toDbReaction('🎉'), 'congrats');
});
it('プリン以外の既存のリアクションは文字列化する angry', async () => {
assert.strictEqual(await toDbReaction('💢'), 'angry');
});
it('プリン以外の既存のリアクションは文字列化する confused', async () => {
assert.strictEqual(await toDbReaction('😥'), 'confused');
});
it('プリン以外の既存のリアクションは文字列化する rip', async () => {
assert.strictEqual(await toDbReaction('😇'), 'rip');
});
it('それ以外はUnicodeのまま', async () => {
assert.strictEqual(await toDbReaction('🍅'), '🍅');
});
it('異体字セレクタ除去', async () => {
assert.strictEqual(await toDbReaction('㊗️'), '㊗');
});
it('異体字セレクタ除去 必要なし', async () => {
assert.strictEqual(await toDbReaction('㊗'), '㊗');
});
it('fallback - undefined', async () => {
assert.strictEqual(await toDbReaction(undefined), 'like');
});
it('fallback - null', async () => {
assert.strictEqual(await toDbReaction(null), 'like');
});
it('fallback - empty', async () => {
assert.strictEqual(await toDbReaction(''), 'like');
});
it('fallback - unknown', async () => {
assert.strictEqual(await toDbReaction('unknown'), 'like');
});
});
*/

View file

@ -22,7 +22,7 @@ const props = defineProps<{
const query = ref(props.q); const query = ref(props.q);
const search = () => { const search = () => {
router.push(`/search/${query.value}`); router.push(`/search?q=${query.value}`);
}; };
</script> </script>

View file

@ -89,7 +89,7 @@ watch(
<style lang="scss" scoped> <style lang="scss" scoped>
@keyframes earwiggleleft { @keyframes earwiggleleft {
from { 0% {
transform: rotate(37.6deg) skew(30deg); transform: rotate(37.6deg) skew(30deg);
} }
25% { 25% {
@ -101,13 +101,13 @@ watch(
75% { 75% {
transform: rotate(0deg) skew(30deg); transform: rotate(0deg) skew(30deg);
} }
to { 100% {
transform: rotate(37.6deg) skew(30deg); transform: rotate(37.6deg) skew(30deg);
} }
} }
@keyframes earwiggleright { @keyframes earwiggleright {
from { 0% {
transform: rotate(-37.6deg) skew(-30deg); transform: rotate(-37.6deg) skew(-30deg);
} }
30% { 30% {
@ -119,7 +119,7 @@ watch(
75% { 75% {
transform: rotate(0deg) skew(-30deg); transform: rotate(0deg) skew(-30deg);
} }
to { 100% {
transform: rotate(-37.6deg) skew(-30deg); transform: rotate(-37.6deg) skew(-30deg);
} }
} }

View file

@ -297,7 +297,7 @@ const props = withDefaults(
} }
@keyframes mfm-rubberBand { @keyframes mfm-rubberBand {
from { 0% {
transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1);
} }
30% { 30% {
@ -315,7 +315,7 @@ const props = withDefaults(
75% { 75% {
transform: scale3d(1.05, 0.95, 1); transform: scale3d(1.05, 0.95, 1);
} }
to { 100% {
transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1);
} }
} }

View file

@ -7,23 +7,18 @@
<div class="shape2"></div> <div class="shape2"></div>
<img src="/client-assets/misskey.svg" class="misskey" /> <img src="/client-assets/misskey.svg" class="misskey" />
<div class="emojis"> <div class="emojis">
<MkEmoji :normal="true" :no-style="true" emoji="⭐" /> <MkEmoji
<MkEmoji :normal="true" :no-style="true" emoji="❤️" /> v-for="reaction in defaultReactions"
<MkEmoji :normal="true" :no-style="true" emoji="😆" /> :normal="true"
<MkEmoji :normal="true" :no-style="true" emoji="🤔" /> :no-style="true"
<MkEmoji :normal="true" :no-style="true" emoji="😮" /> :emoji="reaction"
<MkEmoji :normal="true" :no-style="true" emoji="🎉" /> />
<MkEmoji :normal="true" :no-style="true" emoji="💢" />
<MkEmoji :normal="true" :no-style="true" emoji="😥" />
<MkEmoji :normal="true" :no-style="true" emoji="😇" />
<MkEmoji :normal="true" :no-style="true" emoji="🥴" />
<MkEmoji :normal="true" :no-style="true" emoji="🍮" />
</div> </div>
<div class="main"> <div class="main">
<img <img
:src=" :src="
$instance.iconUrl || instance.iconUrl ||
$instance.faviconUrl || instance.faviconUrl ||
'/favicon.ico' '/favicon.ico'
" "
alt="" alt=""
@ -110,7 +105,9 @@ import MkButton from "@/components/MkButton.vue";
import MkFeaturedPhotos from "@/components/MkFeaturedPhotos.vue"; import MkFeaturedPhotos from "@/components/MkFeaturedPhotos.vue";
import { instanceName } from "@/config"; import { instanceName } from "@/config";
import * as os from "@/os"; import * as os from "@/os";
import { instance } from "@/instance";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { defaultReactions } from "@/store";
const meta = ref(); const meta = ref();
const stats = ref(); const stats = ref();
@ -183,6 +180,15 @@ function showMenu(ev) {
os.pageWindow("/about-firefish"); os.pageWindow("/about-firefish");
}, },
}, },
instance.tosUrl
? {
text: i18n.ts.tos,
icon: "ph-scroll ph-bold ph-lg",
action: () => {
window.open(instance.tosUrl, "_blank");
},
}
: null,
], ],
ev.currentTarget ?? ev.target, ev.currentTarget ?? ev.target,
); );

View file

@ -24,14 +24,16 @@ export function openHelpMenu_(ev: MouseEvent) {
icon: "ph-lightbulb ph-bold ph-lg", icon: "ph-lightbulb ph-bold ph-lg",
to: "/about-firefish", to: "/about-firefish",
}, },
{ instance.tosUrl
type: "button", ? {
text: i18n.ts.tos, type: "button",
icon: "ph-scroll ph-bold ph-lg", text: i18n.ts.tos,
action: () => { icon: "ph-scroll ph-bold ph-lg",
window.open(instance.tosUrl, "_blank"); action: () => {
}, window.open(instance.tosUrl, "_blank");
}, },
}
: null,
{ {
type: "button", type: "button",
text: i18n.ts.apps, text: i18n.ts.apps,

View file

@ -17,6 +17,21 @@ const menuOptions = [
"search", "search",
]; ];
export const defaultReactions = [
"⭐",
"❤️",
"😆",
"🤔",
"😮",
"🎉",
"💢",
"😥",
"😇",
"🥴",
"🔥",
"🐟",
];
// TODO: それぞれいちいちwhereとかdefaultというキーを付けなきゃいけないの冗長なのでなんとかする(ただ型定義が面倒になりそう) // TODO: それぞれいちいちwhereとかdefaultというキーを付けなきゃいけないの冗長なのでなんとかする(ただ型定義が面倒になりそう)
// あと、現行の定義の仕方なら「whereが何であるかに関わらずキー名の重複不可」という制約を付けられるメリットもあるからそのメリットを引き継ぐ方法も考えないといけない // あと、現行の定義の仕方なら「whereが何であるかに関わらずキー名の重複不可」という制約を付けられるメリットもあるからそのメリットを引き継ぐ方法も考えないといけない
export const defaultStore = markRaw( export const defaultStore = markRaw(
@ -83,19 +98,7 @@ export const defaultStore = markRaw(
}, },
reactions: { reactions: {
where: "account", where: "account",
default: [ default: defaultReactions,
"⭐",
"❤️",
"😆",
"🤔",
"😮",
"🎉",
"💢",
"😥",
"😇",
"🥴",
"🍮",
],
}, },
mutedWords: { mutedWords: {
where: "account", where: "account",

View file

@ -745,7 +745,7 @@ hr {
} }
@keyframes tada { @keyframes tada {
from { 0% {
transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1);
} }
@ -767,14 +767,14 @@ hr {
transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
} }
to { 100% {
transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1);
} }
} }
@media (prefers-reduced-motion) { @media (prefers-reduced-motion) {
@keyframes tada { @keyframes tada {
from { 0% {
transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1);
} }
@ -782,7 +782,7 @@ hr {
transform: scale3d(1.1, 1.1, 1.1); transform: scale3d(1.1, 1.1, 1.1);
} }
to { 100% {
transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1);
} }
} }
@ -937,7 +937,7 @@ hr {
// } // }
@keyframes reset { @keyframes reset {
to { 100% {
transform: none; transform: none;
opacity: 1; opacity: 1;
} }
@ -948,13 +948,13 @@ hr {
@media (prefers-reduced-motion: no-preference) { @media (prefers-reduced-motion: no-preference) {
@keyframes scaleIn { @keyframes scaleIn {
from { 0% {
transform: scale(0); transform: scale(0);
opacity: 0; opacity: 0;
} }
} }
@keyframes scaleInSmall { @keyframes scaleInSmall {
from { 0% {
transform: scale(0.8); transform: scale(0.8);
opacity: 0; opacity: 0;
} }

View file

@ -25,7 +25,7 @@
"@microsoft/api-extractor": "^7.36.0", "@microsoft/api-extractor": "^7.36.0",
"@microsoft/api-documenter": "^7.22.21", "@microsoft/api-documenter": "^7.22.21",
"@swc/cli": "^0.1.62", "@swc/cli": "^0.1.62",
"@swc/core": "1.3.82", "@swc/core": "1.3.78",
"@types/jest": "^27.4.0", "@types/jest": "^27.4.0",
"@types/node": "20.3.1", "@types/node": "20.3.1",
"jest": "^27.4.5", "jest": "^27.4.5",

View file

@ -10,7 +10,7 @@
}, },
"devDependencies": { "devDependencies": {
"@swc/cli": "^0.1.62", "@swc/cli": "^0.1.62",
"@swc/core": "1.3.82", "@swc/core": "1.3.78",
"@swc/core-android-arm64": "1.3.11", "@swc/core-android-arm64": "1.3.11",
"firefish-js": "workspace:*", "firefish-js": "workspace:*",
"idb-keyval": "^6.2.1", "idb-keyval": "^6.2.1",

View file

@ -451,10 +451,10 @@ importers:
devDependencies: devDependencies:
'@swc/cli': '@swc/cli':
specifier: ^0.1.62 specifier: ^0.1.62
version: 0.1.62(@swc/core@1.3.82)(chokidar@3.5.3) version: 0.1.62(@swc/core@1.3.78)(chokidar@3.5.3)
'@swc/core': '@swc/core':
specifier: 1.3.82 specifier: 1.3.78
version: 1.3.82 version: 1.3.78
'@types/adm-zip': '@types/adm-zip':
specifier: ^0.5.0 specifier: ^0.5.0
version: 0.5.1 version: 0.5.1
@ -601,13 +601,13 @@ importers:
version: 2.0.0 version: 2.0.0
swc-loader: swc-loader:
specifier: ^0.2.3 specifier: ^0.2.3
version: 0.2.3(@swc/core@1.3.82)(webpack@5.88.2) version: 0.2.3(@swc/core@1.3.78)(webpack@5.88.2)
ts-loader: ts-loader:
specifier: 9.4.4 specifier: 9.4.4
version: 9.4.4(typescript@5.1.6)(webpack@5.88.2) version: 9.4.4(typescript@5.1.6)(webpack@5.88.2)
ts-node: ts-node:
specifier: 10.9.1 specifier: 10.9.1
version: 10.9.1(@swc/core@1.3.82)(@types/node@18.11.18)(typescript@5.1.6) version: 10.9.1(@swc/core@1.3.78)(@types/node@18.11.18)(typescript@5.1.6)
tsconfig-paths: tsconfig-paths:
specifier: 4.2.0 specifier: 4.2.0
version: 4.2.0 version: 4.2.0
@ -616,7 +616,7 @@ importers:
version: 5.1.6 version: 5.1.6
webpack: webpack:
specifier: ^5.88.2 specifier: ^5.88.2
version: 5.88.2(@swc/core@1.3.82)(webpack-cli@5.1.4) version: 5.88.2(@swc/core@1.3.78)(webpack-cli@5.1.4)
ws: ws:
specifier: 8.13.0 specifier: 8.13.0
version: 8.13.0 version: 8.13.0
@ -915,10 +915,10 @@ importers:
version: 7.37.0(@types/node@20.3.1) version: 7.37.0(@types/node@20.3.1)
'@swc/cli': '@swc/cli':
specifier: ^0.1.62 specifier: ^0.1.62
version: 0.1.62(@swc/core@1.3.82)(chokidar@3.5.3) version: 0.1.62(@swc/core@1.3.78)(chokidar@3.5.3)
'@swc/core': '@swc/core':
specifier: 1.3.82 specifier: 1.3.78
version: 1.3.82 version: 1.3.78
'@types/jest': '@types/jest':
specifier: ^27.4.0 specifier: ^27.4.0
version: 27.5.2 version: 27.5.2
@ -942,7 +942,7 @@ importers:
version: 27.1.5(@babel/core@7.22.20)(@types/jest@27.5.2)(jest@27.5.1)(typescript@5.1.3) version: 27.1.5(@babel/core@7.22.20)(@types/jest@27.5.2)(jest@27.5.1)(typescript@5.1.3)
ts-node: ts-node:
specifier: 10.4.0 specifier: 10.4.0
version: 10.4.0(@swc/core@1.3.82)(@types/node@20.3.1)(typescript@5.1.3) version: 10.4.0(@swc/core@1.3.78)(@types/node@20.3.1)(typescript@5.1.3)
tsd: tsd:
specifier: ^0.28.1 specifier: ^0.28.1
version: 0.28.1 version: 0.28.1
@ -1072,10 +1072,10 @@ importers:
devDependencies: devDependencies:
'@swc/cli': '@swc/cli':
specifier: ^0.1.62 specifier: ^0.1.62
version: 0.1.62(@swc/core@1.3.82)(chokidar@3.5.3) version: 0.1.62(@swc/core@1.3.78)(chokidar@3.5.3)
'@swc/core': '@swc/core':
specifier: 1.3.82 specifier: 1.3.78
version: 1.3.82 version: 1.3.78
'@swc/core-android-arm64': '@swc/core-android-arm64':
specifier: 1.3.11 specifier: 1.3.11
version: 1.3.11 version: 1.3.11
@ -1087,10 +1087,10 @@ importers:
version: 6.2.1 version: 6.2.1
swc-loader: swc-loader:
specifier: ^0.2.3 specifier: ^0.2.3
version: 0.2.3(@swc/core@1.3.82)(webpack@5.88.2) version: 0.2.3(@swc/core@1.3.78)(webpack@5.88.2)
webpack: webpack:
specifier: ^5.85.1 specifier: ^5.85.1
version: 5.88.2(@swc/core@1.3.82)(webpack-cli@5.1.4) version: 5.88.2(@swc/core@1.3.78)(webpack-cli@5.1.4)
webpack-cli: webpack-cli:
specifier: ^5.1.3 specifier: ^5.1.3
version: 5.1.4(webpack@5.88.2) version: 5.1.4(webpack@5.88.2)
@ -3280,7 +3280,7 @@ packages:
resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==}
dev: false dev: false
/@swc/cli@0.1.62(@swc/core@1.3.82)(chokidar@3.5.3): /@swc/cli@0.1.62(@swc/core@1.3.78)(chokidar@3.5.3):
resolution: {integrity: sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==} resolution: {integrity: sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==}
engines: {node: '>= 12.13'} engines: {node: '>= 12.13'}
hasBin: true hasBin: true
@ -3292,7 +3292,7 @@ packages:
optional: true optional: true
dependencies: dependencies:
'@mole-inc/bin-wrapper': 8.0.1 '@mole-inc/bin-wrapper': 8.0.1
'@swc/core': 1.3.82 '@swc/core': 1.3.78
chokidar: 3.5.3 chokidar: 3.5.3
commander: 7.2.0 commander: 7.2.0
fast-glob: 3.3.1 fast-glob: 3.3.1
@ -3309,88 +3309,88 @@ packages:
dependencies: dependencies:
'@swc/wasm': 1.2.130 '@swc/wasm': 1.2.130
/@swc/core-darwin-arm64@1.3.82: /@swc/core-darwin-arm64@1.3.78:
resolution: {integrity: sha512-JfsyDW34gVKD3uE0OUpUqYvAD3yseEaicnFP6pB292THtLJb0IKBBnK50vV/RzEJtc1bR3g1kNfxo2PeurZTrA==} resolution: {integrity: sha512-596KRua/d5Gx1buHKKchSyHuwoIL4S1BRD/wCvYNLNZ3xOzcuBBmXOjrDVigKi1ztNDeS07p30RO5UyYur0XAA==}
engines: {node: '>=10'} engines: {node: '>=10'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
optional: true optional: true
/@swc/core-darwin-x64@1.3.82: /@swc/core-darwin-x64@1.3.78:
resolution: {integrity: sha512-ogQWgNMq7qTpITjcP3dnzkFNj7bh6SwMr859GvtOTrE75H7L7jDWxESfH4f8foB/LGxBKiDNmxKhitCuAsZK4A==} resolution: {integrity: sha512-w0RsD1onQAj0vuLAoOVi48HgnW6D6oBEIZP17l0HYejCDBZ+FRZLjml7wgNAWMqHcd2qNRqgtZ+v7aLza2JtBQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
optional: true optional: true
/@swc/core-linux-arm-gnueabihf@1.3.82: /@swc/core-linux-arm-gnueabihf@1.3.78:
resolution: {integrity: sha512-7TMXG1lXlNhD0kUiEqs+YlGV4irAdBa2quuy+XI3oJf2fBK6dQfEq4xBy65B3khrorzQS3O0oDGQ+cmdpHExHA==} resolution: {integrity: sha512-v1CpRn+H6fha1WIqmdRvJM40pFdjUHrGfhf4Ygci72nlAU41l5XimN8Iwkm8FgIwf2wnv0lLzedSM4IHvpq/yA==}
engines: {node: '>=10'} engines: {node: '>=10'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
optional: true optional: true
/@swc/core-linux-arm64-gnu@1.3.82: /@swc/core-linux-arm64-gnu@1.3.78:
resolution: {integrity: sha512-26JkOujbzcItPAmIbD5vHJxQVy5ihcSu3YHTKwope1h28sApZdtE7S3e2G3gsZRTIdsCQkXUtAQeqHxGWWR3pw==} resolution: {integrity: sha512-Sis17dz9joJRFVvR/gteOZSUNrrrioo81RQzani0Zr5ZZOfWLMTB9DA+0MVlfnVa2taYcsJHJZFoAv9JkLwbzg==}
engines: {node: '>=10'} engines: {node: '>=10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
optional: true optional: true
/@swc/core-linux-arm64-musl@1.3.82: /@swc/core-linux-arm64-musl@1.3.78:
resolution: {integrity: sha512-8Izj9tuuMpoc3cqiPBRtwqpO1BZ/+sfZVsEhLxrbOFlcSb8LnKyMle1g3JMMUwI4EU75RGVIzZMn8A6GOKdJbA==} resolution: {integrity: sha512-E5F8/qp+QupnfBnsP4vN1PKyCmAHYHDG1GMyPE/zLFOUYLgw+jK4C9rfyLBR0o2bWo1ay2WCIjusBZD9XHGOSA==}
engines: {node: '>=10'} engines: {node: '>=10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
optional: true optional: true
/@swc/core-linux-x64-gnu@1.3.82: /@swc/core-linux-x64-gnu@1.3.78:
resolution: {integrity: sha512-0GSrIBScQwTaPv46T2qB7XnDYxndRCpwH4HMjh6FN+I+lfPUhTSJKW8AonqrqT1TbpFIgvzQs7EnTsD7AnSCow==} resolution: {integrity: sha512-iDxa+RknnTQlyy+WfPor1FM6y44ERNI2E0xiUV6gV6uPwegCngi8LFC+E7IvP6+p+yXtAkesunAaiZ8nn0s+rw==}
engines: {node: '>=10'} engines: {node: '>=10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
optional: true optional: true
/@swc/core-linux-x64-musl@1.3.82: /@swc/core-linux-x64-musl@1.3.78:
resolution: {integrity: sha512-KJUnaaepDKNzrEbwz4jv0iC3/t9x0NSoe06fnkAlhh2+NFKWKKJhVCOBTrpds8n7eylBDIXUlK34XQafjVMUdg==} resolution: {integrity: sha512-dWtIYUFL5sMTE2UKshkXTusHcK8+zAhhGzvqWq1wJS45pqTlrAbzpyqB780fle880x3A6DMitWmsAFARdNzpuQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
optional: true optional: true
/@swc/core-win32-arm64-msvc@1.3.82: /@swc/core-win32-arm64-msvc@1.3.78:
resolution: {integrity: sha512-TR3MHKhDYIyGyFcyl2d/p1ftceXcubAhX5wRSOdtOyr5+K/v3jbyCCqN7bbqO5o43wQVCwwR/drHleYyDZvg8Q==} resolution: {integrity: sha512-CXFaGEc2M9Su3UoUMC8AnzKb9g+GwPxXfakLWZsjwS448h6jcreExq3nwtBNdVGzQ26xqeVLMFfb1l/oK99Hwg==}
engines: {node: '>=10'} engines: {node: '>=10'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
optional: true optional: true
/@swc/core-win32-ia32-msvc@1.3.82: /@swc/core-win32-ia32-msvc@1.3.78:
resolution: {integrity: sha512-ZX4HzVVt6hs84YUg70UvyBJnBOIspmQQM0iXSzBvOikk3zRoN7BnDwQH4GScvevCEBuou60+i4I6d5kHLOfh8Q==} resolution: {integrity: sha512-FaH1jwWnJpWkdImpMoiZpMg9oy9UUyZwltzN7hFwjR48e3Li82cRFb+9PifIBHCUSBM+CrrsJXbHP213IMVAyw==}
engines: {node: '>=10'} engines: {node: '>=10'}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
optional: true optional: true
/@swc/core-win32-x64-msvc@1.3.82: /@swc/core-win32-x64-msvc@1.3.78:
resolution: {integrity: sha512-4mJMnex21kbQoaHeAmHnVwQN9/XAfPszJ6n9HI7SVH+aAHnbBIR0M59/b50/CJMjTj5niUGk7EwQ3nhVNOG32g==} resolution: {integrity: sha512-oYxa+tPdhlx1aH14AIoF6kvVjo49tEOW0drNqoEaVHufvgH0y43QU2Jum3b2+xXztmMRtzK2CSN3GPOAXDKKKg==}
engines: {node: '>=10'} engines: {node: '>=10'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
optional: true optional: true
/@swc/core@1.3.82: /@swc/core@1.3.78:
resolution: {integrity: sha512-jpC1a18HMH67018Ij2jh+hT7JBFu7ZKcQVfrZ8K6JuEY+kjXmbea07P9MbQUZbAe0FB+xi3CqEVCP73MebodJQ==} resolution: {integrity: sha512-y6DQP571v7fbUUY7nz5G4lNIRGofuO48K5pGhD9VnuOCTuptfooCdi8wnigIrIhM/M4zQ53m/YCMDCbOtDgEww==}
engines: {node: '>=10'} engines: {node: '>=10'}
requiresBuild: true requiresBuild: true
peerDependencies: peerDependencies:
@ -3398,22 +3398,17 @@ packages:
peerDependenciesMeta: peerDependenciesMeta:
'@swc/helpers': '@swc/helpers':
optional: true optional: true
dependencies:
'@swc/types': 0.1.4
optionalDependencies: optionalDependencies:
'@swc/core-darwin-arm64': 1.3.82 '@swc/core-darwin-arm64': 1.3.78
'@swc/core-darwin-x64': 1.3.82 '@swc/core-darwin-x64': 1.3.78
'@swc/core-linux-arm-gnueabihf': 1.3.82 '@swc/core-linux-arm-gnueabihf': 1.3.78
'@swc/core-linux-arm64-gnu': 1.3.82 '@swc/core-linux-arm64-gnu': 1.3.78
'@swc/core-linux-arm64-musl': 1.3.82 '@swc/core-linux-arm64-musl': 1.3.78
'@swc/core-linux-x64-gnu': 1.3.82 '@swc/core-linux-x64-gnu': 1.3.78
'@swc/core-linux-x64-musl': 1.3.82 '@swc/core-linux-x64-musl': 1.3.78
'@swc/core-win32-arm64-msvc': 1.3.82 '@swc/core-win32-arm64-msvc': 1.3.78
'@swc/core-win32-ia32-msvc': 1.3.82 '@swc/core-win32-ia32-msvc': 1.3.78
'@swc/core-win32-x64-msvc': 1.3.82 '@swc/core-win32-x64-msvc': 1.3.78
/@swc/types@0.1.4:
resolution: {integrity: sha512-z/G02d+59gyyUb7KYhKi9jOhicek6QD2oMaotUyG+lUkybpXoV49dY9bj7Ah5Q+y7knK2jU67UTX9FyfGzaxQg==}
/@swc/wasm@1.2.130: /@swc/wasm@1.2.130:
resolution: {integrity: sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==} resolution: {integrity: sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==}
@ -5003,7 +4998,7 @@ packages:
webpack: 5.x.x webpack: 5.x.x
webpack-cli: 5.x.x webpack-cli: 5.x.x
dependencies: dependencies:
webpack: 5.88.2(@swc/core@1.3.82)(webpack-cli@5.1.4) webpack: 5.88.2(@swc/core@1.3.78)(webpack-cli@5.1.4)
webpack-cli: 5.1.4(webpack@5.88.2) webpack-cli: 5.1.4(webpack@5.88.2)
dev: true dev: true
@ -5014,7 +5009,7 @@ packages:
webpack: 5.x.x webpack: 5.x.x
webpack-cli: 5.x.x webpack-cli: 5.x.x
dependencies: dependencies:
webpack: 5.88.2(@swc/core@1.3.82)(webpack-cli@5.1.4) webpack: 5.88.2(@swc/core@1.3.78)(webpack-cli@5.1.4)
webpack-cli: 5.1.4(webpack@5.88.2) webpack-cli: 5.1.4(webpack@5.88.2)
dev: true dev: true
@ -5029,7 +5024,7 @@ packages:
webpack-dev-server: webpack-dev-server:
optional: true optional: true
dependencies: dependencies:
webpack: 5.88.2(@swc/core@1.3.82)(webpack-cli@5.1.4) webpack: 5.88.2(@swc/core@1.3.78)(webpack-cli@5.1.4)
webpack-cli: 5.1.4(webpack@5.88.2) webpack-cli: 5.1.4(webpack@5.88.2)
dev: true dev: true
@ -11592,7 +11587,7 @@ packages:
pretty-format: 27.5.1 pretty-format: 27.5.1
slash: 3.0.0 slash: 3.0.0
strip-json-comments: 3.1.1 strip-json-comments: 3.1.1
ts-node: 10.4.0(@swc/core@1.3.82)(@types/node@20.3.1)(typescript@5.1.3) ts-node: 10.4.0(@swc/core@1.3.78)(@types/node@20.3.1)(typescript@5.1.3)
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
- canvas - canvas
@ -12555,7 +12550,7 @@ packages:
json5: 2.2.3 json5: 2.2.3
loader-utils: 2.0.4 loader-utils: 2.0.4
schema-utils: 3.3.0 schema-utils: 3.3.0
webpack: 5.88.2(@swc/core@1.3.82)(webpack-cli@5.1.4) webpack: 5.88.2(@swc/core@1.3.78)(webpack-cli@5.1.4)
dev: true dev: true
/json5@1.0.2: /json5@1.0.2:
@ -17111,14 +17106,14 @@ packages:
whet.extend: 0.9.9 whet.extend: 0.9.9
dev: true dev: true
/swc-loader@0.2.3(@swc/core@1.3.82)(webpack@5.88.2): /swc-loader@0.2.3(@swc/core@1.3.78)(webpack@5.88.2):
resolution: {integrity: sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==} resolution: {integrity: sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==}
peerDependencies: peerDependencies:
'@swc/core': ^1.2.147 '@swc/core': ^1.2.147
webpack: '>=2' webpack: '>=2'
dependencies: dependencies:
'@swc/core': 1.3.82 '@swc/core': 1.3.78
webpack: 5.88.2(@swc/core@1.3.82)(webpack-cli@5.1.4) webpack: 5.88.2(@swc/core@1.3.78)(webpack-cli@5.1.4)
dev: true dev: true
/swiper@10.2.0: /swiper@10.2.0:
@ -17254,7 +17249,7 @@ packages:
supports-hyperlinks: 2.3.0 supports-hyperlinks: 2.3.0
dev: true dev: true
/terser-webpack-plugin@5.3.9(@swc/core@1.3.82)(webpack@5.88.2): /terser-webpack-plugin@5.3.9(@swc/core@1.3.78)(webpack@5.88.2):
resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==}
engines: {node: '>= 10.13.0'} engines: {node: '>= 10.13.0'}
peerDependencies: peerDependencies:
@ -17271,12 +17266,12 @@ packages:
optional: true optional: true
dependencies: dependencies:
'@jridgewell/trace-mapping': 0.3.19 '@jridgewell/trace-mapping': 0.3.19
'@swc/core': 1.3.82 '@swc/core': 1.3.78
jest-worker: 27.5.1 jest-worker: 27.5.1
schema-utils: 3.3.0 schema-utils: 3.3.0
serialize-javascript: 6.0.1 serialize-javascript: 6.0.1
terser: 5.19.4 terser: 5.19.4
webpack: 5.88.2(@swc/core@1.3.82)(webpack-cli@5.1.4) webpack: 5.88.2(@swc/core@1.3.78)(webpack-cli@5.1.4)
dev: true dev: true
/terser@5.19.4: /terser@5.19.4:
@ -17623,10 +17618,10 @@ packages:
micromatch: 4.0.5 micromatch: 4.0.5
semver: 7.5.4 semver: 7.5.4
typescript: 5.1.6 typescript: 5.1.6
webpack: 5.88.2(@swc/core@1.3.82)(webpack-cli@5.1.4) webpack: 5.88.2(@swc/core@1.3.78)(webpack-cli@5.1.4)
dev: true dev: true
/ts-node@10.4.0(@swc/core@1.3.82)(@types/node@20.3.1)(typescript@5.1.3): /ts-node@10.4.0(@swc/core@1.3.78)(@types/node@20.3.1)(typescript@5.1.3):
resolution: {integrity: sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==} resolution: {integrity: sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -17641,7 +17636,7 @@ packages:
optional: true optional: true
dependencies: dependencies:
'@cspotcode/source-map-support': 0.7.0 '@cspotcode/source-map-support': 0.7.0
'@swc/core': 1.3.82 '@swc/core': 1.3.78
'@tsconfig/node10': 1.0.9 '@tsconfig/node10': 1.0.9
'@tsconfig/node12': 1.0.11 '@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3 '@tsconfig/node14': 1.0.3
@ -17657,7 +17652,7 @@ packages:
yn: 3.1.1 yn: 3.1.1
dev: true dev: true
/ts-node@10.9.1(@swc/core@1.3.82)(@types/node@18.11.18)(typescript@5.1.6): /ts-node@10.9.1(@swc/core@1.3.78)(@types/node@18.11.18)(typescript@5.1.6):
resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -17672,7 +17667,7 @@ packages:
optional: true optional: true
dependencies: dependencies:
'@cspotcode/source-map-support': 0.8.1 '@cspotcode/source-map-support': 0.8.1
'@swc/core': 1.3.82 '@swc/core': 1.3.78
'@tsconfig/node10': 1.0.9 '@tsconfig/node10': 1.0.9
'@tsconfig/node12': 1.0.11 '@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3 '@tsconfig/node14': 1.0.3
@ -17962,7 +17957,7 @@ packages:
pg: 8.11.3 pg: 8.11.3
reflect-metadata: 0.1.13 reflect-metadata: 0.1.13
sha.js: 2.4.11 sha.js: 2.4.11
ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@18.11.18)(typescript@5.1.6) ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@18.11.18)(typescript@5.1.6)
tslib: 2.6.2 tslib: 2.6.2
uuid: 9.0.0 uuid: 9.0.0
yargs: 17.7.2 yargs: 17.7.2
@ -18595,7 +18590,7 @@ packages:
import-local: 3.1.0 import-local: 3.1.0
interpret: 3.1.1 interpret: 3.1.1
rechoir: 0.8.0 rechoir: 0.8.0
webpack: 5.88.2(@swc/core@1.3.82)(webpack-cli@5.1.4) webpack: 5.88.2(@swc/core@1.3.78)(webpack-cli@5.1.4)
webpack-merge: 5.9.0 webpack-merge: 5.9.0
dev: true dev: true
@ -18612,7 +18607,7 @@ packages:
engines: {node: '>=10.13.0'} engines: {node: '>=10.13.0'}
dev: true dev: true
/webpack@5.88.2(@swc/core@1.3.82)(webpack-cli@5.1.4): /webpack@5.88.2(@swc/core@1.3.78)(webpack-cli@5.1.4):
resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==}
engines: {node: '>=10.13.0'} engines: {node: '>=10.13.0'}
hasBin: true hasBin: true
@ -18643,7 +18638,7 @@ packages:
neo-async: 2.6.2 neo-async: 2.6.2
schema-utils: 3.3.0 schema-utils: 3.3.0
tapable: 2.2.1 tapable: 2.2.1
terser-webpack-plugin: 5.3.9(@swc/core@1.3.82)(webpack@5.88.2) terser-webpack-plugin: 5.3.9(@swc/core@1.3.78)(webpack@5.88.2)
watchpack: 2.4.0 watchpack: 2.4.0
webpack-cli: 5.1.4(webpack@5.88.2) webpack-cli: 5.1.4(webpack@5.88.2)
webpack-sources: 3.2.3 webpack-sources: 3.2.3