Merge pull request #10181 from misskey-dev/develop

Release: 13.9.1
This commit is contained in:
syuilo 2023-03-03 20:56:50 +09:00 committed by GitHub
commit b23a9b1a88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 345 additions and 89 deletions

View File

@ -10,6 +10,11 @@
You should also include the user name that made the change. You should also include the user name that made the change.
--> -->
## 13.9.1 (2023/03/03)
### Bugfixes
- ノートに添付したファイルが表示されない場合があるのを修正
## 13.9.0 (2023/03/03) ## 13.9.0 (2023/03/03)
### Improvements ### Improvements

View File

@ -1182,7 +1182,7 @@ _achievements:
_loggedInOnNewYearsDay: _loggedInOnNewYearsDay:
title: "Happy New Year!" title: "Happy New Year!"
description: "Logged in on the first day of the year" description: "Logged in on the first day of the year"
flavor: "To another great year on this instance" flavor: "To another great year!"
_cookieClicked: _cookieClicked:
title: "A game in which you click cookies" title: "A game in which you click cookies"
description: "Clicked the cookie" description: "Clicked the cookie"

View File

@ -854,6 +854,7 @@ tenMinutes: "10 minutos"
oneHour: "1 hora" oneHour: "1 hora"
oneDay: "1 día" oneDay: "1 día"
oneWeek: "1 semana" oneWeek: "1 semana"
oneMonth: "1 mes"
reflectMayTakeTime: "Puede pasar un tiempo hasta que se reflejen los cambios" reflectMayTakeTime: "Puede pasar un tiempo hasta que se reflejen los cambios"
failedToFetchAccountInformation: "No se pudo obtener información de la cuenta" failedToFetchAccountInformation: "No se pudo obtener información de la cuenta"
rateLimitExceeded: "Se excedió el límite de peticiones" rateLimitExceeded: "Se excedió el límite de peticiones"

View File

@ -527,7 +527,7 @@ updateRemoteUser: "Mettre à jour les informations de lutilisateur·rice dist
deleteAllFiles: "Supprimer tous les fichiers" deleteAllFiles: "Supprimer tous les fichiers"
deleteAllFilesConfirm: "Êtes-vous sûr·e de vouloir supprimer tous les fichiers ?" deleteAllFilesConfirm: "Êtes-vous sûr·e de vouloir supprimer tous les fichiers ?"
removeAllFollowing: "Retenir tous les abonnements" removeAllFollowing: "Retenir tous les abonnements"
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si linstance nexiste plus." removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action dans les cas où linstance nexiste plus, etc."
userSuspended: "Cet·te utilisateur·rice a été suspendu·e." userSuspended: "Cet·te utilisateur·rice a été suspendu·e."
userSilenced: "Cette utilisateur·trice a été mis·e en sourdine." userSilenced: "Cette utilisateur·trice a été mis·e en sourdine."
yourAccountSuspendedTitle: "Ce compte est suspendu" yourAccountSuspendedTitle: "Ce compte est suspendu"

View File

