Compare commits

..

28 Commits

Author SHA1 Message Date
syuilo 61dfdc2952 New translations ja-jp.yml (Korean) 2025-04-08 00:44:03 +09:00
syuilo 8161415534 New translations ja-jp.yml (Korean) 2025-04-07 23:15:44 +09:00
syuilo 9e733c66a2 New translations ja-jp.yml (Catalan) 2025-04-07 23:15:43 +09:00
syuilo 505842092a New translations ja-jp.yml (Chinese Traditional) 2025-04-07 22:13:08 +09:00
syuilo d8a16ea2d5 New translations ja-jp.yml (Korean) 2025-04-07 22:13:05 +09:00
syuilo 6496433d57 New translations ja-jp.yml (English) 2025-04-07 20:14:14 +09:00
syuilo ef492e7ba3 New translations ja-jp.yml (Chinese Traditional) 2025-04-07 20:14:13 +09:00
syuilo 30eebaa0f1 New translations ja-jp.yml (Chinese Simplified) 2025-04-07 20:14:11 +09:00
syuilo 23ca9da876 New translations ja-jp.yml (Korean) 2025-04-07 20:14:01 +09:00
syuilo 956becfb17 New translations ja-jp.yml (Italian) 2025-04-07 20:13:59 +09:00
syuilo 881aa9a0d5 New translations ja-jp.yml (German) 2025-04-07 20:13:55 +09:00
syuilo 20008bcd31 New translations ja-jp.yml (Catalan) 2025-04-07 20:13:52 +09:00
syuilo 6c27ab12eb
Update CHANGELOG.md 2025-04-07 17:30:44 +09:00
github-actions[bot] 1ca8d227df Bump version to 2025.4.0-rc.2 2025-04-07 08:17:46 +00:00
syuilo 154b89f07a 🎨 2025-04-07 17:16:08 +09:00
syuilo 3a8d015194 enhance(frontend): improve search index 2025-04-07 17:03:43 +09:00
syuilo fa52922331 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2025-04-07 16:39:08 +09:00
syuilo 5b0f594f15 fix(backend): 非ログインでタイムラインのストリームに接続した際、表示にログイン必須のノートが流れる場合がある問題を修正 2025-04-07 16:39:03 +09:00
syuilo 297d5e3001
New Crowdin updates (#15761)
* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Dutch)