@ -2,7 +2,7 @@
_lang_: "한국어" _lang_: "한국어"
headlineMisskey: "노트로 연결되는 네트워크" headlineMisskey: "노트로 연결되는 네트워크"
introMisskey: "환영합니다! Misskey는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n'노트'를 작성해서 지금 일어나고 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요📡\n'리액션' 기능으로 친구의 노트에 총알같이 반응을 추가할 수도 있습니다👍\n새로운 세계를 탐험해 보세요🚀" introMisskey: "환영합니다! Misskey는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n'노트'를 작성해서 지금 일어나고 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요📡\n'리액션' 기능으로 친구의 노트에 총알같이 반응을 추가할 수도 있습니다👍\n새로운 세계를 탐험해 보세요🚀"
poweredByMisskeyDescription: "{name}은(는) 오픈소스 플랫폼<b>Misskey</b>를 사용한 서비스(Misskey 인스턴스라고 불립니다) 중 하나입니다." poweredByMisskeyDescription: "{name}은(는) 오픈소스 플랫폼<b>Misskey</b>를 사용한 서 중 하나입니다."
monthAndDay: "{month}월 {day}일" monthAndDay: "{month}월 {day}일"
search: "검색" search: "검색"
notifications: "알림" notifications: "알림"
@ -18,7 +18,7 @@ enterUsername: "유저명 입력"
renotedBy: "{user}님의 리노트" renotedBy: "{user}님의 리노트"
noNotes: "노트가 없습니다" noNotes: "노트가 없습니다"
noNotifications: "표시할 알림이 없습니다" noNotifications: "표시할 알림이 없습니다"
instance: "인스턴스" instance: "서버"
settings: "설정" settings: "설정"
basicSettings: "기본 설정" basicSettings: "기본 설정"
otherSettings: "기타 설정" otherSettings: "기타 설정"
@ -163,13 +163,13 @@ searchWith: "검색: {q}"
youHaveNoLists: "리스트가 없습니다" youHaveNoLists: "리스트가 없습니다"
followConfirm: "{name}님을 팔로우 하시겠습니까?" followConfirm: "{name}님을 팔로우 하시겠습니까?"
proxyAccount: "프록시 계정" proxyAccount: "프록시 계정"
proxyAccountDescription: "프록시 계정은 특정 조건 하에서 유저의 리모트 팔로우를 대행하는 계정입니다. 예를 들면, 유저가 리모트 유저를 리스트에 넣었을 때, 리스트에 들어간 유저를 아무도 팔로우한 적이 없다면 액티비티가 인스턴스로 배달되지 않기 때문에, 대신 프록시 계정이 해당 유저를 팔로우하도록 합니다." proxyAccountDescription: "프록시 계정은 특정 조건 하에서 유저의 리모트 팔로우를 대행하는 계정입니다. 예를 들면, 유저가 리모트 유저를 리스트에 넣었을 때, 리스트에 들어간 유저를 아무도 팔로우한 적이 없다면 액티비티가 서버로 배달되지 않기 때문에, 대신 프록시 계정이 해당 유저를 팔로우하도록 합니다."
host: "호스트" host: "호스트"
selectUser: "유저 선택" selectUser: "유저 선택"
recipient: "수신인" recipient: "수신인"
annotation: "내용에 대한 주석" annotation: "내용에 대한 주석"
federation: "연합" federation: "연합"
instances: "인스턴스" instances: "서버"
registeredAt: "등록 날짜" registeredAt: "등록 날짜"
latestRequestReceivedAt: "마지막으로 요청을 받은 시간" latestRequestReceivedAt: "마지막으로 요청을 받은 시간"
latestStatus: "마지막 상태" latestStatus: "마지막 상태"
@ -178,7 +178,7 @@ charts: "차트"
perHour: "1시간마다" perHour: "1시간마다"
perDay: "1일마다" perDay: "1일마다"
stopActivityDelivery: "액티비티 보내지 않기" stopActivityDelivery: "액티비티 보내지 않기"
blockThisInstance: "이 인스턴스를 차단" blockThisInstance: "이 서버를 차단"
operations: "작업" operations: "작업"
software: "소프트웨어" software: "소프트웨어"
version: "버전" version: "버전"
@ -189,15 +189,15 @@ jobQueue: "작업 대기열"
cpuAndMemory: "CPU와 메모리" cpuAndMemory: "CPU와 메모리"
network: "네트워크" network: "네트워크"
disk: "디스크" disk: "디스크"
instanceInfo: "인스턴스 정보" instanceInfo: "서버 정보"
statistics: "통계" statistics: "통계"
clearQueue: "대기열 비우기" clearQueue: "대기열 비우기"
clearQueueConfirmTitle: "대기열을 비우시겠습니까?" clearQueueConfirmTitle: "대기열을 비우시겠습니까?"
clearQueueConfirmText: "대기열에 남아 있는 노트는 더이상 연합되지 않습니다. 보통의 경우 이 작업은 필요하지 않습니다." clearQueueConfirmText: "대기열에 남아 있는 노트는 더이상 연합되지 않습니다. 보통의 경우 이 작업은 필요하지 않습니다."
clearCachedFiles: "캐시 비우기" clearCachedFiles: "캐시 비우기"
clearCachedFilesConfirm: "캐시된 리모트 파일을 모두 삭제하시겠습니까?" clearCachedFilesConfirm: "캐시된 리모트 파일을 모두 삭제하시겠습니까?"
blockedInstances: "차단된 인스턴스" blockedInstances: "차단된 서버"
blockedInstancesDescription: "차단하려는 인스턴스의 호스트 이름을 줄바꿈으로 구분하여 설정합니다. 차단된 인스턴스는 이 인스턴스와 통신할 수 없게 됩니다." blockedInstancesDescription: "차단하려는 서버의 호스트 이름을 줄바꿈으로 구분하여 설정합니다. 차단된 인스턴스는 이 인스턴스와 통신할 수 없게 됩니다."
muteAndBlock: "뮤트 및 차단" muteAndBlock: "뮤트 및 차단"
mutedUsers: "뮤트한 유저" mutedUsers: "뮤트한 유저"
blockedUsers: "차단한 유저" blockedUsers: "차단한 유저"
@ -220,9 +220,9 @@ all: "전체"
subscribing: "구독 중" subscribing: "구독 중"
publishing: "배포 중" publishing: "배포 중"
notResponding: "응답 없음" notResponding: "응답 없음"
instanceFollowing: "인스턴스의 팔로잉" instanceFollowing: "서버의 팔로잉"
instanceFollowers: "인스턴스의 팔로워" instanceFollowers: "서버의 팔로워"
instanceUsers: "인스턴스의 유저" instanceUsers: "서버의 유저"
changePassword: "비밀번호 변경" changePassword: "비밀번호 변경"
security: "보안" security: "보안"
retypedNotMatch: "입력이 일치하지 않습니다." retypedNotMatch: "입력이 일치하지 않습니다."
@ -314,8 +314,8 @@ unwatch: "지켜보기 해제"
accept: "허가" accept: "허가"
reject: "거부" reject: "거부"
normal: "정상" normal: "정상"
instanceName: "인스턴스 이름" instanceName: "서버 이름"
instanceDescription: "인스턴스 소개" instanceDescription: "서버 소개"
maintainerName: "관리자 이름" maintainerName: "관리자 이름"
maintainerEmail: "관리자 이메일" maintainerEmail: "관리자 이메일"
tosUrl: "이용약관 URL" tosUrl: "이용약관 URL"
@ -345,7 +345,7 @@ basicInfo: "기본 정보"
pinnedUsers: "고정된 유저" pinnedUsers: "고정된 유저"
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다." pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
pinnedPages: "고정한 페이지" pinnedPages: "고정한 페이지"
pinnedPagesDescription: "인스턴스의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다." pinnedPagesDescription: "서버의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다."
pinnedClipId: "고정할 클립의 ID" pinnedClipId: "고정할 클립의 ID"
pinnedNotes: "고정해놓은 노트" pinnedNotes: "고정해놓은 노트"
hcaptcha: "hCaptcha" hcaptcha: "hCaptcha"
@ -457,6 +457,7 @@ aboutX: "{x}에 대하여"
emojiStyle: "이모지 스타일" emojiStyle: "이모지 스타일"
native: "네이티브" native: "네이티브"
disableDrawer: "드로어 메뉴를 사용하지 않기" disableDrawer: "드로어 메뉴를 사용하지 않기"
showNoteActionsOnlyHover: "노트 액션 버튼을 마우스를 올렸을 때에만 표시"
noHistory: "기록이 없습니다" noHistory: "기록이 없습니다"
signinHistory: "로그인 기록" signinHistory: "로그인 기록"
enableAdvancedMfm: "고급 MFM을 활성화" enableAdvancedMfm: "고급 MFM을 활성화"
@ -537,7 +538,7 @@ updateRemoteUser: "리모트 유저 정보 갱신"
deleteAllFiles: "모든 파일 삭제" deleteAllFiles: "모든 파일 삭제"
deleteAllFilesConfirm: "모든 파일을 삭제하시겠습니까?" deleteAllFilesConfirm: "모든 파일을 삭제하시겠습니까?"
removeAllFollowing: "모든 팔로잉 해제" removeAllFollowing: "모든 팔로잉 해제"
removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요." removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 서버가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요."
userSuspended: "이 계정은 정지된 상태입니다." userSuspended: "이 계정은 정지된 상태입니다."
userSilenced: "이 계정은 사일런스된 상태입니다." userSilenced: "이 계정은 사일런스된 상태입니다."
yourAccountSuspendedTitle: "계정이 정지되었습니다" yourAccountSuspendedTitle: "계정이 정지되었습니다"
@ -603,7 +604,7 @@ testEmail: "이메일 전송 테스트"
wordMute: "단어 뮤트" wordMute: "단어 뮤트"
regexpError: "정규 표현식 오류" regexpError: "정규 표현식 오류"
regexpErrorDescription: "{tab}단어 뮤트 {line}행의 정규 표현식에 오류가 발생했습니다:" regexpErrorDescription: "{tab}단어 뮤트 {line}행의 정규 표현식에 오류가 발생했습니다:"
instanceMute: "인스턴스 뮤트" instanceMute: "서버 뮤트"
userSaysSomething: "{name}님이 무언가를 말했습니다" userSaysSomething: "{name}님이 무언가를 말했습니다"
makeActive: "활성화" makeActive: "활성화"
display: "표시" display: "표시"
@ -634,15 +635,15 @@ abuseReported: "신고를 보냈습니다. 신고해 주셔서 감사합니다."
reporter: "신고자" reporter: "신고자"
reporteeOrigin: "피신고자" reporteeOrigin: "피신고자"
reporterOrigin: "신고자" reporterOrigin: "신고자"
forwardReport: "리모트 인스턴스에도 신고 내용 보내기" forwardReport: "리모트 서버에도 신고 내용 보내기"
forwardReportIsAnonymous: "리모트 인스턴스에서는 나의 정보를 볼 수 없으며, 익명의 시스템 계정으로 표시됩니다." forwardReportIsAnonymous: "리모트 서버에서는 나의 정보를 볼 수 없으며, 익명의 시스템 계정으로 표시됩니다."
send: "전송" send: "전송"
abuseMarkAsResolved: "해결됨으로 표시" abuseMarkAsResolved: "해결됨으로 표시"
openInNewTab: "새 탭에서 열기" openInNewTab: "새 탭에서 열기"
openInSideView: "사이드뷰로 열기" openInSideView: "사이드뷰로 열기"
defaultNavigationBehaviour: "기본 탐색 동작" defaultNavigationBehaviour: "기본 탐색 동작"
editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다." editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다."
instanceTicker: "노트의 인스턴스 정보" instanceTicker: "노트의 서버 정보"
waitingFor: "{x}을(를) 기다리고 있습니다" waitingFor: "{x}을(를) 기다리고 있습니다"
random: "랜덤" random: "랜덤"
system: "시스템" system: "시스템"
@ -731,7 +732,7 @@ capacity: "용량"
inUse: "사용중" inUse: "사용중"
editCode: "코드 수정" editCode: "코드 수정"
apply: "적용" apply: "적용"
receiveAnnouncementFromInstance: "이 인스턴스의 알림을 이메일로 수신할게요" receiveAnnouncementFromInstance: "이 서버의 알림을 이메일로 수신할게요"
emailNotification: "메일 알림" emailNotification: "메일 알림"
publish: "게시" publish: "게시"
inChannelSearch: "채널에서 검색" inChannelSearch: "채널에서 검색"
@ -759,7 +760,7 @@ active: "최근에 활동함"
offline: "오프라인" offline: "오프라인"
notRecommended: "추천하지 않음" notRecommended: "추천하지 않음"
botProtection: "Bot 방어" botProtection: "Bot 방어"
instanceBlocking: "인스턴스 차단" instanceBlocking: "서버 차단"
selectAccount: "계정 선택" selectAccount: "계정 선택"
switchAccount: "계정 바꾸기" switchAccount: "계정 바꾸기"
enabled: "활성화" enabled: "활성화"
@ -843,8 +844,8 @@ themeColor: "테마 컬러"
size: "크기" size: "크기"
numberOfColumn: "한 줄에 보일 리액션의 수" numberOfColumn: "한 줄에 보일 리액션의 수"
searchByGoogle: "검색" searchByGoogle: "검색"
instanceDefaultLightTheme: "인스턴스 기본 라이트 테마" instanceDefaultLightTheme: "서버 기본 라이트 테마"
instanceDefaultDarkTheme: "인스턴스 기본 다크 테마" instanceDefaultDarkTheme: "서버 기본 다크 테마"
instanceDefaultThemeDescription: "객체 형식의 테마 코드를 입력해 주세요." instanceDefaultThemeDescription: "객체 형식의 테마 코드를 입력해 주세요."
mutePeriod: "뮤트할 기간" mutePeriod: "뮤트할 기간"
period: "투표 기한" period: "투표 기한"
@ -897,7 +898,7 @@ cannotUploadBecauseInappropriate: "이 파일은 부적절한 내용을 포함
cannotUploadBecauseNoFreeSpace: "드라이브 용량이 부족하여 업로드할 수 없습니다." cannotUploadBecauseNoFreeSpace: "드라이브 용량이 부족하여 업로드할 수 없습니다."
beta: "베타" beta: "베타"
enableAutoSensitive: "자동 NSFW 탐지" enableAutoSensitive: "자동 NSFW 탐지"
enableAutoSensitiveDescription: "이용 가능할 경우 기계학습을 통해 자동으로 미디어 NSFW를 설정합니다. 이 기능을 해제하더라도, 인스턴스 정책에 따라 자동으로 설정될 수 있습니다." enableAutoSensitiveDescription: "이용 가능할 경우 기계학습을 통해 자동으로 미디어 NSFW를 설정합니다. 이 기능을 해제하더라도, 서버 정책에 따라 자동으로 설정될 수 있습니다."
activeEmailValidationDescription: "유저가 입력한 메일 주소가 일회용 메일인지, 실제로 통신할 수 있는 지 엄격하게 검사합니다. 해제할 경우 이메일 형식에 대해서만 검사합니다." activeEmailValidationDescription: "유저가 입력한 메일 주소가 일회용 메일인지, 실제로 통신할 수 있는 지 엄격하게 검사합니다. 해제할 경우 이메일 형식에 대해서만 검사합니다."
navbar: "내비게이션 바" navbar: "내비게이션 바"
shuffle: "셔플" shuffle: "셔플"
@ -907,7 +908,7 @@ pushNotification: "푸시 알림"
subscribePushNotification: "푸시 알림 켜기" subscribePushNotification: "푸시 알림 켜기"
unsubscribePushNotification: "푸시 알림 끄기" unsubscribePushNotification: "푸시 알림 끄기"
pushNotificationAlreadySubscribed: "푸시 알림이 이미 켜져 있습니다" pushNotificationAlreadySubscribed: "푸시 알림이 이미 켜져 있습니다"
pushNotificationNotSupported: "브라우저나 인스턴스에서 푸시 알림이 지원되지 않습니다" pushNotificationNotSupported: "브라우저나 서버에서 푸시 알림이 지원되지 않습니다"
sendPushNotificationReadMessage: "푸시 알림이나 메시지를 읽은 뒤 푸시 알림을 삭제" sendPushNotificationReadMessage: "푸시 알림이나 메시지를 읽은 뒤 푸시 알림을 삭제"
sendPushNotificationReadMessageCaption: "「{emptyPushNotificationMessage}」이라는 알림이 잠깐 표시됩니다. 기기의 전력 소비량이 증가할 수 있습니다." sendPushNotificationReadMessageCaption: "「{emptyPushNotificationMessage}」이라는 알림이 잠깐 표시됩니다. 기기의 전력 소비량이 증가할 수 있습니다."
windowMaximize: "최대화" windowMaximize: "최대화"
@ -953,7 +954,7 @@ joinThisServer: "이 서버에 가입"
exploreOtherServers: "다른 서버 둘러보기" exploreOtherServers: "다른 서버 둘러보기"
letsLookAtTimeline: "타임라인 구경하기" letsLookAtTimeline: "타임라인 구경하기"
disableFederationWarn: "연합이 비활성화됩니다. 비활성화해도 게시물이 비공개가 되지는 않습니다. 대부분의 경우 이 옵션을 활성화할 필요가 없습니다." disableFederationWarn: "연합이 비활성화됩니다. 비활성화해도 게시물이 비공개가 되지는 않습니다. 대부분의 경우 이 옵션을 활성화할 필요가 없습니다."
invitationRequiredToRegister: "현재 이 서버는 비공개입니다. 회원가입을 하시려면 초대번호가 필요합니다." invitationRequiredToRegister: "현재 이 서버는 비공개입니다. 회원가입을 하시려면 초대 코드가 필요합니다."
_achievements: _achievements:
earnedAt: "달성 일시" earnedAt: "달성 일시"
_types: _types:
@ -1144,7 +1145,7 @@ _achievements:
description: "1분 사이에 홈 타임라인에 노트가 20개 넘게 생성되었습니다" description: "1분 사이에 홈 타임라인에 노트가 20개 넘게 생성되었습니다"
_viewInstanceChart: _viewInstanceChart:
title: "애널리스트" title: "애널리스트"
description: "인스턴스의 차트를 열었습니다" description: "서버의 차트를 열었습니다"
_outputHelloWorldOnScratchpad: _outputHelloWorldOnScratchpad:
title: "Hello, world!" title: "Hello, world!"
description: "스크래치패드에서 hello world를 출력했습니다" description: "스크래치패드에서 hello world를 출력했습니다"
@ -1181,7 +1182,7 @@ _achievements:
_loggedInOnNewYearsDay: _loggedInOnNewYearsDay:
title: "새해 복 많이 받으세요" title: "새해 복 많이 받으세요"
description: "새해 첫 날에 로그인했습니다" description: "새해 첫 날에 로그인했습니다"
flavor: "올해에도 저희 인스턴스에 관심을 가져 주셔서 감사합니다" flavor: "올해에도 저희 서버에 관심을 가져 주셔서 감사합니다"
_cookieClicked: _cookieClicked:
title: "쿠키를 클릭하는 게임" title: "쿠키를 클릭하는 게임"
description: "쿠키를 클릭했습니다" description: "쿠키를 클릭했습니다"
@ -1196,7 +1197,7 @@ _role:
name: "역할 이름" name: "역할 이름"
description: "역할 설명" description: "역할 설명"
permission: "역할 권한" permission: "역할 권한"
descriptionOfPermission: "<b>모더레이터</b>는 기본적인 중재와 관련된 작업을 수행할 수 있습니다.\n<b>관리자</b>는 인스턴스의 모든 설정을 변경할 수 있습니다." descriptionOfPermission: "<b>모더레이터</b>는 기본적인 중재와 관련된 작업을 수행할 수 있습니다.\n<b>관리자</b>는 서버의 모든 설정을 변경할 수 있습니다."
assignTarget: "할당 대상" assignTarget: "할당 대상"
descriptionOfAssignTarget: "<b>수동</b>을 선택하면 누가 이 역할에 포함되는지를 수동으로 관리할 수 있습니다.\n<b>조건부</b>를 선택하면 조건을 설정해 일치하는 사용자를 자동으로 포함되게 할 수 있습니다." descriptionOfAssignTarget: "<b>수동</b>을 선택하면 누가 이 역할에 포함되는지를 수동으로 관리할 수 있습니다.\n<b>조건부</b>를 선택하면 조건을 설정해 일치하는 사용자를 자동으로 포함되게 할 수 있습니다."
manual: "수동" manual: "수동"
@ -1224,7 +1225,7 @@ _role:
gtlAvailable: "글로벌 타임라인 보이기" gtlAvailable: "글로벌 타임라인 보이기"
ltlAvailable: "로컬 타임라인 보이기" ltlAvailable: "로컬 타임라인 보이기"
canPublicNote: "공개 노트 허용" canPublicNote: "공개 노트 허용"
canInvite: "인스턴스 초대 코드 발행" canInvite: "서버 초대 코드 발행"
canManageCustomEmojis: "커스텀 이모지 관리" canManageCustomEmojis: "커스텀 이모지 관리"
driveCapacity: "드라이브 용량" driveCapacity: "드라이브 용량"
pinMax: "고정할 수 있는 노트 수" pinMax: "고정할 수 있는 노트 수"
@ -1286,7 +1287,7 @@ _ad:
_forgotPassword: _forgotPassword:
enterEmail: "여기에 계정에 등록한 메일 주소를 입력해 주세요. 입력한 메일 주소로 비밀번호 재설정 링크를 발송합니다." enterEmail: "여기에 계정에 등록한 메일 주소를 입력해 주세요. 입력한 메일 주소로 비밀번호 재설정 링크를 발송합니다."
ifNoEmail: "메일 주소를 등록하지 않은 경우, 관리자에 문의해 주십시오." ifNoEmail: "메일 주소를 등록하지 않은 경우, 관리자에 문의해 주십시오."
contactAdmin: "이 인스턴스에서는 메일 기능이 지원되지 않습니다. 비밀번호를 재설정하려면 관리자에게 문의해 주십시오." contactAdmin: "이 서버에서는 메일 기능이 지원되지 않습니다. 비밀번호를 재설정하려면 관리자에게 문의해 주십시오."
_gallery: _gallery:
my: "내 갤러리" my: "내 갤러리"
liked: "좋아요 한 갤러리" liked: "좋아요 한 갤러리"
@ -1371,10 +1372,10 @@ _wordMute:
hard: "보다 높은 수준" hard: "보다 높은 수준"
mutedNotes: "뮤트된 노트" mutedNotes: "뮤트된 노트"
_instanceMute: _instanceMute:
instanceMuteDescription: "뮤트한 인스턴스에서 오는 답글을 포함한 모든 노트와 Renote를 뮤트합니다." instanceMuteDescription: "뮤트한 서버에서 오는 답글을 포함한 모든 노트와 Renote를 뮤트합니다."
instanceMuteDescription2: "한 줄에 하나씩 입력해 주세요" instanceMuteDescription2: "한 줄에 하나씩 입력해 주세요"
title: "지정한 인스턴스의 노트를 숨깁니다." title: "지정한 서버의 노트를 숨깁니다."
heading: "뮤트할 인스턴스" heading: "뮤트할 서버"
_theme: _theme:
explore: "테마 찾아보기" explore: "테마 찾아보기"
install: "테마 설치" install: "테마 설치"
@ -1487,7 +1488,7 @@ _tutorial:
step4_1: "노트 작성을 끝내셨나요?" step4_1: "노트 작성을 끝내셨나요?"
step4_2: "당신의 노트가 타임라인에 표시되어 있다면 성공입니다." step4_2: "당신의 노트가 타임라인에 표시되어 있다면 성공입니다."
step5_1: "이제, 다른 사람을 팔로우하여 타임라인을 활기차게 만들어보도록 합시다." step5_1: "이제, 다른 사람을 팔로우하여 타임라인을 활기차게 만들어보도록 합시다."
step5_2: "{featured}에서 이 인스턴스의 인기 노트를 보실 수 있습니다. {explore}에서는 인기 사용자를 찾을 수 있구요. 마음에 드는 사람을 골라 팔로우해 보세요!" step5_2: "{featured}에서 이 서버의 인기 노트를 보실 수 있습니다. {explore}에서는 인기 사용자를 찾을 수 있구요. 마음에 드는 사람을 골라 팔로우해 보세요!"
step5_3: "다른 유저를 팔로우하려면 해당 유저의 아이콘을 클릭하여 프로필 페이지를 띄운 후, 팔로우 버튼을 눌러 주세요." step5_3: "다른 유저를 팔로우하려면 해당 유저의 아이콘을 클릭하여 프로필 페이지를 띄운 후, 팔로우 버튼을 눌러 주세요."
step5_4: "사용자에 따라 팔로우가 승인될 때까지 시간이 걸릴 수 있습니다." step5_4: "사용자에 따라 팔로우가 승인될 때까지 시간이 걸릴 수 있습니다."
step6_1: "타임라인에 다른 사용자의 노트가 나타난다면 성공입니다." step6_1: "타임라인에 다른 사용자의 노트가 나타난다면 성공입니다."
@ -1582,7 +1583,7 @@ _weekday:
saturday: "토요일" saturday: "토요일"
_widgets: _widgets:
profile: "프로필" profile: "프로필"
instanceInfo: "인스턴스 정보" instanceInfo: "서버 정보"
memo: "스티커 메모" memo: "스티커 메모"
notifications: "알림" notifications: "알림"
timeline: "타임라인" timeline: "타임라인"
@ -1596,7 +1597,7 @@ _widgets:
digitalClock: "디지털 시계" digitalClock: "디지털 시계"
unixClock: "UNIX 시계" unixClock: "UNIX 시계"
federation: "연합" federation: "연합"
instanceCloud: "인스턴스 구름" instanceCloud: "서버 구름"
postForm: "글 입력란" postForm: "글 입력란"
slideshow: "슬라이드 쇼" slideshow: "슬라이드 쇼"
button: "버튼" button: "버튼"
@ -1647,7 +1648,7 @@ _visibility:
specified: "다이렉트" specified: "다이렉트"
specifiedDescription: "지정한 유저에게만 공개" specifiedDescription: "지정한 유저에게만 공개"
disableFederation: "연합에 보내지 않기" disableFederation: "연합에 보내지 않기"
disableFederationDescription: "다른 인스턴스로 보내지 않습니다" disableFederationDescription: "다른 서버로 보내지 않습니다"
_postForm: _postForm:
replyPlaceholder: "이 노트에 답글..." replyPlaceholder: "이 노트에 답글..."
quotePlaceholder: "이 노트를 인용..." quotePlaceholder: "이 노트를 인용..."

View File

@ -2,6 +2,7 @@
_lang_: "Tiếng Việt" _lang_: "Tiếng Việt"
headlineMisskey: "Mạng xã hội liên hợp" headlineMisskey: "Mạng xã hội liên hợp"
introMisskey: "Xin chào! Misskey là một nền tảng tiểu blog phi tập trung mã nguồn mở.\nViết \"tút\" để chia sẻ những suy nghĩ của bạn 📡\nBằng \"biểu cảm\", bạn có thể bày tỏ nhanh chóng cảm xúc của bạn với các tút 👍\nHãy khám phá một thế giới mới! 🚀" introMisskey: "Xin chào! Misskey là một nền tảng tiểu blog phi tập trung mã nguồn mở.\nViết \"tút\" để chia sẻ những suy nghĩ của bạn 📡\nBằng \"biểu cảm\", bạn có thể bày tỏ nhanh chóng cảm xúc của bạn với các tút 👍\nHãy khám phá một thế giới mới! 🚀"
poweredByMisskeyDescription: "{name} là một trong những chủ máy của <b>Misskey</b> là nền tảng mã nguồn mở"
monthAndDay: "{day} tháng {month}" monthAndDay: "{day} tháng {month}"
search: "Tìm kiếm" search: "Tìm kiếm"
notifications: "Thông báo" notifications: "Thông báo"
@ -10,12 +11,13 @@ password: "Mật khẩu"
forgotPassword: "Quên mật khẩu" forgotPassword: "Quên mật khẩu"
fetchingAsApObject: "Đang nạp dữ liệu từ Fediverse..." fetchingAsApObject: "Đang nạp dữ liệu từ Fediverse..."
ok: "Đồng ý" ok: "Đồng ý"
gotIt: "Đã hiểu!" gotIt: "Hiểu rồi!"
cancel: "Hủy" cancel: "Hủy"
noThankYou: "Không, cảm ơn"
enterUsername: "Nhập tên người dùng" enterUsername: "Nhập tên người dùng"
renotedBy: "Chia sẻ bởi {user}" renotedBy: "Chia sẻ bởi {user}"
noNotes: "Chưa có t nào." noNotes: "Chưa có bài viết nào."
noNotifications: "Không có thông báo" noNotifications: "Chưa có thông báo"
instance: "Máy chủ" instance: "Máy chủ"
settings: "Cài đặt" settings: "Cài đặt"
basicSettings: "Thiết lập chung" basicSettings: "Thiết lập chung"
@ -47,6 +49,7 @@ deleteAndEdit: "Sửa"
deleteAndEditConfirm: "Bạn có chắc muốn sửa tút này? Những biểu cảm, lượt trả lời và đăng lại sẽ bị mất." deleteAndEditConfirm: "Bạn có chắc muốn sửa tút này? Những biểu cảm, lượt trả lời và đăng lại sẽ bị mất."
addToList: "Thêm vào danh sách" addToList: "Thêm vào danh sách"
sendMessage: "Gửi tin nhắn" sendMessage: "Gửi tin nhắn"
copyRSS: "Sao chép RSS"
copyUsername: "Chép tên người dùng" copyUsername: "Chép tên người dùng"
searchUser: "Tìm kiếm người dùng" searchUser: "Tìm kiếm người dùng"
reply: "Trả lời" reply: "Trả lời"
@ -65,13 +68,13 @@ export: "Xuất dữ liệu"
files: "Tập tin" files: "Tập tin"
download: "Tải xuống" download: "Tải xuống"
driveFileDeleteConfirm: "Bạn có chắc muốn xóa tập tin \"{name}\"? Tút liên quan cũng sẽ bị xóa theo." driveFileDeleteConfirm: "Bạn có chắc muốn xóa tập tin \"{name}\"? Tút liên quan cũng sẽ bị xóa theo."
unfollowConfirm: "Bạn có chắc muốn ngưng theo dõi {name}?" unfollowConfirm: "Bạn ngừng theo dõi {name}?"
exportRequested: "Đang chuẩn bị xuất tập tin. Quá trình này có thể mất ít phút. Nó sẽ được tự động thêm vào Drive sau khi hoàn thành." exportRequested: "Đang chuẩn bị xuất tập tin. Quá trình này có thể mất ít phút. Nó sẽ được tự động thêm vào Drive sau khi hoàn thành."
importRequested: "Bạn vừa yêu cầu nhập dữ liệu. Quá trình này có thể mất ít phút." importRequested: "Bạn vừa yêu cầu nhập dữ liệu. Quá trình này có thể mất ít phút."
lists: "Danh sách" lists: "Danh sách"
noLists: "Bạn chưa có danh sách nào" noLists: "Bạn chưa có danh sách nào"
note: "t" note: "Bài viết"
notes: "t" notes: "Bài Viết"
following: "Đang theo dõi" following: "Đang theo dõi"
followers: "Người theo dõi" followers: "Người theo dõi"
followsYou: "Theo dõi bạn" followsYou: "Theo dõi bạn"
@ -88,7 +91,7 @@ enterListName: "Đặt tên cho danh sách"
privacy: "Bảo mật" privacy: "Bảo mật"
makeFollowManuallyApprove: "Yêu cầu theo dõi cần được duyệt" makeFollowManuallyApprove: "Yêu cầu theo dõi cần được duyệt"
defaultNoteVisibility: "Kiểu tút mặc định" defaultNoteVisibility: "Kiểu tút mặc định"
follow: "Đang theo dõi" follow: "Theo dõi"
followRequest: "Gửi yêu cầu theo dõi" followRequest: "Gửi yêu cầu theo dõi"
followRequests: "Yêu cầu theo dõi" followRequests: "Yêu cầu theo dõi"
unfollow: "Ngưng theo dõi" unfollow: "Ngưng theo dõi"
@ -100,7 +103,9 @@ renoted: "Đã đăng lại."
cantRenote: "Không thể đăng lại tút này." cantRenote: "Không thể đăng lại tút này."
cantReRenote: "Không thể đăng lại một tút đăng lại." cantReRenote: "Không thể đăng lại một tút đăng lại."
quote: "Trích dẫn" quote: "Trích dẫn"
pinnedNote: "Tút ghim" inChannelRenote: "Chia sẻ trong kênh này"
inChannelQuote: "Trích dẫn trong kênh này"
pinnedNote: "Bài viết đã ghim"
pinned: "Ghim" pinned: "Ghim"
you: "Bạn" you: "Bạn"
clickToShow: "Nhấn để xem" clickToShow: "Nhấn để xem"
@ -126,6 +131,7 @@ unblockConfirm: "Bạn có chắc muốn bỏ chặn người này?"
suspendConfirm: "Bạn có chắc muốn vô hiệu hóa người này?" suspendConfirm: "Bạn có chắc muốn vô hiệu hóa người này?"
unsuspendConfirm: "Bạn có chắc muốn bỏ vô hiệu hóa người này?" unsuspendConfirm: "Bạn có chắc muốn bỏ vô hiệu hóa người này?"
selectList: "Chọn danh sách" selectList: "Chọn danh sách"
selectChannel: "Lựa chọn kênh"
selectAntenna: "Chọn một antenna" selectAntenna: "Chọn một antenna"
selectWidget: "Chọn tiện ích" selectWidget: "Chọn tiện ích"
editWidgets: "Sửa tiện ích" editWidgets: "Sửa tiện ích"
@ -141,8 +147,8 @@ cacheRemoteFiles: "Tập tin cache từ xa"
cacheRemoteFilesDescription: "Khi tùy chọn này bị tắt, các tập tin từ xa sẽ được tải trực tiếp từ máy chủ khác. Điều này sẽ giúp giảm dung lượng lưu trữ nhưng lại tăng lưu lượng truy cập, vì hình thu nhỏ sẽ không được tạo." cacheRemoteFilesDescription: "Khi tùy chọn này bị tắt, các tập tin từ xa sẽ được tải trực tiếp từ máy chủ khác. Điều này sẽ giúp giảm dung lượng lưu trữ nhưng lại tăng lưu lượng truy cập, vì hình thu nhỏ sẽ không được tạo."
flagAsBot: "Đánh dấu đây là tài khoản bot" flagAsBot: "Đánh dấu đây là tài khoản bot"
flagAsBotDescription: "Bật tùy chọn này nếu tài khoản này được kiểm soát bởi một chương trình. Nếu được bật, nó sẽ được đánh dấu để các nhà phát triển khác ngăn chặn chuỗi tương tác vô tận với các bot khác và điều chỉnh hệ thống nội bộ của Misskey để coi tài khoản này như một bot." flagAsBotDescription: "Bật tùy chọn này nếu tài khoản này được kiểm soát bởi một chương trình. Nếu được bật, nó sẽ được đánh dấu để các nhà phát triển khác ngăn chặn chuỗi tương tác vô tận với các bot khác và điều chỉnh hệ thống nội bộ của Misskey để coi tài khoản này như một bot."
flagAsCat: "Tài khoản này là mèo" flagAsCat: "Chế độ Mèeeeeeeeeeo!!"
flagAsCatDescription: "Bật tùy chọn này để đánh dấu tài khoản là một con mèo." flagAsCatDescription: "Nếu mà em là một con mèo thì cứ bật nó kiu mèo mèo mèeeeeeeo!! "
flagShowTimelineReplies: "Hiện lượt trả lời trong bảng tin" flagShowTimelineReplies: "Hiện lượt trả lời trong bảng tin"
flagShowTimelineRepliesDescription: "Hiện lượt trả lời của người bạn theo dõi trên tút của những người khác." flagShowTimelineRepliesDescription: "Hiện lượt trả lời của người bạn theo dõi trên tút của những người khác."
autoAcceptFollowed: "Tự động phê duyệt theo dõi từ những người mà bạn đang theo dõi" autoAcceptFollowed: "Tự động phê duyệt theo dõi từ những người mà bạn đang theo dõi"
@ -155,7 +161,7 @@ setWallpaper: "Đặt ảnh bìa"
removeWallpaper: "Xóa ảnh bìa" removeWallpaper: "Xóa ảnh bìa"
searchWith: "Tìm kiếm: {q}" searchWith: "Tìm kiếm: {q}"
youHaveNoLists: "Bạn chưa có danh sách nào" youHaveNoLists: "Bạn chưa có danh sách nào"
followConfirm: "Bạn có chắc muốn theo dõi {name}" followConfirm: "Bạn theo dõi {name}"
proxyAccount: "Tài khoản proxy" proxyAccount: "Tài khoản proxy"
proxyAccountDescription: "Tài khoản proxy là tài khoản hoạt động như một người theo dõi từ xa cho người dùng trong những điều kiện nhất định. Ví dụ: khi người dùng thêm người dùng từ xa vào danh sách, hoạt động của người dùng từ xa sẽ không được chuyển đến phiên bản nếu không có người dùng cục bộ nào theo dõi người dùng đó, vì vậy tài khoản proxy sẽ theo dõi." proxyAccountDescription: "Tài khoản proxy là tài khoản hoạt động như một người theo dõi từ xa cho người dùng trong những điều kiện nhất định. Ví dụ: khi người dùng thêm người dùng từ xa vào danh sách, hoạt động của người dùng từ xa sẽ không được chuyển đến phiên bản nếu không có người dùng cục bộ nào theo dõi người dùng đó, vì vậy tài khoản proxy sẽ theo dõi."
host: "Host" host: "Host"
@ -198,7 +204,7 @@ blockedUsers: "Người đã chặn"
noUsers: "Chưa có ai" noUsers: "Chưa có ai"
editProfile: "Sửa hồ sơ" editProfile: "Sửa hồ sơ"
noteDeleteConfirm: "Bạn có chắc muốn xóa tút này?" noteDeleteConfirm: "Bạn có chắc muốn xóa tút này?"
pinLimitExceeded: "Bạn đã đạt giới hạn số lượng tút có thể ghim" pinLimitExceeded: "Bạn không thể ghim bài viết nữa"
intro: "Đã cài đặt Misskey! Xin hãy tạo tài khoản admin." intro: "Đã cài đặt Misskey! Xin hãy tạo tài khoản admin."
done: "Xong" done: "Xong"
processing: "Đang xử lý" processing: "Đang xử lý"
@ -253,6 +259,8 @@ noMoreHistory: "Không còn gì để đọc"
startMessaging: "Bắt đầu trò chuyện" startMessaging: "Bắt đầu trò chuyện"
nUsersRead: "đọc bởi {n}" nUsersRead: "đọc bởi {n}"
agreeTo: "Tôi đồng ý {0}" agreeTo: "Tôi đồng ý {0}"
agreeBelow: "Đồng ý với nội dung dưới đây"
basicNotesBeforeCreateAccount: "Những điều cơ bản cần chú ý "
tos: "Điều khoản dịch vụ" tos: "Điều khoản dịch vụ"
start: "Bắt đầu" start: "Bắt đầu"
home: "Trang chính" home: "Trang chính"
@ -339,7 +347,7 @@ pinnedUsersDescription: "Liệt kê mỗi hàng một tên người dùng xuốn
pinnedPages: "Trang đã ghim" pinnedPages: "Trang đã ghim"
pinnedPagesDescription: "Liệt kê các trang thú vị để ghim trên máy chủ." pinnedPagesDescription: "Liệt kê các trang thú vị để ghim trên máy chủ."
pinnedClipId: "ID của clip muốn ghim" pinnedClipId: "ID của clip muốn ghim"
pinnedNotes: "Tút ghim" pinnedNotes: "Bài viết đã ghim"
hcaptcha: "hCaptcha" hcaptcha: "hCaptcha"
enableHcaptcha: "Bật hCaptcha" enableHcaptcha: "Bật hCaptcha"
hcaptchaSiteKey: "Khóa của trang" hcaptchaSiteKey: "Khóa của trang"
@ -348,6 +356,8 @@ recaptcha: "reCAPTCHA"
enableRecaptcha: "Bật reCAPTCHA" enableRecaptcha: "Bật reCAPTCHA"
recaptchaSiteKey: "Khóa của trang" recaptchaSiteKey: "Khóa của trang"
recaptchaSecretKey: "Khóa bí mật" recaptchaSecretKey: "Khóa bí mật"
turnstile: "Turnstile"
enableTurnstile: "Áp dụng Turnstile"
turnstileSiteKey: "Khóa của trang" turnstileSiteKey: "Khóa của trang"
turnstileSecretKey: "Khóa bí mật" turnstileSecretKey: "Khóa bí mật"
avoidMultiCaptchaConfirm: "Dùng nhiều hệ thống Captcha có thể gây nhiễu giữa chúng. Bạn có muốn tắt các hệ thống Captcha khác hiện đang hoạt động không? Nếu bạn muốn chúng tiếp tục được bật, hãy nhấn hủy." avoidMultiCaptchaConfirm: "Dùng nhiều hệ thống Captcha có thể gây nhiễu giữa chúng. Bạn có muốn tắt các hệ thống Captcha khác hiện đang hoạt động không? Nếu bạn muốn chúng tiếp tục được bật, hãy nhấn hủy."
@ -383,13 +393,19 @@ about: "Giới thiệu"
aboutMisskey: "Về Misskey" aboutMisskey: "Về Misskey"
administrator: "Quản trị viên" administrator: "Quản trị viên"
token: "Token" token: "Token"
2fa: "Xác thực 2 yếu tố"
totp: "Ứng dụng xác thực"
totpDescription: "Nhắn mã OTP bằng ứng dụng xác thực"
moderator: "Kiểm duyệt viên" moderator: "Kiểm duyệt viên"
moderation: "Kiểm duyệt" moderation: "Kiểm duyệt"
nUsersMentioned: "Dùng bởi {n} người" nUsersMentioned: "Dùng bởi {n} người"
securityKeyAndPasskey: "Mã bảo mật・Passkey"
securityKey: "Khóa bảo mật" securityKey: "Khóa bảo mật"
lastUsed: "Dùng lần cuối" lastUsed: "Dùng lần cuối"
lastUsedAt: "Lần cuối sử dụng: {t}"
unregister: "Hủy đăng ký" unregister: "Hủy đăng ký"
passwordLessLogin: "Đăng nhập không mật khẩu" passwordLessLogin: "Đăng nhập không mật khẩu"
passwordLessLoginDescription: "Đăng nhập bằng chỉ mã bảo mật hoặc passkey, không sử dụng mật khẩu."
resetPassword: "Đặt lại mật khẩu" resetPassword: "Đặt lại mật khẩu"
newPasswordIs: "Mật khẩu mới là \"{password}\"" newPasswordIs: "Mật khẩu mới là \"{password}\""
reduceUiAnimation: "Giảm chuyển động UI" reduceUiAnimation: "Giảm chuyển động UI"
@ -423,7 +439,7 @@ invitations: "Mời"
invitationCode: "Mã mời" invitationCode: "Mã mời"
checking: "Đang kiểm tra..." checking: "Đang kiểm tra..."
available: "Khả dụng" available: "Khả dụng"
unavailable: "Không khả dụng" unavailable: "Không sử dụng được"
usernameInvalidFormat: "Bạn có thể dùng viết hoa/viết thường, chữ số, và dấu gạch dưới." usernameInvalidFormat: "Bạn có thể dùng viết hoa/viết thường, chữ số, và dấu gạch dưới."
tooShort: "Quá ngắn" tooShort: "Quá ngắn"
tooLong: "Quá dài" tooLong: "Quá dài"
@ -438,9 +454,13 @@ or: "Hoặc"
language: "Ngôn ngữ" language: "Ngôn ngữ"
uiLanguage: "Ngôn ngữ giao diện" uiLanguage: "Ngôn ngữ giao diện"
aboutX: "Giới thiệu {x}" aboutX: "Giới thiệu {x}"
emojiStyle: "Kiểu cách Emoji"
native: "Bản xứ"
disableDrawer: "Không dùng menu thanh bên" disableDrawer: "Không dùng menu thanh bên"
noHistory: "Không có dữ liệu" noHistory: "Không có dữ liệu"
signinHistory: "Lịch sử đăng nhập" signinHistory: "Lịch sử đăng nhập"
enableAdvancedMfm: "Xem bài MFM chất lượng cao."
enableAnimatedMfm: "Xem bài MFM có chuyển động"
doing: "Đang xử lý..." doing: "Đang xử lý..."
category: "Phân loại" category: "Phân loại"
tags: "Thẻ" tags: "Thẻ"
@ -628,7 +648,7 @@ random: "Ngẫu nhiên"
system: "Hệ thống" system: "Hệ thống"
switchUi: "Chuyển đổi giao diện người dùng" switchUi: "Chuyển đổi giao diện người dùng"
desktop: "Desktop" desktop: "Desktop"
clip: "Ghim" clip: "Lưu bài viết"
createNew: "Tạo mới" createNew: "Tạo mới"
optional: "Không bắt buộc" optional: "Không bắt buộc"
createNewClip: "Tạo một ghim mới" createNewClip: "Tạo một ghim mới"
@ -667,7 +687,7 @@ pageLikesCount: "Số lượng trang đã thích"
pageLikedCount: "Số lượng thích trang đã nhận" pageLikedCount: "Số lượng thích trang đã nhận"
contact: "Liên hệ" contact: "Liên hệ"
useSystemFont: "Dùng phông chữ mặc định của hệ thống" useSystemFont: "Dùng phông chữ mặc định của hệ thống"
clips: "Ghim" clips: "Lưu bài viết"
experimentalFeatures: "Tính năng thử nghiệm" experimentalFeatures: "Tính năng thử nghiệm"
developer: "Nhà phát triển" developer: "Nhà phát triển"
makeExplorable: "Không hiện tôi trong \"Khám phá\"" makeExplorable: "Không hiện tôi trong \"Khám phá\""
@ -693,6 +713,7 @@ accentColor: "Màu phụ"
textColor: "Màu chữ" textColor: "Màu chữ"
saveAs: "Lưu thành" saveAs: "Lưu thành"
advanced: "Nâng cao" advanced: "Nâng cao"
advancedSettings: "Cài đặt nâng cao"
value: "Giá trị" value: "Giá trị"
createdAt: "Ngày tạo" createdAt: "Ngày tạo"
updatedAt: "Cập nhật lúc" updatedAt: "Cập nhật lúc"
@ -758,6 +779,7 @@ popularPosts: "Tút được xem nhiều nhất"
shareWithNote: "Chia sẻ kèm với tút" shareWithNote: "Chia sẻ kèm với tút"
ads: "Quảng cáo" ads: "Quảng cáo"
expiration: "Thời hạn" expiration: "Thời hạn"
startingperiod: "Thời gian bắt đầu\n"
memo: "Lưu ý" memo: "Lưu ý"
priority: "Ưu tiên" priority: "Ưu tiên"
high: "Cao" high: "Cao"
@ -790,6 +812,7 @@ lastCommunication: "Lần giao tiếp cuối"
resolved: "Đã xử lý" resolved: "Đã xử lý"
unresolved: "Chờ xử lý" unresolved: "Chờ xử lý"
breakFollow: "Xóa người theo dõi" breakFollow: "Xóa người theo dõi"
breakFollowConfirm: "Bạn bỏ theo dõi tài khoản này không?"
itsOn: "Đã bật" itsOn: "Đã bật"
itsOff: "Đã tắt" itsOff: "Đã tắt"
emailRequiredForSignup: "Yêu cầu địa chỉ email khi đăng ký" emailRequiredForSignup: "Yêu cầu địa chỉ email khi đăng ký"
@ -830,11 +853,13 @@ tenMinutes: "10 phút"
oneHour: "1 giờ" oneHour: "1 giờ"
oneDay: "1 ngày" oneDay: "1 ngày"
oneWeek: "1 tuần" oneWeek: "1 tuần"
oneMonth: "1 tháng"
reflectMayTakeTime: "Có thể mất một thời gian để điều này được áp dụng." reflectMayTakeTime: "Có thể mất một thời gian để điều này được áp dụng."
failedToFetchAccountInformation: "Không thể lấy thông tin tài khoản" failedToFetchAccountInformation: "Không thể lấy thông tin tài khoản"
rateLimitExceeded: "Giới hạn quá mức" rateLimitExceeded: "Giới hạn quá mức"
cropImage: "Cắt hình ảnh" cropImage: "Cắt hình ảnh"
cropImageAsk: "Bạn có muốn cắt ảnh này?" cropImageAsk: "Bạn có muốn cắt ảnh này?"
cropNo: "Để nguyên"
file: "Tập tin" file: "Tập tin"
recentNHours: "{n}h trước" recentNHours: "{n}h trước"
recentNDays: "{n} ngày trước" recentNDays: "{n} ngày trước"
@ -877,15 +902,231 @@ navbar: "Thanh điều hướng"
shuffle: "Xáo trộn" shuffle: "Xáo trộn"
account: "Tài khoản của bạn" account: "Tài khoản của bạn"
move: "Di chuyển" move: "Di chuyển"
pushNotification: "Thông báo đẩy"
subscribePushNotification: "Bật thông báo đẩy"
unsubscribePushNotification: "Tắt thông báo đẩy"
pushNotificationAlreadySubscribed: "Đang bật thông báo đẩy"
sendPushNotificationReadMessage: "Xóa thông báo đẩy sau khi đọc thông báo hay tin nhắn"
sendPushNotificationReadMessageCaption: "Thông báo như {emptyPushNotificationMessage} sẽ hiển thị trong giây phút. Tiêu tốn pin của máy bạn có thể tăng lên hơn nữa."
windowMaximize: "Phóng to"
windowRestore: "Khôi phục"
caption: "Mô tả"
loggedInAsBot: "Đang đăng nhập bằng tài khoản Bot"
tools: "Công Cụ"
cannotLoad: "Không tải được"
numberOfProfileView: "Số lần mở hồ sơ"
like: "Thích" like: "Thích"
unlike: "Bỏ lượt thích"
numberOfLikes: "Lượt thích"
show: "Hiển thị" show: "Hiển thị"
neverShow: "Không hiển thị nữa"
remindMeLater: "Để sau"
didYouLikeMisskey: "Bạn có ưa thích Mískey không?"
pleaseDonate: "Misskey là phần mềm miễn phí mà {host} đang sử dụng. Xin mong bạn quyên góp cho chúng tôi để chúng tôi có thể tiếp tục phát triển dịch vụ này. Xin cảm ơn!!"
roles: "Vai trò"
role: "Vai trò"
normalUser: "Người dùng bình thường"
undefined: "Chưa xác định"
color: "Màu sắc" color: "Màu sắc"
manageCustomEmojis: "Quản lý CustomEmoji"
cannotPerformTemporary: "Tạm thời không sử dụng được"
cannotPerformTemporaryDescription: "Tạm thời không sử dụng được vì lần số điều kiện quá giới hạn. Thử lại sau mọt lát nữa."
achievements: "Thành tích"
gotInvalidResponseError: "Không nhận được trả lời chủ máy"
gotInvalidResponseErrorDescription: "Chủ máy có lẻ ngừng hoạt động hoặc bảo trí. Thử lại sau một lát nữa. "
thisPostMayBeAnnoying: "Bạn đăng bài này có thể làm phiền cho người ta."
thisPostMayBeAnnoyingHome: "Đăng trên trang chính"
thisPostMayBeAnnoyingCancel: "Từ chối"
thisPostMayBeAnnoyingIgnore: "Đăng bài để nguyên"
collapseRenotes: "Không hiển thị bài viết đã từng xem"
internalServerError: "Lỗi trong chủ máy"
internalServerErrorDescription: "Trong chủ máy lỗi bất ngờ xảy ra"
copyErrorInfo: "Sao chép thông tin lỗi"
joinThisServer: "Đăng ký trên chủ máy này"
exploreOtherServers: "Tìm chủ máy khác"
letsLookAtTimeline: "Thử xem Timeline"
_achievements:
earnedAt: "Ngày thu nhận"
_types:
_notes1:
title: "just setting up my msky"
description: "Lần đầu tiên đăng bài"
flavor: "Chúc bạn trên Miskey vui vẻ nha!!"
_notes10:
title: "Một số bài viết"
description: "Đăng bài 10 lần"
_notes100:
title: "Rất nhiều bài biết"
description: "Đăng bài 100 lần"
_notes500:
title: "Như đầy bài viết"
description: "Đăng bài 500 lần"
_notes1000:
title: "Ngọn núi bài viết"
description: "Đăng bài 1000 lần"
_notes5000:
title: "Bài viết chảy như suối"
description: "Đăng bài 5000 lần"
_notes10000:
title: "Bài Viết siu nhìu"
description: "Đăng bài 10000 lần"
_notes20000:
title: "Need more note"
description: "Đã đăng bài 20,000 lần rồi"
_notes30000:
title: "ĐĂNG VỚI BÀI"
description: "Đã đăng bài 30,000 lần rồi"
_notes40000:
title: "Nhà xưởng dăng bài"
description: "Đã đăng bài 40,000 lần rồi"
_notes50000:
title: "Hàng tinh đăng bài"
description: "Đã đăng bài 50,000 lần rồi"
_notes100000:
flavor: "Liệu viết bài gì tầm này vậy? "
_login3:
title: "Sơ cấp I"
description: "Tổng số ngày đăng nhập đạt 3 ngày"
flavor: "Từ nay các bạn cứ xem như mình là một Misskist đó"
_login7:
title: "Sơ cấp II"
description: "Tổng số ngày đăng nhập đạt 7 ngày"
flavor: "Bạn dần quen chưa? "
_login15:
title: "Sơ cấp III"
description: "Tổng số ngày đăng nhập đạt 7 ngày"
_login30:
title: "Misskist cấp I"
description: "Tổng số ngày đăng nhập đạt 30 ngày"
_login60:
title: "Misskist cấp II"
description: "Tổng số ngày đăng nhập đạt 60 ngày"
_login100:
title: "Misskist cấp III"
description: "Tổng số ngày đăng nhập đạt 100 ngày"
flavor: "Người dùng này, chính vì đó là một Misskist"
_login200:
title: "Khách hàng thường xuyên cấp I"
description: "Tổng số ngày đăng nhập đạt 200 ngày"
_login300:
title: "Khách hàng thường xuyên cấp II"
description: "Tổng số ngày đăng nhập đạt 300 ngày"
_login400:
title: "Khách hàng thường xuyên cấp III"
description: "Tổng số ngày đăng nhập đạt 400 ngày"
_markedAsCat:
title: "Tôi là một con mèo"
description: "Bật chế độ mèo"
flavor: "Mà tên chưa có"
_following1:
title: "Theo dõi đầu tiên"
description: "Lần đầu tiên theo dõi "
_following10:
title: "Cứ theo dõi và theo dõi"
description: "Vừa theo dõi hơn 10 người"
_following50:
title: "Bạn bè nhiều quá"
description: "Vừa theo dõi hơn 50 người"
_following100:
title: "Trăm bạn bè"
description: "Vừa theo dõi vượt lên 100 người"
_following300:
title: "Quá nhiều bạn bè"
description: "Vừa theo dõi vượt lên 300 người"
_followers1:
title: "Ai đầu tiên theo dõi bạn"
description: "Lần đầu tiên được theo dõi"
_followers10:
title: "FOLLOW ME!!"
description: "Người theo dõi bạn vượt lên 10 người"
_followers500:
title: "Trạm phát sóng"
_followers1000:
title: "Người có tầm ảnh hưởng"
description: "Người theo dõi bạn vượt lên 1000 người"
_collectAchievements30:
title: "Người sưu tập thành tích"
description: "Vừa lấy thành tích hơn 30 cái"
_viewAchievements3min:
title: "Yêu Thành tích"
description: "Ngắm danh sách thành tích đến tận hơn 3 phút"
_iLoveMisskey:
title: "Tôi Yêu Misskey"
description: "Đăng lời nói \"I ❤ #Misskey\""
flavor: "Xin chân thành cảm ơn bạn đã sử dụng Misskey!! by Đội ngũ phát triển"
_foundTreasure:
title: "Tìm kiếm kho báu"
description: "Tìm thấy được những kho báu cất giấu"
_client30min:
title: "Giải lao xỉu"
_noteDeletedWithin1min:
title: "Xem như không có gì đâu nha"
_postedAtLateNight:
title: "Loài ăn đêm"
description: "Đăng bài trong đêm khuya "
_postedAt0min0sec:
title: "Tín hiệu báo giờ"
description: "Đăng bài vào 0 phút 0 giây"
flavor: "Piiiiiii ĐÂY LÀ TIẾNG NÓI VIỆT NAM"
_selfQuote:
title: "Nói đến bản thân"
description: "Trích dẫn bài viết của mình"
_htl20npm:
title: "Timeline trôi như con sông"
description: "Timeline trang chính tốc độ vượt lên 20npm"
_viewInstanceChart:
title: "Nhà phân tích"
description: "Xem biểu đồ của chủ máy"
_outputHelloWorldOnScratchpad:
title: "Chào thế giới!"
_open3windows:
title: "Nhiều cửa sổ"
description: "Mở cửa sổ hơn 3 cửa sổ"
_reactWithoutRead:
title: "Bài này bạn đọc kỹ chứ? "
description: "Phản hồi trong vọng 3 giây sau bài viết có hơn 100 ký tự mới được đăng lên"
_clickedClickHere:
title: "Bấm đây"
description: "Bấm chỗ này"
_justPlainLucky:
title: "Chỉ là một cuộc máy mắn"
description: "Mỗi 10 giây thu nhận được với tỷ lệ 0.005%"
_setNameToSyuilo:
title: "Ngưỡng mộ với vị thần"
description: "Đạt tên là syuilo"
_loggedInOnBirthday:
title: "Sinh nhật vủi vẻ"
description: "Đăng nhập vào ngày sinh"
_loggedInOnNewYearsDay:
title: "Chức mừng năm mới"
description: "Đăng nhập vào Tết Nguyên đàn dương lịch"
flavor: "Chúc bạn năm mới AN KHANG THỊNH VƯỢNG, VẠN SỰ NHƯ Ý!!"
_cookieClicked:
flavor: "Bạn nhầm phầm mềm chứ?"
_role: _role:
priority: "Ưu tiên" priority: "Ưu tiên"
_priority: _priority:
low: "Thấp" low: "Thấp"
middle: "Vừa" middle: "Vừa"
high: "Cao" high: "Cao"
_options:
gtlAvailable: "Xem Timeline xã hội"
ltlAvailable: "Xem Timeline trong máy chủ này"
canPublicNote: "Cho phép đăng bài công khai"
canManageCustomEmojis: "Quản lý CustomEmoji"
driveCapacity: "Dữ liệu Drive"
pinMax: "Giới hạn ghim bài viết"
antennaMax: "Giới hạn tạo ăng ten"
canHideAds: "Tắt quảng cáo"
_condition:
createdMoreThan: "Trôi qua sau khi lập tài khoản"
followersLessThanOrEq: "Người theo dõi ít hơn "
followersMoreThanOrEq: "Người theo dõi có trở lên"
followingLessThanOrEq: "Theo dõi ít hơn "
followingMoreThanOrEq: "Theo dõi có trở lên"
and: ""
or: " hay là "
not: "Không phải "
_sensitiveMediaDetection: _sensitiveMediaDetection:
description: "Giảm nỗ lực kiểm duyệt máy chủ thông qua việc tự động nhận dạng media NSFW thông qua học máy. Điều này sẽ làm tăng một chút áp lực trên máy chủ." description: "Giảm nỗ lực kiểm duyệt máy chủ thông qua việc tự động nhận dạng media NSFW thông qua học máy. Điều này sẽ làm tăng một chút áp lực trên máy chủ."
sensitivity: "Phát hiện nhạy cảm" sensitivity: "Phát hiện nhạy cảm"
@ -1132,15 +1373,23 @@ _tutorial:
step7_1: "Xin chúc mừng! Bây giờ bạn đã hoàn thành phần hướng dẫn cơ bản của Misskey." step7_1: "Xin chúc mừng! Bây giờ bạn đã hoàn thành phần hướng dẫn cơ bản của Misskey."
step7_2: "Nếu bạn muốn tìm hiểu thêm về Misskey, hãy thử phần {help}." step7_2: "Nếu bạn muốn tìm hiểu thêm về Misskey, hãy thử phần {help}."
step7_3: "Bây giờ, chúc may mắn và vui vẻ với Misskey! 🚀" step7_3: "Bây giờ, chúc may mắn và vui vẻ với Misskey! 🚀"
step8_1: "Cuối cùng, bạn hãy bật thông báo đẩy nha!"
step8_2: "Nhận thông báo đẩy bạn sẽ có thể thấy phản hồi, theo dõi, lượt nhắc được trong khi đóng Misskey"
_2fa: _2fa:
alreadyRegistered: "Bạn đã đăng ký thiết bị xác minh 2 bước." alreadyRegistered: "Bạn đã đăng ký thiết bị xác minh 2 bước."
passwordToTOTP: "Nhắn mật mã"
step1: "Trước tiên, hãy cài đặt một ứng dụng xác minh (chẳng hạn như {a} hoặc {b}) trên thiết bị của bạn." step1: "Trước tiên, hãy cài đặt một ứng dụng xác minh (chẳng hạn như {a} hoặc {b}) trên thiết bị của bạn."
step2: "Sau đó, quét mã QR hiển thị trên màn hình này." step2: "Sau đó, quét mã QR hiển thị trên màn hình này."
step2Url: "Bạn cũng có thể nhập URL này nếu sử dụng một chương trình máy tính:" step2Url: "Bạn cũng có thể nhập URL này nếu sử dụng một chương trình máy tính:"
step3: "Nhập mã token do ứng dụng của bạn cung cấp để hoàn tất thiết lập." step3: "Nhập mã token do ứng dụng của bạn cung cấp để hoàn tất thiết lập."
step4: "Kể từ bây giờ, những lần đăng nhập trong tương lai sẽ yêu cầu mã token đăng nhập đó." step4: "Kể từ bây giờ, những lần đăng nhập trong tương lai sẽ yêu cầu mã token đăng nhập đó."
securityKeyInfo: "Bên cạnh xác minh bằng vân tay hoặc mã PIN, bạn cũng có thể thiết lập xác minh thông qua khóa bảo mật phần cứng hỗ trợ FIDO2 để bảo mật hơn nữa cho tài khoản của mình." securityKeyInfo: "Bên cạnh xác minh bằng vân tay hoặc mã PIN, bạn cũng có thể thiết lập xác minh thông qua khóa bảo mật phần cứng hỗ trợ FIDO2 để bảo mật hơn nữa cho tài khoản của mình."
removeKey: "Xóa mã bảo mật"
removeKeyConfirm: "Xóa bản sao lưu {name}?" removeKeyConfirm: "Xóa bản sao lưu {name}?"
renewTOTP: "Cài đặt lại ứng dụng xác thực"
renewTOTPConfirm: "Mã xác nhận cũ của ứng dụng xác thực không thể sử dụng được nữa"
renewTOTPOk: "Cài đặt lại"
renewTOTPCancel: "Không, cảm ơn"
_permissions: _permissions:
"read:account": "Xem thông tin tài khoản của bạn" "read:account": "Xem thông tin tài khoản của bạn"
"write:account": "Sửa thông tin tài khoản của bạn" "write:account": "Sửa thông tin tài khoản của bạn"
@ -1175,12 +1424,15 @@ _permissions:
"read:gallery-likes": "Xem danh sách các tút đã thích trong thư viện của tôi" "read:gallery-likes": "Xem danh sách các tút đã thích trong thư viện của tôi"
"write:gallery-likes": "Sửa danh sách các tút đã thích trong thư viện của tôi" "write:gallery-likes": "Sửa danh sách các tút đã thích trong thư viện của tôi"
_auth: _auth:
shareAccessTitle: "Cho phép truy cập app"
shareAccess: "Bạn có muốn cho phép \"{name}\" truy cập vào tài khoản này không?" shareAccess: "Bạn có muốn cho phép \"{name}\" truy cập vào tài khoản này không?"
shareAccessAsk: "Bạn có chắc muốn cho phép ứng dụng này truy cập vào tài khoản của mình không?" shareAccessAsk: "Bạn có chắc muốn cho phép ứng dụng này truy cập vào tài khoản của mình không?"
permission: "{name} đang yêu cầu quyền hạn dưới đây"
permissionAsk: "Ứng dụng này yêu cầu các quyền sau" permissionAsk: "Ứng dụng này yêu cầu các quyền sau"
pleaseGoBack: "Vui lòng quay lại ứng dụng" pleaseGoBack: "Vui lòng quay lại ứng dụng"
callback: "Quay lại ứng dụng" callback: "Quay lại ứng dụng"
denied: "Truy cập bị từ chối" denied: "Truy cập bị từ chối"
pleaseLogin: "Bạn phải đăng nhập để cho ứng dụng phép truy cập"
_antennaSources: _antennaSources:
all: "Toàn bộ tút" all: "Toàn bộ tút"
homeTimeline: "Tút từ những người đã theo dõi" homeTimeline: "Tút từ những người đã theo dõi"
@ -1218,9 +1470,12 @@ _widgets:
jobQueue: "Công việc chờ xử lý" jobQueue: "Công việc chờ xử lý"
serverMetric: "Thống kê máy chủ" serverMetric: "Thống kê máy chủ"
aiscript: "AiScript console" aiscript: "AiScript console"
aiscriptApp: "AiScript App"
aichan: "Ai" aichan: "Ai"
userList: "Danh sách người dùng"
_userList: _userList:
chooseList: "Chọn danh sách" chooseList: "Chọn danh sách"
clicker: "clicker"
_cw: _cw:
hide: "Ẩn" hide: "Ẩn"
show: "Tải thêm" show: "Tải thêm"
@ -1257,6 +1512,8 @@ _visibility:
followersDescription: "Dành riêng cho người theo dõi" followersDescription: "Dành riêng cho người theo dõi"
specified: "Nhắn riêng" specified: "Nhắn riêng"
specifiedDescription: "Chỉ người được nhắc đến mới thấy" specifiedDescription: "Chỉ người được nhắc đến mới thấy"
disableFederation: "Không liên hợp"
disableFederationDescription: "Không đưa tin cho chủ máy khác"
_postForm: _postForm:
replyPlaceholder: "Trả lời tút này" replyPlaceholder: "Trả lời tút này"
quotePlaceholder: "Trích dẫn tút này" quotePlaceholder: "Trích dẫn tút này"
@ -1266,7 +1523,7 @@ _postForm:
b: "Hôm nay bạn có gì vui?" b: "Hôm nay bạn có gì vui?"
c: "Bạn đang nghĩ gì?" c: "Bạn đang nghĩ gì?"
d: "Bạn muốn nói gì?" d: "Bạn muốn nói gì?"
e: "Bắt đầu viết..." e: "Cứ viết trên đây"
f: "Đang chờ bạn viết..." f: "Đang chờ bạn viết..."
_profile: _profile:
name: "Tên" name: "Tên"
@ -1282,6 +1539,7 @@ _profile:
changeBanner: "Đổi ảnh bìa" changeBanner: "Đổi ảnh bìa"
_exportOrImport: _exportOrImport:
allNotes: "Toàn bộ tút" allNotes: "Toàn bộ tút"
favoritedNotes: "Bài viết đã thích"
followingList: "Đang theo dõi" followingList: "Đang theo dõi"
muteList: "Ẩn" muteList: "Ẩn"
blockingList: "Chặn" blockingList: "Chặn"
@ -1320,7 +1578,16 @@ _timelines:
social: "Xã hội" social: "Xã hội"
global: "Liên hợp" global: "Liên hợp"
_play: _play:
new: "Tạo Play mới"
edit: "Edit play"
created: "Bạn vừa tạo play rồi"
updated: "Bạn vừa cập nhật play rồi"
deleted: "Bạn vừa xóa play rồi"
pageSetting: "Cài đặt play"
editThisPage: "Edit play này"
viewSource: "Xem mã nguồn" viewSource: "Xem mã nguồn"
my: "Play của mình"
liked: "Play đã thích"
featured: "Nổi tiếng" featured: "Nổi tiếng"
title: "Tựa đề" title: "Tựa đề"
script: "Kịch bản" script: "Kịch bản"
@ -1388,7 +1655,9 @@ _notification:
youReceivedFollowRequest: "Bạn vừa có một yêu cầu theo dõi" youReceivedFollowRequest: "Bạn vừa có một yêu cầu theo dõi"
yourFollowRequestAccepted: "Yêu cầu theo dõi của bạn đã được chấp nhận" yourFollowRequestAccepted: "Yêu cầu theo dõi của bạn đã được chấp nhận"
pollEnded: "Cuộc bình chọn đã kết thúc" pollEnded: "Cuộc bình chọn đã kết thúc"
unreadAntennaNote: "Ăng ten"
emptyPushNotificationMessage: "Đã cập nhật thông báo đẩy" emptyPushNotificationMessage: "Đã cập nhật thông báo đẩy"
achievementEarned: "Hoàn thành Achievement"
_types: _types:
all: "Toàn bộ" all: "Toàn bộ"
follow: "Đang theo dõi" follow: "Đang theo dõi"
@ -1400,6 +1669,7 @@ _notification:
pollEnded: "Bình chọn kết thúc" pollEnded: "Bình chọn kết thúc"
receiveFollowRequest: "Yêu cầu theo dõi" receiveFollowRequest: "Yêu cầu theo dõi"
followRequestAccepted: "Yêu cầu theo dõi được chấp nhận" followRequestAccepted: "Yêu cầu theo dõi được chấp nhận"
achievementEarned: "Hoàn thành Achievement"
app: "Từ app liên kết" app: "Từ app liên kết"
_actions: _actions:
followBack: "đã theo dõi lại bạn" followBack: "đã theo dõi lại bạn"
@ -1432,3 +1702,6 @@ _deck:
channel: "Kênh" channel: "Kênh"
mentions: "Lượt nhắc" mentions: "Lượt nhắc"
direct: "Nhắn riêng" direct: "Nhắn riêng"
_dialog:
charactersExceeded: "Bạn nhắn quá giới hạn ký tự!! Hiện nay {current} / giới hạn {max}"
charactersBelow: "Bạn nhắn quá ít tối thiểu ký tự!! Hiện nay {current} / Tối thiểu {min}"