* New translations ja-jp.yml (Dutch)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Catalan)
2025-04-07 16:31:28 +09:00
anatawa12 85a7b10fcd
refactor serach index generator code (#15772)
* refactor: flatten search index

* chore: use Function() to simplify parsing attribute

* chore: remove comment handling

* chore: simplify processing SearchLabel and SearchKeyword element

* chore: use SearchLabel in mutedUsers

* chore: small improvements

* chore: remove a fallback path and simplify the entire code

* fix: result path is not correct

* chore: inline function
2025-04-07 14:35:32 +09:00
syuilo 2349a5d20e 🎨
Fix #15753
2025-04-07 10:29:51 +09:00
syuilo 6ef5c8bb92 enhance(frontend): improve migration of old settings 2025-04-07 10:21:49 +09:00
zyoshoka 1ede45c8fb
fix(ci): fix Chromatic CI not being skipped for dependency update branches (#15766) 2025-04-07 09:55:18 +09:00
syuilo f9a3db2ac3 refactor(frontend): refactor styles 2025-04-05 19:49:29 +09:00
syuilo 1626e8038b Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2025-04-05 19:45:14 +09:00
syuilo f71843a7d3 refactor(frontend): refactor divider of panel style 2025-04-05 19:45:11 +09:00
zyoshoka 91416527c2
fix(ci): quote `branches-ignore` pattern in Storybook workflow (#15762) 2025-04-05 19:32:48 +09:00
anatawa12 e24d799c0a
chore: set ignorePatchFailures to false (#15763) 2025-04-05 19:32:35 +09:00
73 changed files with 637 additions and 1364 deletions

View File

@ -11,14 +11,15 @@ on:
# Storybook CI is checked on the "push" event of "develop" branch so it would cause a duplicate build.
# This is a waste of chromatic build quota, so we don't run storybook CI on pull requests targets master.
- master
# Neither Dependabot nor Renovate will change the actual behavior for components.
- dependabot/**
- renovate/**
jobs:
build:
# chromatic is not likely to be available for fork repositories, so we disable for fork repositories.
if: github.repository == 'misskey-dev/misskey'
# Chromatic is not likely to be available for fork repositories, so we disable for fork repositories.
# Neither Dependabot nor Renovate will change the actual behavior for components.
if: >-
github.repository == 'misskey-dev/misskey' &&
startsWith(github.ref, 'refs/heads/dependabot/') != true &&
startsWith(github.ref, 'refs/heads/renovate/') != true
runs-on: ubuntu-latest
env:

View File

@ -41,6 +41,7 @@
- 再度ログインすればサーバーのバックアップから設定データを復元可能です
- エクスポートした設定データを他のサーバーでインポートして適用すること(設定の持ち運び)が可能になりました
- 設定情報の移行は自動で行われますが、何らかの理由で失敗した場合、設定→その他→旧設定情報を移行 で再試行可能です
- 過去に作成されたバックアップデータとは現在互換性がありませんのでご注意ください
- Feat: 画面を重ねて表示するオプションを実装(実験的)
- 設定 → その他 → 実験的機能 → Enable stacking router view
- Enhance: プラグインの管理が強化されました

View File

@ -1341,6 +1341,8 @@ right: "Dreta"
bottom: "A baix "
top: "A dalt "
embed: "Incrustar"
settingsMigrating: "Estem fent la migració de la teva configuració. Si us plau espera un moment... (També pots fer la migració més tard i manualment anant a Preferències → Altres configuracions → Migrar configuració antiga)"
readonly: "Només lectura"
_chat:
noMessagesYet: "Encara no tens missatges "
newMessage: "Missatge nou"
@ -1370,6 +1372,7 @@ _chat:
muteThisRoom: "Silenciar aquesta sala"
deleteRoom: "Esborrar la sala"
chatNotAvailableForThisAccountOrServer: "El xat no està disponible per aquest servidor o aquest compte."
chatIsReadOnlyForThisAccountOrServer: "El xat és només de lectura en aquest servidor o compte. No es poden escriure nous missatges ni crear o unir-se a sales de xat."
chatNotAvailableInOtherAccount: "La funció de xat es troba desactivada al compte de l'altre usuari."
cannotChatWithTheUser: "No pots xatejar amb aquest usuari"
cannotChatWithTheUser_description: "El xat està desactivat o l'altra part encara no l'ha obert."
@ -1930,7 +1933,7 @@ _role:
canImportFollowing: "Autoritza la importació de seguidors"
canImportMuting: "Autoritza la importació de silenciats"
canImportUserLists: "Autoritza la importació de llistes d'usuaris "
canChat: "Pot xatejar"
chatAvailability: "Es permet xatejar"
_condition:
roleAssignedTo: "Assignat a rols manuals"
isLocal: "Usuari local"

View File

@ -1930,7 +1930,6 @@ _role:
canImportFollowing: "Importieren von Gefolgten zulassen"
canImportMuting: "Importieren von Stummgeschalteten zulassen"
canImportUserLists: "Importieren von Listen erlauben"
canChat: "Chatten erlauben"
_condition:
roleAssignedTo: "Manuellen Rollen zugewiesen"
isLocal: "Lokaler Benutzer"

View File

@ -1930,7 +1930,6 @@ _role:
canImportFollowing: "Allow importing following"
canImportMuting: "Allow importing muting"
canImportUserLists: "Allow importing lists"
canChat: "Allow Chat"
_condition:
roleAssignedTo: "Assigned to manual roles"
isLocal: "Local user"

4
locales/index.d.ts vendored
View File

@ -5382,6 +5382,10 @@ export interface Locale extends ILocale {
*
*/
"embed": string;
/**
* ... ( )
*/
"settingsMigrating": string;
"_chat": {
/**
*

View File

@ -1930,7 +1930,6 @@ _role:
canImportFollowing: "Può importare Following"
canImportMuting: "Può importare Silenziati"
canImportUserLists: "Può importare liste di Profili"
canChat: "Chat consentita"
_condition:
roleAssignedTo: "Assegnato a ruoli manualmente"
isLocal: "Profilo locale"

View File

@ -1341,6 +1341,7 @@ right: "右"
bottom: "下"
top: "上"
embed: "埋め込み"
settingsMigrating: "設定を移行しています。しばらくお待ちください... (後ほど、設定→その他→旧設定情報を移行 で手動で移行することもできます)"
_chat:
noMessagesYet: "まだメッセージはありません"

View File

@ -64,8 +64,8 @@ copyNoteId: "노트 ID 복사"
copyFileId: "파일 ID 복사"
copyFolderId: "폴더 ID 복사"
copyProfileUrl: "프로필 URL 복사"
searchUser: "사용자 검색"
searchThisUsersNotes: "사용자의 노트 검색"
searchUser: "유저 검색"
searchThisUsersNotes: "유저의 노트를 검색"
reply: "답글"
loadMore: "더 보기"
showMore: "더 보기"
@ -267,7 +267,7 @@ publishing: "배포 중"
notResponding: "응답 없음"
instanceFollowing: "서버의 팔로잉"
instanceFollowers: "서버의 팔로워"
instanceUsers: "서버의 사용자"
instanceUsers: "서버의 유저"
changePassword: "비밀번호 변경"
security: "보안"
retypedNotMatch: "입력이 일치하지 않습니다."
@ -385,12 +385,12 @@ disablingTimelinesInfo: "특정 타임라인을 비활성화하더라도 관리
registration: "등록"
invite: "초대"
driveCapacityPerLocalAccount: "로컬 유저 한 명당 드라이브 용량"
driveCapacityPerRemoteAccount: "원격 사용자별 드라이브 용량"
driveCapacityPerRemoteAccount: "리모트 유저별 드라이브 용량"
inMb: "메가바이트 단위"
bannerUrl: "배너 이미지 URL"
backgroundImageUrl: "배경 이미지 URL"
basicInfo: "기본 정보"
pinnedUsers: "고정한 사용자"
pinnedUsers: "고정한 유저"
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
pinnedPages: "고정한 페이지"
pinnedPagesDescription: "서버의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다."
@ -436,11 +436,11 @@ silence: "사일런스"
silenceConfirm: "이 계정을 사일런스로 설정하시겠습니까?"
unsilence: "사일런스 해제"
unsilenceConfirm: "이 계정의 사일런스를 해제하시겠습니까?"
popularUsers: "인기 사용자"
recentlyUpdatedUsers: "최근에 활동한 사용자"
recentlyRegisteredUsers: "최근에 가입한 사용자"
recentlyDiscoveredUsers: "최근에 발견한 사용자"
exploreUsersCount: "{count}명의 사용자가 있습니다"
popularUsers: "인기 유저"
recentlyUpdatedUsers: "최근에 활동한 유저"
recentlyRegisteredUsers: "최근에 가입한 유저"
recentlyDiscoveredUsers: "최근에 발견한 유저"
exploreUsersCount: "{count}명의 유저가 있습니다"
exploreFediverse: "연합우주를 탐색"
popularTags: "인기 태그"
userList: "리스트"
@ -508,7 +508,7 @@ strongPassword: "강한 비밀번호"
passwordMatched: "일치합니다"
passwordNotMatched: "일치하지 않습니다"
signinWith: "{x}로 로그인"
signinFailed: "로그인할 수 없습니다. 사용자 이름과 비밀번호를 확인해 주십시오."
signinFailed: "로그인할 수 없습니다. 유저 이름과 비밀번호를 확인해 주십시오."
or: "혹은"
language: "언어"
uiLanguage: "UI 표시 언어"
@ -607,7 +607,7 @@ uiInspectorDescription: "메모리에 있는 UI 컴포넌트의 인스턴트 목
output: "출력"
script: "스크립트"
disablePagesScript: "Pages 에서 AiScript 를 사용하지 않음"
updateRemoteUser: "원격 사용자 정보 갱신"
updateRemoteUser: "리모트 유저 정보 갱신"
unsetUserAvatar: "아바타 제거"
unsetUserAvatarConfirm: "아바타를 제거할까요?"
unsetUserBanner: "배너 제거"
@ -616,7 +616,7 @@ deleteAllFiles: "모든 파일 삭제"
deleteAllFilesConfirm: "모든 파일을 삭제하시겠습니까?"
removeAllFollowing: "모든 팔로잉 해제"
removeAllFollowingDescription: "{host} 서버의 모든 팔로잉을 해제합니다. 해당 서버가 더 이상 존재하지 않는 경우 등에 실행해 주세요."
userSuspended: "이 사용자는 정지되었습니다."
userSuspended: "이 유저는 정지되었습니다."
userSilenced: "이 계정은 사일런스된 상태입니다."
yourAccountSuspendedTitle: "계정이 정지되었습니다"
yourAccountSuspendedDescription: "이 계정은 서버의 이용 약관을 위반하거나, 기타 다른 이유로 인해 정지되었습니다. 자세한 사항은 관리자에게 문의해 주십시오. 계정을 새로 생성하지 마십시오."
@ -677,7 +677,7 @@ emailAddress: "메일 주소"
smtpConfig: "SMTP 서버 설정"
smtpHost: "호스트"
smtpPort: "포트"
smtpUser: "사용자 이름"
smtpUser: "유저 이름"
smtpPass: "비밀번호"
emptyToDisableSmtpAuth: "SMTP 인증을 사용하지 않으려면 공란으로 비워둡니다."
smtpSecure: "SMTP 연결에 Implicit SSL/TTS 사용"
@ -763,7 +763,7 @@ no: "아니오"
driveFilesCount: "드라이브에 있는 파일 수"
driveUsage: "드라이브 사용량"
noCrawle: "검색엔진의 인덱싱 거부"
noCrawleDescription: "검색엔진에 사용자 페이지, 노트, 페이지 등의 콘텐츠를 인덱싱되지 않게 합니다."
noCrawleDescription: "검색엔진에 유저 페이지, 노트, 페이지 등의 콘텐츠를 인덱싱되지 않게 합니다."
lockedAccountInfo: "팔로우를 승인으로 승인받더라도 노트의 공개 범위를 '팔로워'로 하지 않는 한 누구나 당신의 노트를 볼 수 있습니다."
alwaysMarkSensitive: "미디어를 항상 열람 주의로 설정"
loadRawImages: "첨부한 이미지의 썸네일을 원본화질로 표시"
@ -795,7 +795,7 @@ needReloadToApply: "변경 사항은 새로고침하면 적용됩니다."
showTitlebar: "타이틀 바를 표시하기"
clearCache: "캐시 비우기"
onlineUsersCount: "{n}명이 접속 중"
nUsers: "{n} 사용자"
nUsers: "{n} 유저"
nNotes: "{n} 노트"
sendErrorReports: "오류 보고서 보내기"
sendErrorReportsDescription: "이 설정을 활성화하면, 문제가 발생했을 때 오류에 대한 상세 정보를 Misskey에 보내어 더 나은 소프트웨어를 만드는 데에 도움을 줄 수 있습니다."
@ -841,7 +841,7 @@ addDescription: "설명 추가"
userPagePinTip: "각 노트의 메뉴에서 「프로필에 고정」을 선택하는 것으로, 여기에 노트를 표시해 둘 수 있어요."
notSpecifiedMentionWarning: "수신자가 선택되지 않은 멘션이 있어요"
info: "정보"
userInfo: "사용자 정보"
userInfo: "유저 정보"
unknown: "알 수 없음"
onlineStatus: "온라인 상태"
hideOnlineStatus: "온라인 상태 숨기기"
@ -857,7 +857,7 @@ switchAccount: "계정 바꾸기"
enabled: "활성화"
disabled: "비활성화"
quickAction: "빠른 동작"
user: "사용자"
user: "유저"
administration: "관리"
accounts: "계정"
switch: "전환"
@ -898,7 +898,7 @@ whatIsNew: "패치 정보 보기"
translate: "번역"
translatedFrom: "{x}에서 번역"
accountDeletionInProgress: "계정 삭제 작업을 진행하고 있습니다"
usernameInfo: "서버상에서 계정을 식별하기 위한 이름. 알파벳(a~z, A~Z), 숫자(0~9) 및 언더바(_)를 사용할 수 있습니다. 사용자명은 나중에 변경할 수 없습니다."
usernameInfo: "서버상에서 계정을 식별하기 위한 이름. 알파벳(a~z, A~Z), 숫자(0~9) 및 언더바(_)를 사용할 수 있습니다. 유저명은 나중에 변경할 수 없습니다."
aiChanMode: "아이 모드"
devMode: "개발자 모드"
keepCw: "CW 유지하기"
@ -1032,7 +1032,7 @@ correspondingSourceIsAvailable: "소스 코드는 {anchor}에서 받아보실
roles: "역할"
role: "역할"
noRole: "역할이 없습니다"
normalUser: "일반 사용자"
normalUser: "일반 유저"
undefined: "정의되지 않음"
assign: "할당"
unassign: "할당 취소"
@ -1106,7 +1106,7 @@ audio: "소리"
audioFiles: "소리"
dataSaver: "데이터 절약 모드"
accountMigration: "계정 이동"
accountMoved: "이 사용자는 다음 계정으로 이사했습니다:"
accountMoved: "이 유저는 다음 계정으로 이사했습니다:"
accountMovedShort: "이사한 계정입니다"
operationForbidden: "사용할 수 없습니다"
forceShowAds: "광고를 항상 표시"
@ -1127,8 +1127,8 @@ serverRules: "서버 규칙"
pleaseConfirmBelowBeforeSignup: "이 서버에 가입하기 전에 아래 사항을 확인하여 주십시오."
pleaseAgreeAllToContinue: "계속하시려면 모든 항목에 동의하십시오."
continue: "계속"
preservedUsernames: "예약한 사용자 이름"
preservedUsernamesDescription: "예약할 사용자명을 한 줄에 하나씩 입력합니다. 여기에서 지정한 사용자명으로는 계정을 생성할 수 없게 됩니다. 단, 관리자 권한으로 계정을 생성할 때에는 해당되지 않으며, 이미 존재하는 계정도 영향을 받지 않습니다."
preservedUsernames: "예약한 유저명"
preservedUsernamesDescription: "예약할 유저명을 한 줄에 하나씩 입력합니다. 여기에서 지정한 유저명으로는 계정을 생성할 수 없게 됩니다. 단, 관리자 권한으로 계정을 생성할 때에는 해당되지 않으며, 이미 존재하는 계정도 영향을 받지 않습니다."
createNoteFromTheFile: "이 파일로 노트를 작성"
archive: "아카이브"
archived: "아카이브 됨"
@ -1142,7 +1142,7 @@ youFollowing: "팔로잉"
preventAiLearning: "기계학습(생성형 AI)으로의 사용을 거부"
preventAiLearningDescription: "외부의 문장 생성 AI나 이미지 생성 AI에 대해 제출한 노트나 이미지 등의 콘텐츠를 학습의 대상으로 사용하지 않도록 요구합니다. 다만, 이 요구사항을 지킬 의무는 없기 때문에 학습을 완전히 방지하는 것은 아닙니다."
options: "옵션"
specifyUser: "사용자 지정"
specifyUser: "유저 지정"
lookupConfirm: "조회 할까요?"
openTagPageConfirm: "해시태그의 페이지를 열까요?"
specifyHost: "호스트 지정"
@ -1297,8 +1297,8 @@ passkeyVerificationSucceededButPasswordlessLoginDisabled: "입력된 패스키
messageToFollower: "팔로워에게 보낼 메시지"
target: "대상"
testCaptchaWarning: "CAPTCHA를 테스트하기 위한 기능입니다. <strong>실제 환경에서는 사용하지 마세요.</strong>"
prohibitedWordsForNameOfUser: "금지 단어 (사용자 이름)"
prohibitedWordsForNameOfUserDescription: "이 목록에 포함되는 키워드가 사용자 이름에 있는 경우, 일반 사용자는 이름을 바꿀 수 없습니다. 모더레이터 권한을 가진 사용자는 제한 대상에서 제외됩니다."
prohibitedWordsForNameOfUser: "금지 단어 (유저명)"
prohibitedWordsForNameOfUserDescription: "이 목록에 포함되는 키워드가 유저명에 있는 경우, 일반 유저는 이름을 바꿀 수 없습니다. 모더레이터 권한을 가진 유저는 제한 대상에서 제외됩니다."
yourNameContainsProhibitedWords: "바꾸려는 이름에 금지된 키워드가 포함되어 있습니다."
yourNameContainsProhibitedWordsDescription: "이름에 금지된 키워드가 있습니다. 이름을 사용해야 하는 경우, 서버 관리자에 문의하세요."
thisContentsAreMarkedAsSigninRequiredByAuthor: "게시자에 의해 로그인해야 볼 수 있도록 설정되어 있습니다."
@ -1341,15 +1341,17 @@ right: "오른쪽"
bottom: "아래"
top: "위"
embed: "임베드"
settingsMigrating: "설정을 이전하는 중입니다. 잠시 기다려주십시오... (나중에 '환경설정 → 기타 → 기존 설정 정보를 이전'에서 수동으로 이전할 수도 있습니다)"
readonly: "읽기 전용"
_chat:
noMessagesYet: "아직 메시지가 없습니다"
newMessage: "새로운 메시지"
individualChat: "개인 대화"
individualChat_description: "특정 사용자와 일대일 채팅을 할 수 있습니다."
individualChat_description: "특정 유저와 일대일 채팅을 할 수 있습니다."
roomChat: "룸 채팅"
roomChat_description: "여러 명이 함께 채팅할 수 있습니다.\n또한, 개인 채팅을 허용하지 않은 사용자와도 상대방이 수락하면 채팅을 할 수 있습니다."
roomChat_description: "여러 명이 함께 채팅할 수 있습니다.\n또한, 개인 채팅을 허용하지 않은 유저와도 상대방이 수락하면 채팅을 할 수 있습니다."
createRoom: "룸을 생성"
inviteUserToChat: "사용자를 초대하여 채팅을 시작하세요"
inviteUserToChat: "유저를 초대하여 채팅을 시작하세요"
yourRooms: "생성한 룸"
joiningRooms: "참가 중인 룸"
invitations: "초대"
@ -1357,7 +1359,7 @@ _chat:
history: "이력"
noHistory: "기록이 없습니다"
noRooms: "룸이 없습니다"
inviteUser: "사용자를 초대"
inviteUser: "유저를 초대"
sentInvitations: "초대를 보내기"
join: "참여"
ignore: "무시"
@ -1370,21 +1372,22 @@ _chat:
muteThisRoom: "이 룸을 뮤트"
deleteRoom: "룸을 삭제"
chatNotAvailableForThisAccountOrServer: "이 서버 또는 이 계정에서 채팅이 활성화되어 있지 않습니다."
chatIsReadOnlyForThisAccountOrServer: "이 서버 또는 이 계정에서 채팅은 읽기 전용입니다. 새로 쓰거나 채팅방을 만들거나 참가할 수 없습니다."
chatNotAvailableInOtherAccount: "상대방 계정에서 채팅 기능을 사용할 수 없는 상태입니다."
cannotChatWithTheUser: "이 사용자와 채팅을 시작할 수 없습니다"
cannotChatWithTheUser: "이 유저와 채팅을 시작할 수 없습니다"
cannotChatWithTheUser_description: "채팅을 사용할 수 없는 상태이거나 상대방이 채팅을 열지 않은 상태입니다."
chatWithThisUser: "채팅하기"
thisUserAllowsChatOnlyFromFollowers: "이 사용자는 팔로워만 채팅을 할 수 있습니다."
thisUserAllowsChatOnlyFromFollowing: "이 사용자는 이 사용자가 팔로우하는 사용자만 채팅을 허용합니다."
thisUserAllowsChatOnlyFromMutualFollowing: "이 사용자는 상호 팔로우하는 사용자만 채팅을 허용합니다."
thisUserNotAllowedChatAnyone: "이 사용자는 다른 사람의 채팅을 받지 않습니다."
thisUserAllowsChatOnlyFromFollowers: "이 유저는 팔로워만 채팅을 할 수 있습니다."
thisUserAllowsChatOnlyFromFollowing: "이 유저는 이 유저가 팔로우하는 유저만 채팅을 허용합니다."
thisUserAllowsChatOnlyFromMutualFollowing: "이 유저는 상호 팔로우하는 유저만 채팅을 허용합니다."
thisUserNotAllowedChatAnyone: "이 유저는 다른 사람의 채팅을 받지 않습니다."
chatAllowedUsers: "채팅을 허용한 상대"
chatAllowedUsers_note: "내가 채팅 메시지를 보낸 상대와는 이 설정과 상관없이 채팅이 가능합니다."
_chatAllowedUsers:
everyone: "누구나"
followers: "자신의 팔로워만"
following: "자신이 팔로우한 사용자만"
mutual: "상호 팔로우한 사용자만"
following: "자신이 팔로우한 유저만"
mutual: "상호 팔로우한 유저만"
none: "아무도 허락하지 않기"
_emojiPalette:
palettes: "팔레트"
@ -1410,7 +1413,7 @@ _settings:
soundsBanner: "클라이언트에서 재생할 소리에 대한 설정을 합니다."
timelineAndNote: "타임라인과 노트"
makeEveryTextElementsSelectable: "모든 텍스트 요소를 선택할 수 있도록 함"
makeEveryTextElementsSelectable_description: "활성화 시, 일부 동작에서 사용자의 접근성이 나빠질 수도 있습니다."
makeEveryTextElementsSelectable_description: "활성화 시, 일부 동작에서 유저의 접근성이 나빠질 수도 있습니다."
useStickyIcons: "아이콘이 스크롤을 따라가도록 하기"
showNavbarSubButtons: "내비게이션 바에 보조 버튼 표시"
ifOn: "켜져 있을 때"
@ -1436,12 +1439,12 @@ _accountSettings:
requireSigninToViewContents: "콘텐츠 열람을 위해 로그인을 필수로 설정하기"
requireSigninToViewContentsDescription1: "자신이 작성한 모든 노트 등의 콘텐츠를 보기 위해 로그인을 필수로 설정합니다. 크롤러가 정보 수집하는 것을 방지하는 효과를 기대할 수 있습니다."
requireSigninToViewContentsDescription2: "URL 미리보기(OGP), 웹페이지에 삽입, 노트 인용을 지원하지 않는 서버에서 볼 수 없게 됩니다."
requireSigninToViewContentsDescription3: "원격 서버에 연합된 콘텐츠에는 이러한 제한이 적용되지 않을 수 있습니다."
requireSigninToViewContentsDescription3: "리모트 서버에 연합된 콘텐츠에는 이러한 제한이 적용되지 않을 수 있습니다."
makeNotesFollowersOnlyBefore: "과거 노트는 팔로워만 볼 수 있도록 설정하기"
makeNotesFollowersOnlyBeforeDescription: "이 기능이 활성화되어 있는 동안, 설정된 날짜 및 시간보다 과거 또는 설정된 시간이 지난 노트는 팔로워만 볼 수 있게 됩니다. 비활성화하면 노트의 공개 상태도 원래대로 돌아갑니다."
makeNotesHiddenBefore: "과거 노트 비공개로 전환하기"
makeNotesHiddenBeforeDescription: "이 기능이 활성화되어 있는 동안 설정한 날짜 및 시간보다 과거 또는 설정한 시간이 지난 노트는 본인만 볼 수 있게(비공개로 전환) 됩니다. 비활성화하면 노트의 공개 상태도 원래대로 돌아갑니다."
mayNotEffectForFederatedNotes: "원격 서버에 연합된 노트에는 효과가 없을 수도 있습니다."
mayNotEffectForFederatedNotes: "리모트 서버에 연합된 노트에는 효과가 없을 수도 있습니다."
mayNotEffectSomeSituations: "여기서 설정하는 제한은 모더레이션이나 리모트 서버에서 볼 때 등 일부 환경에서는 적용되지 않을 수도 있습니다."
notesHavePassedSpecifiedPeriod: "지정한 시간이 경과된 노트"
notesOlderThanSpecifiedDateAndTime: "지정된 날짜 및 시간 이전의 노트"
@ -1482,11 +1485,11 @@ _announcement:
needConfirmationToRead: "읽음으로 표시하기 전에 확인하기"
needConfirmationToReadDescription: "활성화하면 이 공지사항을 읽음으로 표시하기 전에 확인 알림창을 띄웁니다. '모두 읽음'의 대상에서도 제외됩니다."
end: "공지에서 내리기"
tooManyActiveAnnouncementDescription: "공지사항이 너무 많을 경우, 사용자 경험에 영향을 끼칠 가능성이 있습니다. 오래된 공지사항은 아카이브하시는 것을 권장드립니다."
tooManyActiveAnnouncementDescription: "공지사항이 너무 많을 경우, 유저 경험에 영향을 끼칠 가능성이 있습니다. 오래된 공지사항은 아카이브하시는 것을 권장드립니다."
readConfirmTitle: "읽음으로 표시합니까?"
readConfirmText: "〈{title}〉의 내용을 읽음으로 표시합니다."
shouldNotBeUsedToPresentPermanentInfo: "신규 유저의 이용 경험에 악영향을 끼칠 수 있으므로, 일시적인 알림 수단으로만 사용하고 고정된 정보에는 사용을 지양하는 것을 추천합니다."
dialogAnnouncementUxWarn: "다이얼로그 형태의 알림이 동시에 2개 이상 존재하는 경우, 사용자 경험에 악영향을 끼칠 수 있으므로 신중히 결정하십시오."
dialogAnnouncementUxWarn: "다이얼로그 형태의 알림이 동시에 2개 이상 존재하는 경우, 유저 경험에 악영향을 끼칠 수 있으므로 신중히 결정하십시오."
silence: "조용히 알림"
silenceDescription: "활성화하면 공지사항에 대한 알림이 가지 않게 되며, 확인 버튼을 누를 필요가 없게 됩니다."
_initialAccountSetting:
@ -1728,40 +1731,40 @@ _achievements:
flavor: "냐냐냐냐냐냐아아아아앙!"
_following1:
title: "첫 팔로우"
description: "사용자를 처음으로 팔로우했습니다"
description: "유저를 처음으로 팔로우했습니다"
_following10:
title: "팔로우, 팔로우"
description: "10명의 사용자를 팔로우했습니다"
description: "10명의 유저를 팔로우했습니다"
_following50:
title: "친구 잔뜩"
description: "50명의 사용자를 팔로우했습니다"
description: "50명의 유저를 팔로우했습니다"
_following100:
title: "주소록 한 권으론 부족해"
description: "100명의 사용자를 팔로우했습니다"
description: "100명의 유저를 팔로우했습니다"
_following300:
title: "친구가 넘쳐나"
description: "300명의 사용자를 팔로우했습니다"
description: "300명의 유저를 팔로우했습니다"
_followers1:
title: "첫 팔로워"
description: "사용자가 처음으로 팔로잉했습니다"
description: "유저가 처음으로 팔로잉했습니다"
_followers10:
title: "팔로우 미!"
description: "10명의 사용자가 팔로우했습니다"
description: "10명의 유저가 팔로우했습니다"
_followers50:
title: "이곳저곳"
description: "50명의 사용자가 팔로우했습니다"
description: "50명의 유저가 팔로우했습니다"
_followers100:
title: "인기왕"
description: "100명의 사용자가 팔로우했습니다"
description: "100명의 유저가 팔로우했습니다"
_followers300:
title: "줄 좀 서봐요"
description: "100명의 사용자가 팔로우했습니다"
description: "100명의 유저가 팔로우했습니다"
_followers500:
title: "기지국"
description: "500명의 사용자가 팔로우했습니다"
description: "500명의 유저가 팔로우했습니다"
_followers1000:
title: "유명인사"
description: "1,000명의 사용자가 팔로우했습니다"
description: "1,000명의 유저가 팔로우했습니다"
_collectAchievements30:
title: "도전 과제 콜렉터"
description: "30개의 도전과제를 획득했습니다"
@ -1867,7 +1870,7 @@ _role:
permission: "역할 권한"
descriptionOfPermission: "<b>조정자</b>는 기본적인 조정 작업을 진행할 수 있습니다.\n<b>관리자</b>는 서버의 모든 설정을 변경할 수 있습니다."
assignTarget: "할당 대상"
descriptionOfAssignTarget: "<b>수동</b>을 선택하면 누가 이 역할에 포함되는지를 수동으로 관리할 수 있습니다.\n<b>조건부</b>를 선택하면 조건을 설정해 일치하는 사용자를 자동으로 포함되게 할 수 있습니다."
descriptionOfAssignTarget: "<b>수동</b>을 선택하면 누가 이 역할에 포함되는지를 수동으로 관리할 수 있습니다.\n<b>조건부</b>를 선택하면 조건을 설정해 일치하는 유저를 자동으로 포함되게 할 수 있습니다."
manual: "수동"
manualRoles: "수동 역할"
conditional: "조건부"
@ -1875,7 +1878,7 @@ _role:
condition: "조건"
isConditionalRole: "조건부 역할입니다."
isPublic: "역할 공개"
descriptionOfIsPublic: "역할에 할당된 사용자를 누구나 볼 수 있습니다. 또한 사용자 프로필에 이 역할이 표시됩니다."
descriptionOfIsPublic: "역할에 할당된 유저를 누구나 볼 수 있습니다. 또한 유저 프로필에 이 역할이 표시됩니다."
options: "옵션"
policies: "정책"
baseRole: "기본 역할"
@ -1888,10 +1891,10 @@ _role:
descriptionOfIsExplorable: "활성화하면 역할 타임라인을 공개합니다. 비활성화 시 타임라인이 공개되지 않습니다."
displayOrder: "표시 순서"
descriptionOfDisplayOrder: "값이 클 수록 UI에서 먼저 표시됩니다."
preserveAssignmentOnMoveAccount: "마이그레이션 대상 계정에도 할당 상태 전달"
preserveAssignmentOnMoveAccount_description: "켜면 이 역할이 부여된 계정이 마이그레이션될 때 마이그레이션 대상 계정에도 이 역할이 승계됩니다."
preserveAssignmentOnMoveAccount: "이전 대상 계정에도 할당 상태 전달"
preserveAssignmentOnMoveAccount_description: "켜면 이 역할이 부여된 계정이 이전될 때 마이그레이션 대상 계정에도 이 역할이 승계됩니다."
canEditMembersByModerator: "모더레이터의 역할 수정 허용"
descriptionOfCanEditMembersByModerator: "이 옵션을 켜면 모더레이터도 이 역할에 사용자를 할당하거나 삭제할 수 있습니다. 꺼져 있으면 관리자만 할당이 가능합니다."
descriptionOfCanEditMembersByModerator: "이 옵션을 켜면 모더레이터도 이 역할에 유저를 할당하거나 삭제할 수 있습니다. 꺼져 있으면 관리자만 할당이 가능합니다."
priority: "우선순위"
_priority:
low: "낮음"
@ -1917,8 +1920,8 @@ _role:
webhookMax: "만들 수 있는 Webhook 수"
clipMax: "만들 수 있는 클립 수"
noteEachClipsMax: "클립에 넣을 수 있는 노트 수"
userListMax: "만들 수 있는 사용자 리스트 수"
userEachUserListsMax: "사용자 리스트에 넣을 수 있는 사용자 수"
userListMax: "만들 수 있는 유저 리스트 수"
userEachUserListsMax: "유저 리스트에 넣을 수 있는 유저 수"
rateLimitFactor: "요청 빈도 제한"
descriptionOfRateLimitFactor: "작을수록 제한이 완화되고, 클수록 제한이 강화됩니다."
canHideAds: "광고 숨기기"
@ -1930,24 +1933,24 @@ _role:
canImportFollowing: "팔로우 가져오기 허용"
canImportMuting: "뮤트 목록 가져오기 허용"
canImportUserLists: "리스트 목록 가져오기 허용"
canChat: "채팅을 허락"
chatAvailability: "채팅을 허락"
_condition:
roleAssignedTo: "수동 역할에 이미 할당됨"
isLocal: "로컬 사용자"
isRemote: "원격 사용자"
isCat: "고양이 사용자"
isBot: "봇 사용자"
isSuspended: "정지된 사용자"
isLocked: "잠금 계정 사용자"
isExplorable: "‘계정을 쉽게 발견하도록 하기’를 활성화한 사용자"
isLocal: "로컬 유저"
isRemote: "리모트 유저"
isCat: "고양이 유저"
isBot: "봇 유저"
isSuspended: "정지된 유저"
isLocked: "잠금 계정 유저"
isExplorable: "‘계정을 쉽게 발견하도록 하기’를 활성화한 유저"
createdLessThan: "가입한 지 다음 일수 이내인 유저"
createdMoreThan: "가입한 지 다음 일수 이상인 유저"
followersLessThanOrEq: "팔로워 수가 다음 이하인 유저"
followersMoreThanOrEq: "팔로워 수가 다음보다 많은 사용자"
followersMoreThanOrEq: "팔로워 수가 다음보다 많은 유저"
followingLessThanOrEq: "팔로잉 수가 다음 이하인 유저"
followingMoreThanOrEq: "팔로잉 수가 다음보다 많은 사용자"
followingMoreThanOrEq: "팔로잉 수가 다음보다 많은 유저"
notesLessThanOrEq: "노트 수가 다음 이하인 유저"
notesMoreThanOrEq: "노트 수가 다음보다 많은 사용자"
notesMoreThanOrEq: "노트 수가 다음보다 많은 유저"
and: "다음을 모두 만족"
or: "다음을 하나라도 만족"
not: "다음을 만족하지 않음"
@ -1989,7 +1992,7 @@ _ad:
adsSettings: "광고 표시 설정"
notesPerOneAd: "실시간으로 갱신되는 타임라인에서 광고를 노출시키는 간격 (노트 당)"
setZeroToDisable: "0으로 지정하면 실시간 타임라인에서의 광고를 비활성화합니다"
adsTooClose: "광고의 표시 간격이 매우 작아, 사용자 경험에 부정적인 영향을 미칠 수 있습니다."
adsTooClose: "광고의 표시 간격이 매우 작아, 유저 경험에 부정적인 영향을 미칠 수 있습니다."
_forgotPassword:
enterEmail: "여기에 계정에 등록한 메일 주소를 입력해 주세요. 입력한 메일 주소로 비밀번호 재설정 링크를 발송합니다."
ifNoEmail: "메일 주소를 등록하지 않은 경우, 관리자에 문의해 주십시오."
@ -2244,7 +2247,7 @@ _permissions:
"write:pages": "페이지를 수정합니다"
"read:page-likes": "페이지의 좋아요를 확인합니다"
"write:page-likes": "페이지에 좋아요를 추가하거나 취소합니다"
"read:user-groups": "사용자 그룹 보기"
"read:user-groups": "유저 그룹 보기"
"write:user-groups": "유저 그룹을 만들거나, 초대하거나, 이름을 변경하거나, 양도하거나, 삭제합니다"
"read:channels": "채널을 보기"
"write:channels": "채널을 추가하거나 삭제합니다"
@ -2256,23 +2259,23 @@ _permissions:
"write:flash": "Play를 조작합니다"
"read:flash-likes": "Play의 좋아요를 봅니다"
"write:flash-likes": "Play의 좋아요를 조작합니다"
"read:admin:abuse-user-reports": "사용자 신고 보기"
"write:admin:delete-account": "사용자 계정 삭제하기"
"write:admin:delete-all-files-of-a-user": "모든 사용자 파일 삭제하기"
"read:admin:abuse-user-reports": "유저 신고 보기"
"write:admin:delete-account": "유저 계정 삭제하기"
"write:admin:delete-all-files-of-a-user": "모든 유저 파일 삭제하기"
"read:admin:index-stats": "데이터베이스 색인 정보 보기"
"read:admin:table-stats": "데이터베이스 테이블 정보 보기"
"read:admin:user-ips": "사용자 IP 주소 보기"
"read:admin:user-ips": "유저 IP 주소 보기"
"read:admin:meta": "인스턴스 메타데이터 보기"
"write:admin:reset-password": "사용자 비밀번호 재설정하기"
"write:admin:resolve-abuse-user-report": "사용자 신고 처리하기"
"write:admin:reset-password": "유저 비밀번호 재설정하기"
"write:admin:resolve-abuse-user-report": "유저 신고 처리하기"
"write:admin:send-email": "이메일 보내기"
"read:admin:server-info": "서버 정보 보기"
"read:admin:show-moderation-log": "조정 기록 보기"
"read:admin:show-user": "사용자 개인정보 보기"
"write:admin:suspend-user": "사용자 정지하기"
"write:admin:unset-user-avatar": "사용자 아바타 삭제하기"
"write:admin:unset-user-banner": "사용자 배너 삭제하기"
"write:admin:unsuspend-user": "사용자 정지 해제하기"
"read:admin:show-user": "유저 개인정보 보기"
"write:admin:suspend-user": "유저 정지하기"
"write:admin:unset-user-avatar": "유저 아바타 삭제하기"
"write:admin:unset-user-banner": "유저 배너 삭제하기"
"write:admin:unsuspend-user": "유저 정지 해제하기"
"write:admin:meta": "인스턴스 메타데이터 수정하기"
"write:admin:user-note": "조정 기록 수정하기"
"write:admin:roles": "역할 수정하기"
@ -2286,15 +2289,15 @@ _permissions:
"write:admin:avatar-decorations": "아바타 꾸미기 수정하기"
"read:admin:avatar-decorations": "아바타 꾸미기 보기"
"write:admin:federation": "연합 정보 수정하기"
"write:admin:account": "사용자 계정 수정하기"
"read:admin:account": "사용자 정보 보기"
"write:admin:account": "유저 계정 수정하기"
"read:admin:account": "유저 정보 보기"
"write:admin:emoji": "이모지 수정하기"
"read:admin:emoji": "이모지 보기"
"write:admin:queue": "작업 대기열 수정하기"
"read:admin:queue": "작업 대기열 정보 보기"
"write:admin:promo": "홍보 기록 수정하기"
"write:admin:drive": "사용자 드라이브 수정하기"
"read:admin:drive": "사용자 드라이브 정보 보기"
"write:admin:drive": "유저 드라이브 수정하기"
"read:admin:drive": "유저 드라이브 정보 보기"
"read:admin:stream": "관리자용 Websocket API 사용하기"
"write:admin:ad": "광고 수정하기"
"read:admin:ad": "광고 보기"
@ -2316,7 +2319,7 @@ _auth:
callback: "앱으로 돌아갑니다"
accepted: "접근 권한이 부여되었습니다."
denied: "접근이 거부되었습니다"
scopeUser: "다음 사용자로 활동하고 있습니다."
scopeUser: "다음 유저로 활동하고 있습니다."
pleaseLogin: "어플리케이션의 접근을 허가하려면 로그인하십시오."
byClickingYouWillBeRedirectedToThisUrl: "접근을 허용하면 자동으로 다음 URL로 이동합니다."
_antennaSources:
@ -2353,7 +2356,7 @@ _widgets:
postForm: "글 입력란"
slideshow: "슬라이드 쇼"
button: "버튼"
onlineUsers: "온라인 사용자"
onlineUsers: "온라인 유저"
jobQueue: "작업 대기열"
serverMetric: "서버 통계"
aiscript: "AiScript 콘솔"
@ -2363,7 +2366,7 @@ _widgets:
_userList:
chooseList: "리스트 선택"
clicker: "클리커"
birthdayFollowings: "오늘이 생일인 사용자"
birthdayFollowings: "오늘이 생일인 유저"
_cw:
hide: "숨기기"
show: "더 보기"
@ -2415,7 +2418,7 @@ _postForm:
f: "작성해주시길 기다리고 있어요..."
_profile:
name: "이름"
username: "사용자 이름"
username: "유저명"
description: "자기소개"
youCanIncludeHashtags: "해시 태그를 포함할 수 있습니다."
metadata: "추가 정보"
@ -2446,7 +2449,7 @@ _charts:
apRequest: "요청"
usersIncDec: "유저 수 증감"
usersTotal: "유저 수 합계"
activeUsers: "활동 사용자 수"
activeUsers: "활동 유저 수"
notesIncDec: "노트 수 증감"
localNotesIncDec: "로컬 노트 수 증감"
remoteNotesIncDec: "리모트 노트 수 증감"
@ -2457,8 +2460,8 @@ _charts:
storageUsageTotal: "스토리지 사용량 합계"
_instanceCharts:
requests: "요청"
users: "사용자 수 차이"
usersTotal: "누적 사용자 수"
users: "유저 수 차이"
usersTotal: "누적 유저 수"
notes: "노트 수 증감"
notesTotal: "누적 노트 수"
ff: "팔로잉/팔로워 증감"
@ -2572,18 +2575,18 @@ _notification:
createTokenDescription: "만약 기억이 나지 않는다면 '{text}'를 통해 액세스 토큰을 삭제해 주세요."
_types:
all: "전부"
note: "사용자의 새 글"
note: "유저의 새 글"
follow: "팔로잉"
mention: "멘션"
reply: "답글"
renote: "리노트"
quote: "인용"
reaction: "반응"
reaction: "리액션"
pollEnded: "투표가 종료됨"
receiveFollowRequest: "팔로우 요청을 받았을 때"
followRequestAccepted: "팔로우 요청이 승인되었을 때"
roleAssigned: "역할이 부여 됨"
chatRoomInvitationReceived: "채팅 룸에 초대받았습니다"
roleAssigned: "역할이 부여됨"
chatRoomInvitationReceived: "채팅 룸에 초대받"
achievementEarned: "도전 과제 획득"
exportCompleted: "추출을 성공함"
login: "로그인"
@ -2671,10 +2674,10 @@ _abuseReport:
mail: "이메일"
webhook: "Webhook"
_captions:
mail: "모더레이터 권한을 가진 사용자의 이메일 주소에 알림을 보냅니다 (신고를 받은 때에만)"
mail: "모더레이터 권한을 가진 유저의 이메일 주소에 알림을 보냅니다 (신고를 받은 때에만)"
webhook: "지정한 SystemWebhook에 알림을 보냅니다 (신고를 받은 때와 해결했을 때에 송신)"
keywords: "키워드"
notifiedUser: "알릴 사용자"
notifiedUser: "알릴 유저"
notifiedWebhook: "사용할 Webhook"
deleteConfirm: "수신자를 삭제하시겠습니까?"
_moderationLogTypes:
@ -2693,11 +2696,11 @@ _moderationLogTypes:
deleteDriveFile: "파일 삭제"
deleteNote: "노트 삭제"
createGlobalAnnouncement: "전역 공지사항 생성"
createUserAnnouncement: "사용자 공지사항 만들기"
createUserAnnouncement: "유저에게 공지사항 만들기"
updateGlobalAnnouncement: "모든 공지사항 수정"
updateUserAnnouncement: "사용자 공지사항 수정"
updateUserAnnouncement: "유저의 공지사항 수정"
deleteGlobalAnnouncement: "모든 공지사항 삭제"
deleteUserAnnouncement: "사용자 공지사항 삭제"
deleteUserAnnouncement: "유저의 공지사항 삭제"
resetPassword: "비밀번호 재설정"
suspendRemoteInstance: "리모트 서버를 정지"
unsuspendRemoteInstance: "리모트 서버의 정지를 해제"
@ -2939,7 +2942,7 @@ _embedCodeGen:
_selfXssPrevention:
warning: "경고"
title: "“이 화면에 뭔가를 붙여넣어라\"는 것은 모두 사기입니다."
description1: "여기에 무언가를 붙여넣으면 악의적인 사용자에게 계정을 탈취당하거나 개인정보를 도용당할 수 있습니다."
description1: "여기에 무언가를 붙여넣으면 악의적인 유저에게 계정을 탈취당하거나 개인정보를 도용당할 수 있습니다."
description2: "붙여 넣으려는 항목이 무엇인지 정확히 이해하지 못하는 경우, %c지금 바로 작업을 중단하고 이 창을 닫으십시오."
description3: "자세한 내용은 여기를 확인해 주세요. {link}"
_followRequest:
@ -2990,7 +2993,7 @@ _search:
searchScopeAll: "전체"
searchScopeLocal: "로컬"
searchScopeServer: "서버 지정"
searchScopeUser: "사용자 지정"
searchScopeUser: "유저 지정"
pleaseEnterServerHost: "서버의 호스트를 입력해 주세요."
pleaseSelectUser: "유저를 선택해주세요"
serverHostPlaceholder: "예: misskey.example.com"

View File

@ -1929,7 +1929,6 @@ _role:
canImportFollowing: "允许导入关注列表"
canImportMuting: "允许导入隐藏列表"
canImportUserLists: "允许导入用户列表"
canChat: "允许聊天"
_condition:
roleAssignedTo: "已分配给手动角色"
isLocal: "是本地用户"

View File

@ -1341,6 +1341,8 @@ right: "右"
bottom: "下"
top: "上"
embed: "嵌入"
settingsMigrating: "正在移轉設定。請稍候……(之後也可以到「設定 → 其他 → 舊設定資訊移轉」中手動進行移轉)"
readonly: "唯讀"
_chat:
noMessagesYet: "尚無訊息"
newMessage: "新訊息"
@ -1370,6 +1372,7 @@ _chat:
muteThisRoom: "此聊天室已靜音"
deleteRoom: "刪除聊天室"
chatNotAvailableForThisAccountOrServer: "這個伺服器或這個帳號的聊天功能尚未啟用。"
chatIsReadOnlyForThisAccountOrServer: "在此伺服器或此帳戶上的聊天是唯讀的。您無法發布新訊息、建立或加入聊天室。"
chatNotAvailableInOtherAccount: "對方的帳號無法使用聊天功能。"
cannotChatWithTheUser: "無法與此使用者聊天"
cannotChatWithTheUser_description: "聊天功能目前無法使用,或對方尚未開放聊天功能。"
@ -1435,7 +1438,7 @@ _preferencesBackup:
_accountSettings:
requireSigninToViewContents: "須登入以顯示內容"
requireSigninToViewContentsDescription1: "必須登入才會顯示您建立的貼文等內容。可望有效防止資訊被爬蟲蒐集。"
requireSigninToViewContentsDescription2: "來自不支援 URL 預覽 (OGP)、 網頁嵌入和引用貼文的伺服器,也將停止顯示。"
requireSigninToViewContentsDescription2: "針對您貼文的 URL 預覽 (OGP) 與網頁嵌入功能將會無法使用。而不支援引用貼文的伺服器,也將停止顯示。"
requireSigninToViewContentsDescription3: "這些限制可能不適用於被聯邦發送至遠端伺服器的內容。"
makeNotesFollowersOnlyBefore: "讓過去的貼文僅對追隨者顯示"
makeNotesFollowersOnlyBeforeDescription: "啟用此功能後,超過設定的日期和時間或超過設定時間的貼文將僅對追隨者顯示。 如果您再次停用它,貼文的公開狀態也會恢復原狀。"
@ -1930,7 +1933,7 @@ _role:
canImportFollowing: "允許匯入追隨名單"
canImportMuting: "允許匯入靜音名單"
canImportUserLists: "允許匯入清單"
canChat: "允許聊天"
chatAvailability: "允許聊天"
_condition:
roleAssignedTo: "手動指派角色完成"
isLocal: "本地使用者"

View File

@ -1,6 +1,6 @@
{
"name": "misskey",
"version": "2025.4.0-rc.1",
"version": "2025.4.0-rc.2",
"codename": "nasubi",
"repository": {
"type": "git",

View File

@ -51,6 +51,8 @@ class GlobalTimelineChannel extends Channel {
if (note.visibility !== 'public') return;
if (note.channelId != null) return;
if (note.user.requireSigninToViewContents && this.user == null) return;
if (note.renote && note.renote.user.requireSigninToViewContents && this.user == null) return;
if (note.reply && note.reply.user.requireSigninToViewContents && this.user == null) return;
if (isRenotePacked(note) && !isQuotePacked(note) && !this.withRenotes) return;

View File

@ -54,6 +54,8 @@ class LocalTimelineChannel extends Channel {
if (note.visibility !== 'public') return;
if (note.channelId != null) return;
if (note.user.requireSigninToViewContents && this.user == null) return;
if (note.renote && note.renote.user.requireSigninToViewContents && this.user == null) return;
if (note.reply && note.reply.user.requireSigninToViewContents && this.user == null) return;
// 関係ない返信は除外
if (note.reply && this.user && !this.following[note.userId]?.withReplies && !this.withReplies) {

View File

@ -15,8 +15,6 @@
focus: ':alpha<0.3<@accent',
bg: '#000',
fg: '#dadada',
fgTransparentWeak: ':alpha<0.75<@fg',
fgTransparent: ':alpha<0.5<@fg',
fgHighlighted: ':lighten<3<@fg',
fgOnAccent: '#fff',
fgOnWhite: '#333',
@ -26,7 +24,6 @@
panelHighlight: ':lighten<3<@panel',
panelHeaderBg: ':lighten<3<@panel',
panelHeaderFg: '@fg',
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
panelBorder: '" solid 1px var(--MI_THEME-divider)',
windowHeader: ':alpha<0.85<@panel',
popup: ':lighten<3<@panel',

View File

@ -15,8 +15,6 @@
focus: ':alpha<0.3<@accent',
bg: '#fff',
fg: '#5f5f5f',
fgTransparentWeak: ':alpha<0.75<@fg',
fgTransparent: ':alpha<0.5<@fg',
fgHighlighted: ':darken<3<@fg',
fgOnAccent: '#fff',
fgOnWhite: '#333',
@ -26,7 +24,6 @@
panelHighlight: ':darken<3<@panel',
panelHeaderBg: ':lighten<3<@panel',
panelHeaderFg: '@fg',
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
panelBorder: '" solid 1px var(--MI_THEME-divider)',
windowHeader: ':alpha<0.85<@panel',
popup: ':lighten<3<@panel',

View File

@ -46,7 +46,6 @@
fgOnWhite: '@accent',
panelHighlight: ':lighten<3<@panel',
scrollbarHandle: 'rgba(255, 255, 255, 0.2)',
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',
},
}

View File

@ -14,7 +14,6 @@
fgOnWhite: '@accent',
divider: 'rgba(255, 255, 255, 0.14)',
panel: 'rgb(47, 47, 44)',
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
header: ':alpha<0.7<@panel',
navBg: '#363636',
renote: '@accent',

View File

@ -14,7 +14,6 @@
fgOnWhite: '@accent',
divider: 'rgba(255, 255, 255, 0.14)',
panel: '#2d2d2d',
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
header: ':alpha<0.7<@panel',
navBg: '#363636',
renote: '@accent',

View File

@ -15,7 +15,6 @@
fgOnWhite: '@accent',
divider: 'rgba(255, 255, 255, 0.1)',
panel: '#18181c',
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
renote: '@accent',
mention: '#f2c97d',
mentionMe: '@accent',

View File

@ -15,7 +15,6 @@
fgOnWhite: '@accent',
divider: '#e7fffb24',
panel: '#192320',
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
popup: '#293330',
renote: '@accent',
mentionMe: '#ffaa00',

View File

@ -15,7 +15,6 @@
fgOnWhite: '@accent',
divider: '#e7fffb24',
panel: '#192320',
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
popup: '#293330',
renote: '@accent',
mentionMe: '#b4e900',

View File

@ -49,7 +49,6 @@
navIndicator: '@indicator',
driveFolderBg: ':alpha<0.3<@accent',
fgHighlighted: ':lighten<3<@fg',
fgTransparent: ':alpha<0.5<@fg',
panelHeaderBg: ':lighten<3<@panel',
panelHeaderFg: '@fg',
buttonGradateA: '@accent',
@ -58,8 +57,6 @@
panelHighlight: ':lighten<3<@panel',
scrollbarHandle: 'rgba(255, 255, 255, 0.2)',
inputBorderHover: 'rgba(255, 255, 255, 0.2)',
fgTransparentWeak: ':alpha<0.75<@fg',
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',
deckBg: '#142022',
},

View File

@ -15,7 +15,6 @@
divider: '#cfcfcf',
panel: '#ebe7e5',
panelHeaderBg: '@panel',
panelHeaderDivider: '@divider',
header: ':alpha<0.7<@panel',
navBg: '#ebe7e5',
renote: '#229e92',

View File

@ -15,7 +15,6 @@
header: ':alpha<0.7<@panel',
navBg: '#fff',
panel: '#fff',
panelHeaderDivider: '@divider',
mentionMe: 'rgb(0, 179, 70)',
},
}

View File

@ -13,7 +13,6 @@
fgOnWhite: '@accent',
panel: '#fff',
divider: 'rgb(230 233 234)',
panelHeaderDivider: '@divider',
renote: '@accent',
link: '@accent',
mention: '@accent',

View File

@ -51,7 +51,6 @@
buttonHoverBg: '#0000001a',
driveFolderBg: ':alpha<0.3<@accent',
fgHighlighted: ':lighten<3<@fg',
fgTransparent: ':alpha<0.5<@fg',
panelHeaderBg: ':lighten<3<@panel',
panelHeaderFg: '@fg',
buttonGradateA: '@accent',
@ -60,8 +59,6 @@
panelHighlight: ':lighten<3<@panel',
scrollbarHandle: '#74747433',
inputBorderHover: 'rgba(255, 255, 255, 0.2)',
fgTransparentWeak: ':alpha<0.75<@fg',
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',
},
}

View File

@ -41,15 +41,12 @@
navIndicator: '@accent',
driveFolderBg: ':alpha<0.3<@accent',
fgHighlighted: ':darken<3<@fg',
fgTransparent: ':alpha<0.5<@fg',
fgOnWhite: '@accent',
panelHeaderBg: ':lighten<3<@panel',
panelHeaderFg: '@fg',
htmlThemeColor: '@bg',
panelHighlight: ':darken<3<@panel',
scrollbarHandle: 'rgba(0, 0, 0, 0.2)',
fgTransparentWeak: ':alpha<0.75<@fg',
panelHeaderDivider: '@divider',
scrollbarHandleHover: 'rgba(0, 0, 0, 0.4)',
},
}

File diff suppressed because it is too large Load Diff

View File

@ -140,7 +140,7 @@ watch(v, newValue => {
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View File

@ -60,7 +60,7 @@ const onInput = () => {
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View File

@ -181,11 +181,16 @@ onUnmounted(() => {
left: 0;
color: var(--MI_THEME-panelHeaderFg);
background: var(--MI_THEME-panelHeaderBg);
border-bottom: solid 0.5px var(--MI_THEME-panelHeaderDivider);
z-index: 2;
line-height: 1.4em;
}
@container style(--MI_THEME-panelHeaderBg: var(--MI_THEME-panel)) {
.header {
box-shadow: 0 0.5px 0 0 light-dark(#0002, #fff2);
}
}
.title {
margin: 0;
padding: 12px 16px;

View File

@ -175,7 +175,7 @@ onMounted(() => {
}
.headerLower {
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
font-size: .85em;
padding-left: 4px;
}
@ -209,13 +209,13 @@ onMounted(() => {
}
.headerTextSub {
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
font-size: .85em;
}
.headerRight {
margin-left: auto;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
white-space: nowrap;
}

View File

@ -201,7 +201,7 @@ defineExpose({
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View File

@ -28,6 +28,7 @@ SPDX-License-Identifier: AGPL-3.0-only
[$style.t_exportCompleted]: notification.type === 'exportCompleted',
[$style.t_login]: notification.type === 'login',
[$style.t_createToken]: notification.type === 'createToken',
[$style.t_chatRoomInvitationReceived]: notification.type === 'chatRoomInvitationReceived',
[$style.t_roleAssigned]: notification.type === 'roleAssigned' && notification.role.iconUrl == null,
}]"
>
@ -374,6 +375,12 @@ function getActualReactedUsersCount(notification: Misskey.entities.Notification)
pointer-events: none;
}
.t_chatRoomInvitationReceived {
padding: 3px;
background: var(--eventOther);
pointer-events: none;
}
.tail {
flex: 1;
min-width: 0;

View File

@ -78,7 +78,7 @@ export default defineComponent({
> .caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View File

@ -213,7 +213,7 @@ function onMousedown(ev: MouseEvent | TouchEvent) {
> .caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View File

@ -268,7 +268,7 @@ function show() {
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View File

@ -93,11 +93,11 @@ export type SuperMenuDef = {
</script>
<script lang="ts" setup>
import { useTemplateRef, ref, watch, nextTick } from 'vue';
import { useTemplateRef, ref, watch, nextTick, computed } from 'vue';
import { getScrollContainer } from '@@/js/scroll.js';
import type { SearchIndexItem } from '@/utility/settings-search-index.js';
import MkInput from '@/components/MkInput.vue';
import { i18n } from '@/i18n.js';
import { getScrollContainer } from '@@/js/scroll.js';
import { useRouter } from '@/router.js';
import { initIntlString, compareStringIncludes } from '@/utility/intl-string.js';
@ -124,6 +124,7 @@ const searchResult = ref<{
isRoot: boolean;
parentLabels: string[];
}[]>([]);
const searchIndexItemByIdComputed = computed(() => props.searchIndex && new Map<string, SearchIndexItem>(props.searchIndex.map(i => [i.id, i])));
watch(searchQuery, (value) => {
rawSearchQuery.value = value;
@ -137,32 +138,41 @@ watch(rawSearchQuery, (value) => {
return;
}
const dive = (items: SearchIndexItem[], parents: SearchIndexItem[] = []) => {
for (const item of items) {
const matched = (
compareStringIncludes(item.label, value) ||
item.keywords.some((x) => compareStringIncludes(x, value))
);
const searchIndexItemById = searchIndexItemByIdComputed.value;
if (searchIndexItemById != null) {
const addSearchResult = (item: SearchIndexItem) => {
let path: string | undefined = item.path;
let icon: string | undefined = item.icon;
const parentLabels: string[] = [];
for (let current = searchIndexItemById.get(item.parentId ?? '');
current != null;
current = searchIndexItemById.get(current.parentId ?? '')) {
path ??= current.path;
icon ??= current.icon;
parentLabels.push(current.label);
}
if (_DEV_ && path == null) throw new Error('path is null for ' + item.id);
if (matched) {
searchResult.value.push({
id: item.id,
path: item.path ?? parents.find((x) => x.path != null)?.path ?? '/', // never gets `/`
path: path ?? '/', // never gets `/`
label: item.label,
parentLabels: parents.map((x) => x.label).toReversed(),
icon: item.icon ?? parents.find((x) => x.icon != null)?.icon,
isRoot: parents.length === 0,
parentLabels: parentLabels.toReversed(),
icon,
isRoot: item.parentId == null,
});
}
if (item.children) {
dive(item.children, [item, ...parents]);
}
}
};
if (props.searchIndex) {
dive(props.searchIndex);
for (const item of searchIndexItemById.values()) {
if (
compareStringIncludes(item.label, value) ||
item.keywords.some((x) => compareStringIncludes(x, value))
) {
addSearchResult(item);
}
}
}
});

View File

@ -100,7 +100,7 @@ const toggle = () => {
.caption {
margin: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
font-size: 0.85em;
&:empty {

View File

@ -307,6 +307,6 @@ onMounted(async () => {
.description {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View File

@ -160,7 +160,7 @@ onUnmounted(() => {
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View File

@ -220,7 +220,7 @@ onMounted(() => {
.statusItemLabel {
font-size: 0.7em;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
.menu {

View File

@ -181,7 +181,7 @@ function showMenu(ev: MouseEvent) {
}
.statsItemLabel {
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
font-size: 0.9em;
}

View File

@ -22,7 +22,7 @@ const modal = useTemplateRef('modal');
const props = defineProps<{
success: boolean;
showing: boolean;
text?: string;
text?: string | null;
}>();
const emit = defineEmits<{

View File

@ -70,7 +70,7 @@ const props = defineProps<{
margin-right: 0.75em;
flex-shrink: 0;
text-align: center;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View File

@ -49,7 +49,7 @@ defineProps<{
.description {
font-size: 0.85em;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
margin: 0 0 8px 0;
}
</style>

View File

@ -35,7 +35,7 @@ function focus() {
.caption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
&:empty {
display: none;

View File

@ -0,0 +1,14 @@
<!--
SPDX-FileCopyrightText: syuilo and misskey-project
SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<slot></slot>
</template>
<script lang="ts" setup>
</script>
<style lang="scss" module>
</style>

View File

@ -30,6 +30,7 @@ import PageWithAnimBg from './global/PageWithAnimBg.vue';
import SearchMarker from './global/SearchMarker.vue';
import SearchLabel from './global/SearchLabel.vue';
import SearchKeyword from './global/SearchKeyword.vue';
import SearchIcon from './global/SearchIcon.vue';
import type { App } from 'vue';
@ -67,6 +68,7 @@ export const components = {
SearchMarker: SearchMarker,
SearchLabel: SearchLabel,
SearchKeyword: SearchKeyword,
SearchIcon: SearchIcon,
};
declare module '@vue/runtime-core' {
@ -98,5 +100,6 @@ declare module '@vue/runtime-core' {
SearchMarker: typeof SearchMarker;
SearchLabel: typeof SearchLabel;
SearchKeyword: typeof SearchKeyword;
SearchIcon: typeof SearchIcon;
}
}

View File

@ -547,12 +547,13 @@ export function success(): Promise<void> {
});
}
export function waiting(): Promise<void> {
export function waiting(text?: string | null): Promise<void> {
return new Promise(resolve => {
const showing = ref(true);
const { dispose } = popup(MkWaitingDialog, {
success: false,
showing: showing,
text,
}, {
done: () => resolve(),
closed: () => dispose(),

View File

@ -662,7 +662,7 @@ definePage(() => ({
.roleItemSub {
padding: 6px 12px;
font-size: 85%;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
.roleUnassign {

View File

@ -184,7 +184,7 @@ definePage(() => ({
.userItemSub {
padding: 6px 12px;
font-size: 85%;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
.userItemMainBody {

View File

@ -400,6 +400,6 @@ definePage(() => ({
<style lang="scss" module>
.subCaption {
font-size: 0.85em;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View File

@ -75,6 +75,6 @@ function onDeleteClick() {
margin-right: 0.75em;
flex-shrink: 0;
text-align: center;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View File

@ -247,7 +247,7 @@ definePage(() => ({
}
.uiInspectorUnShown {
color: var(--MI_THEME-fgTransparent);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.5);
}
.uiInspectorType {

View File

@ -333,7 +333,7 @@ async function search() {
width: 100%;
height: 100%;
padding: 12px;
border: 2px dashed var(--MI_THEME-fgTransparent);
border: 2px dashed color(from var(--MI_THEME-fg) srgb r g b / 0.5);
}
.userSelectButtonInner {

View File

@ -161,6 +161,6 @@ function del(ev: MouseEvent) {
.editorCaption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View File

@ -246,6 +246,6 @@ definePage(() => ({
.editorCaption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View File

@ -62,12 +62,11 @@ SPDX-License-Identifier: AGPL-3.0-only
</SearchMarker>
<SearchMarker
:label="`${i18n.ts.mutedUsers} (${ i18n.ts.renote })`"
:keywords="['renote', 'mute', 'hide', 'user']"
>
<MkFolder>
<template #icon><i class="ti ti-repeat-off"></i></template>
<template #label>{{ i18n.ts.mutedUsers }} ({{ i18n.ts.renote }})</template>
<template #label><SearchLabel>{{ i18n.ts.mutedUsers }} ({{ i18n.ts.renote }})</SearchLabel></template>
<MkPagination :pagination="renoteMutingPagination">
<template #empty>
@ -308,7 +307,7 @@ definePage(() => ({
.userItemSub {
padding: 6px 12px;
font-size: 85%;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
.userItemMainBody {

View File

@ -19,7 +19,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div class="_gaps_s">
<SearchMarker :keywords="['account', 'info']">
<MkFolder>
<template #icon><i class="ti ti-info-circle"></i></template>
<template #icon><SearchIcon><i class="ti ti-info-circle"></i></SearchIcon></template>
<template #label><SearchLabel>{{ i18n.ts.accountInfo }}</SearchLabel></template>
<div class="_gaps_m">
@ -49,7 +49,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['roles']">
<MkFolder>
<template #icon><i class="ti ti-badges"></i></template>
<template #icon><SearchIcon><i class="ti ti-badges"></i></SearchIcon></template>
<template #label><SearchLabel>{{ i18n.ts.rolesAssignedToMe }}</SearchLabel></template>
<MkRolePreview v-for="role in $i.roles" :key="role.id" :role="role" :forModeration="false"/>
@ -58,7 +58,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['account', 'move', 'migration']">
<MkFolder>
<template #icon><i class="ti ti-plane"></i></template>
<template #icon><SearchIcon><i class="ti ti-plane"></i></SearchIcon></template>
<template #label><SearchLabel>{{ i18n.ts.accountMigration }}</SearchLabel></template>
<XMigration/>
@ -67,7 +67,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['account', 'close', 'delete']">
<MkFolder>
<template #icon><i class="ti ti-alert-triangle"></i></template>
<template #icon><SearchIcon><i class="ti ti-alert-triangle"></i></SearchIcon></template>
<template #label><SearchLabel>{{ i18n.ts.closeAccount }}</SearchLabel></template>
<div class="_gaps_m">
@ -81,7 +81,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['experimental', 'feature', 'flags']">
<MkFolder>
<template #icon><i class="ti ti-flask"></i></template>
<template #icon><SearchIcon><i class="ti ti-flask"></i></SearchIcon></template>
<template #label><SearchLabel>{{ i18n.ts.experimentalFeatures }}</SearchLabel></template>
<div class="_gaps_m">
@ -100,7 +100,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['developer', 'mode', 'debug']">
<MkFolder>
<template #icon><i class="ti ti-code"></i></template>
<template #icon><SearchIcon><i class="ti ti-code"></i></SearchIcon></template>
<template #label><SearchLabel>{{ i18n.ts.developer }}</SearchLabel></template>
<div class="_gaps_m">
@ -185,7 +185,6 @@ async function deleteAccount() {
}
function migrate() {
os.waiting();
migrateOldSettings();
}

View File

@ -14,7 +14,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['general']">
<MkFolder>
<template #label><SearchLabel>{{ i18n.ts.general }}</SearchLabel></template>
<template #icon><i class="ti ti-settings"></i></template>
<template #icon><SearchIcon><i class="ti ti-settings"></i></SearchIcon></template>
<div class="_gaps_m">
<SearchMarker :keywords="['language']">
@ -111,7 +111,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['timeline', 'note']">
<MkFolder>
<template #label><SearchLabel>{{ i18n.ts._settings.timelineAndNote }}</SearchLabel></template>
<template #icon><i class="ti ti-notes"></i></template>
<template #icon><SearchIcon><i class="ti ti-notes"></i></SearchIcon></template>
<div class="_gaps_m">
<div class="_gaps_s">
@ -279,7 +279,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['post', 'form']">
<MkFolder>
<template #label><SearchLabel>{{ i18n.ts.postForm }}</SearchLabel></template>
<template #icon><i class="ti ti-edit"></i></template>
<template #icon><SearchIcon><i class="ti ti-edit"></i></SearchIcon></template>
<div class="_gaps_m">
<div class="_gaps_s">
@ -341,7 +341,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['notification']">
<MkFolder>
<template #label><SearchLabel>{{ i18n.ts.notifications }}</SearchLabel></template>
<template #icon><i class="ti ti-bell"></i></template>
<template #icon><SearchIcon><i class="ti ti-bell"></i></SearchIcon></template>
<div class="_gaps_m">
<SearchMarker :keywords="['group']">
@ -382,7 +382,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['chat', 'messaging']">
<MkFolder>
<template #label><SearchLabel>{{ i18n.ts.chat }}</SearchLabel></template>
<template #icon><i class="ti ti-messages"></i></template>
<template #icon><SearchIcon><i class="ti ti-messages"></i></SearchIcon></template>
<div class="_gaps_s">
<SearchMarker :keywords="['show', 'sender', 'name']">
@ -421,7 +421,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['accessibility']">
<MkFolder>
<template #label><SearchLabel>{{ i18n.ts.accessibility }}</SearchLabel></template>
<template #icon><i class="ti ti-accessible"></i></template>
<template #icon><SearchIcon><i class="ti ti-accessible"></i></SearchIcon></template>
<div class="_gaps_m">
<MkFeatureBanner icon="/client-assets/mens_room_3d.png" color="#0011ff">
@ -531,7 +531,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['performance']">
<MkFolder>
<template #label><SearchLabel>{{ i18n.ts.performance }}</SearchLabel></template>
<template #icon><i class="ti ti-battery-vertical-eco"></i></template>
<template #icon><SearchIcon><i class="ti ti-battery-vertical-eco"></i></SearchIcon></template>
<div class="_gaps_s">
<SearchMarker :keywords="['blur']">
@ -567,7 +567,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['datasaver']">
<MkFolder>
<template #label><SearchLabel>{{ i18n.ts.dataSaver }}</SearchLabel></template>
<template #icon><i class="ti ti-antenna-bars-3"></i></template>
<template #icon><SearchIcon><i class="ti ti-antenna-bars-3"></i></SearchIcon></template>
<div class="_gaps_m">
<MkInfo>{{ i18n.ts.reloadRequiredToApplySettings }}</MkInfo>
@ -601,7 +601,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker :keywords="['other']">
<MkFolder>
<template #label><SearchLabel>{{ i18n.ts.other }}</SearchLabel></template>
<template #icon><i class="ti ti-settings-cog"></i></template>
<template #icon><SearchIcon><i class="ti ti-settings-cog"></i></SearchIcon></template>
<div class="_gaps_m">
<div class="_gaps_s">

View File

@ -184,6 +184,6 @@ definePage(() => ({
.description {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View File

@ -520,7 +520,7 @@ onUnmounted(() => {
> .heading {
text-align: left;
color: var(--MI_THEME-fgTransparent);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.5);
line-height: 1.5;
font-size: 85%;
}

View File

@ -10,14 +10,19 @@ import { prefer } from '@/preferences.js';
import { misskeyApi } from '@/utility/misskey-api.js';
import { deckStore } from '@/ui/deck/deck-store.js';
import { unisonReload } from '@/utility/unison-reload.js';
import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
// TODO: そのうち消す
export function migrateOldSettings() {
os.waiting(i18n.ts.settingsMigrating);
store.loaded.then(async () => {
const themes = await misskeyApi('i/registry/get', { scope: ['client'], key: 'themes' }).catch(() => []);
misskeyApi('i/registry/get', { scope: ['client'], key: 'themes' }).catch(() => []).then((themes: any) => {
if (themes.length > 0) {
prefer.commit('themes', themes);
}
});
const plugins = ColdDeviceStorage.get('plugins');
prefer.commit('plugins', plugins.map(p => ({
@ -136,6 +141,6 @@ export function migrateOldSettings() {
window.setTimeout(() => {
unisonReload();
}, 5000);
}, 10000);
});
}

View File

@ -445,7 +445,7 @@ if (prefer.s['deck.wallpaper'] != null) {
padding: 0;
aspect-ratio: 1;
width: 100%;
max-width: 60px;
max-width: 50px;
margin: auto;
border-radius: 100%;
background: var(--MI_THEME-panel);

View File

@ -413,11 +413,16 @@ function onDrop(ev) {
font-size: 0.9em;
color: var(--MI_THEME-panelHeaderFg);
background: var(--MI_THEME-panelHeaderBg);
box-shadow: 0 0.5px 0 0 var(--MI_THEME-panelHeaderDivider);
cursor: pointer;
user-select: none;
}
@container style(--MI_THEME-panelHeaderBg: var(--MI_THEME-panel)) {
.header {
box-shadow: 0 0.5px 0 0 light-dark(#0002, #fff2);
}
}
.color {
position: absolute;
top: 12px;

View File

@ -298,7 +298,7 @@ $widgets-hide-threshold: 1090px;
padding: 0;
aspect-ratio: 1;
width: 100%;
max-width: 60px;
max-width: 50px;
margin: auto;
border-radius: 100%;
background: var(--MI_THEME-panel);

View File

@ -8,35 +8,27 @@ import type { GeneratedSearchIndexItem } from 'search-index:settings';
export type SearchIndexItem = {
id: string;
parentId?: string;
path?: string;
label: string;
keywords: string[];
icon?: string;
children?: SearchIndexItem[];
};
const rootMods = new Map(generated.map(item => [item.id, item]));
function walk(item: GeneratedSearchIndexItem) {
// link inlining here
for (const item of generated) {
if (item.inlining) {
for (const id of item.inlining) {
const inline = rootMods.get(id);
if (inline) {
(item.children ??= []).push(inline);
rootMods.delete(id);
inline.parentId = item.id;
} else {
console.log('[Settings Search Index] Failed to inline', id);
}
}
}
for (const child of item.children ?? []) {
walk(child);
}
}
for (const item of generated) {
walk(item);
}
export const searchIndexes: SearchIndexItem[] = generated;

View File

@ -6,12 +6,12 @@
declare module 'search-index:settings' {
export type GeneratedSearchIndexItem = {
id: string;
parentId?: string;
path?: string;
label: string;
keywords: string[];
icon?: string;
inlining?: string[];
children?: GeneratedSearchIndexItem[];
};
export const searchIndexes: GeneratedSearchIndexItem[];

View File

@ -73,6 +73,6 @@ defineExpose<WidgetComponentExpose>({
}
.text {
color: var(--MI_THEME-fgTransparentWeak);
color: color(from var(--MI_THEME-fg) srgb r g b / 0.75);
}
</style>

View File

@ -1,7 +1,7 @@
{
"type": "module",
"name": "misskey-js",
"version": "2025.4.0-rc.1",
"version": "2025.4.0-rc.2",
"description": "Misskey SDK for JavaScript",
"license": "MIT",
"main": "./built/index.js",

View File

@ -27,3 +27,4 @@ onlyBuiltDependencies:
- utf-8-validate
- v-code-diff
- vue-demi
ignorePatchFailures: false