View File

@ -457,6 +457,7 @@ aboutX: "關於{x}"
emojiStyle: "表情符號的風格" emojiStyle: "表情符號的風格"
native: "原生" native: "原生"
disableDrawer: "不顯示下拉式選單" disableDrawer: "不顯示下拉式選單"
showNoteActionsOnlyHover: "僅在游標停留時顯示貼文的操作選項"
noHistory: "沒有歷史紀錄" noHistory: "沒有歷史紀錄"
signinHistory: "登入歷史" signinHistory: "登入歷史"
enableAdvancedMfm: "啟用高級MFM" enableAdvancedMfm: "啟用高級MFM"
@ -853,6 +854,7 @@ tenMinutes: "10分鐘"
oneHour: "1小時" oneHour: "1小時"
oneDay: "1天" oneDay: "1天"
oneWeek: "1週" oneWeek: "1週"
oneMonth: "1個月"
reflectMayTakeTime: "可能需要一些時間才會出現效果。" reflectMayTakeTime: "可能需要一些時間才會出現效果。"
failedToFetchAccountInformation: "取得帳戶資訊失敗" failedToFetchAccountInformation: "取得帳戶資訊失敗"
rateLimitExceeded: "已超過速率限制" rateLimitExceeded: "已超過速率限制"
@ -952,6 +954,7 @@ joinThisServer: "在此伺服器上註冊"
exploreOtherServers: "探索其他伺服器" exploreOtherServers: "探索其他伺服器"
letsLookAtTimeline: "看看時間軸" letsLookAtTimeline: "看看時間軸"
disableFederationWarn: "聯邦被停用了。即使停用也不會讓您的貼文不公開,在大多數情況下,不需要啟用這個選項。" disableFederationWarn: "聯邦被停用了。即使停用也不會讓您的貼文不公開,在大多數情況下,不需要啟用這個選項。"
invitationRequiredToRegister: "目前這個伺服器為邀請制,必須擁有邀請碼才能註冊。"
_achievements: _achievements:
earnedAt: "獲得日期" earnedAt: "獲得日期"
_types: _types:

View File

@ -1,6 +1,6 @@
{ {
"name": "misskey", "name": "misskey",
"version": "13.9.0", "version": "13.9.1",
"codename": "nasubi", "codename": "nasubi",
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -1,5 +1,5 @@
import { forwardRef, Inject, Injectable } from '@nestjs/common'; import { forwardRef, Inject, Injectable } from '@nestjs/common';
import { DataSource, In } from 'typeorm'; import { DataSource } from 'typeorm';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import type { NotesRepository, DriveFilesRepository } from '@/models/index.js'; import type { NotesRepository, DriveFilesRepository } from '@/models/index.js';
import type { Config } from '@/config.js'; import type { Config } from '@/config.js';
@ -21,7 +21,6 @@ type PackOptions = {
}; };
import { bindThis } from '@/decorators.js'; import { bindThis } from '@/decorators.js';
import { isMimeImage } from '@/misc/is-mime-image.js'; import { isMimeImage } from '@/misc/is-mime-image.js';
import { isNotNull } from '@/misc/is-not-null.js';
@Injectable() @Injectable()
export class DriveFileEntityService { export class DriveFileEntityService {
@ -256,29 +255,10 @@ export class DriveFileEntityService {
@bindThis @bindThis
public async packMany( public async packMany(
files: DriveFile[], files: (DriveFile['id'] | DriveFile)[],
options?: PackOptions, options?: PackOptions,
): Promise<Packed<'DriveFile'>[]> { ): Promise<Packed<'DriveFile'>[]> {
const items = await Promise.all(files.map(f => this.packNullable(f, options))); const items = await Promise.all(files.map(f => this.packNullable(f, options)));
return items.filter((x): x is Packed<'DriveFile'> => x != null); return items.filter((x): x is Packed<'DriveFile'> => x != null);
} }
@bindThis
public async packManyByIdsMap(
fileIds: DriveFile['id'][],
options?: PackOptions,
): Promise<Map<Packed<'DriveFile'>['id'], Packed<'DriveFile'>>> {
const files = await this.driveFilesRepository.findBy({ id: In(fileIds) });
const packedFiles = await this.packMany(files, options);
return new Map(packedFiles.map(f => [f.id, f]));
}
@bindThis
public async packManyByIds(
fileIds: DriveFile['id'][],
options?: PackOptions,
): Promise<Packed<'DriveFile'>[]> {
const filesMap = await this.packManyByIdsMap(fileIds, options);
return fileIds.map(id => filesMap.get(id)).filter(isNotNull);
}
} }

View File

@ -41,8 +41,7 @@ export class GalleryPostEntityService {
title: post.title, title: post.title,
description: post.description, description: post.description,
fileIds: post.fileIds, fileIds: post.fileIds,
// TODO: packMany causes N+1 queries files: this.driveFileEntityService.packMany(post.fileIds),
files: this.driveFileEntityService.packManyByIds(post.fileIds),
tags: post.tags.length > 0 ? post.tags : undefined, tags: post.tags.length > 0 ? post.tags : undefined,
isSensitive: post.isSensitive, isSensitive: post.isSensitive,
likedCount: post.likedCount, likedCount: post.likedCount,

View File

@ -11,7 +11,6 @@ import type { Note } from '@/models/entities/Note.js';
import type { NoteReaction } from '@/models/entities/NoteReaction.js'; import type { NoteReaction } from '@/models/entities/NoteReaction.js';
import type { UsersRepository, NotesRepository, FollowingsRepository, PollsRepository, PollVotesRepository, NoteReactionsRepository, ChannelsRepository, DriveFilesRepository } from '@/models/index.js'; import type { UsersRepository, NotesRepository, FollowingsRepository, PollsRepository, PollVotesRepository, NoteReactionsRepository, ChannelsRepository, DriveFilesRepository } from '@/models/index.js';
import { bindThis } from '@/decorators.js'; import { bindThis } from '@/decorators.js';
import { isNotNull } from '@/misc/is-not-null.js';
import type { OnModuleInit } from '@nestjs/common'; import type { OnModuleInit } from '@nestjs/common';
import type { CustomEmojiService } from '../CustomEmojiService.js'; import type { CustomEmojiService } from '../CustomEmojiService.js';
import type { ReactionService } from '../ReactionService.js'; import type { ReactionService } from '../ReactionService.js';
@ -258,7 +257,6 @@ export class NoteEntityService implements OnModuleInit {
skipHide?: boolean; skipHide?: boolean;
_hint_?: { _hint_?: {
myReactions: Map<Note['id'], NoteReaction | null>; myReactions: Map<Note['id'], NoteReaction | null>;
packedFiles: Map<Note['fileIds'][number], Packed<'DriveFile'>>;
}; };
}, },
): Promise<Packed<'Note'>> { ): Promise<Packed<'Note'>> {
@ -286,7 +284,6 @@ export class NoteEntityService implements OnModuleInit {
const reactionEmojiNames = Object.keys(note.reactions) const reactionEmojiNames = Object.keys(note.reactions)
.filter(x => x.startsWith(':') && x.includes('@') && !x.includes('@.')) // リモートカスタム絵文字のみ .filter(x => x.startsWith(':') && x.includes('@') && !x.includes('@.')) // リモートカスタム絵文字のみ
.map(x => this.reactionService.decodeReaction(x).reaction.replaceAll(':', '')); .map(x => this.reactionService.decodeReaction(x).reaction.replaceAll(':', ''));
const packedFiles = options?._hint_?.packedFiles;
const packed: Packed<'Note'> = await awaitAll({ const packed: Packed<'Note'> = await awaitAll({
id: note.id, id: note.id,
@ -307,7 +304,7 @@ export class NoteEntityService implements OnModuleInit {
emojis: host != null ? this.customEmojiService.populateEmojis(note.emojis, host) : undefined, emojis: host != null ? this.customEmojiService.populateEmojis(note.emojis, host) : undefined,
tags: note.tags.length > 0 ? note.tags : undefined, tags: note.tags.length > 0 ? note.tags : undefined,
fileIds: note.fileIds, fileIds: note.fileIds,
files: packedFiles != null ? note.fileIds.map(fi => packedFiles.get(fi)).filter(isNotNull) : this.driveFileEntityService.packManyByIds(note.fileIds), files: this.driveFileEntityService.packMany(note.fileIds),
replyId: note.replyId, replyId: note.replyId,
renoteId: note.renoteId, renoteId: note.renoteId,
channelId: note.channelId ?? undefined, channelId: note.channelId ?? undefined,
@ -391,14 +388,11 @@ export class NoteEntityService implements OnModuleInit {
} }
await this.customEmojiService.prefetchEmojis(this.customEmojiService.aggregateNoteEmojis(notes)); await this.customEmojiService.prefetchEmojis(this.customEmojiService.aggregateNoteEmojis(notes));
const fileIds = notes.flatMap(n => n.fileIds);
const packedFiles = await this.driveFileEntityService.packManyByIdsMap(fileIds);
return await Promise.all(notes.map(n => this.pack(n, me, { return await Promise.all(notes.map(n => this.pack(n, me, {
...options, ...options,
_hint_: { _hint_: {
myReactions: myReactionsMap, myReactions: myReactionsMap,
packedFiles,
}, },
}))); })));
} }