diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 8c5cc5ba15..6971c840ad 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,9 +2,17 @@ "recommendations": [ "editorconfig.editorconfig", "rome.rome", - "Vue.volar", - "Vue.vscode-typescript-vue-plugin", + "vue.volar", + "vue.vscode-typescript-vue-plugin", "arcanis.vscode-zipfs", - "Orta.vscode-twoslash-queries" + "orta.vscode-twoslash-queries", + "antfu.iconify", + "vivaxy.vscode-conventional-commits", + "ms-azuretools.vscode-docker", + "gitlab.gitlab-workflow", + "mrmlnc.vscode-json5", + "esbenp.prettier-vscode", + "redhat.vscode-yaml", + "yoavbls.pretty-ts-errors" ] } diff --git a/README.md b/README.md index 63bc99aa96..42af4aa9e6 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ If you have access to a server that supports one of the sources below, I recomme - 🐢 At least [NodeJS](https://nodejs.org/en/) v18.16.0 (v20 recommended) - 🐘 At least [PostgreSQL](https://www.postgresql.org/) v12 (v14 recommended) -- 🍱 At least [Redis](https://redis.io/) v6 (v7 recommended) +- 🍱 At least [Redis](https://redis.io/) v7 - Web Proxy (one of the following) - 🍀 Nginx (recommended) - 🦦 Caddy diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index a4571a075f..098c97a409 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -71,7 +71,7 @@ driveFileDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer le fichier \"{n \ ? Il sera retiré de toutes les publications qui le contiennent comme pièce-jointe." unfollowConfirm: "Désirez-vous vous désabonner de {name} ?" exportRequested: "Vous avez demandé une exportation. L’opération pourrait prendre - un peu de temps. Une terminée, le fichier résultant sera ajouté au Drive." + un peu de temps. Une fois terminée, le fichier résultant sera ajouté au Drive." importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de temps." lists: "Listes" noLists: "Vous n’avez aucune liste" diff --git a/locales/id-ID.yml b/locales/id-ID.yml index 39374c2084..2c9331319f 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -74,7 +74,7 @@ exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Sete importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat." lists: "Daftar" noLists: "Kamu tidak memiliki daftar apapun" -note: "Postingan" +note: "Posting" notes: "Postingan" following: "Ikuti" followers: "Pengikut" @@ -1837,7 +1837,7 @@ _notification: followBack: "Ikuti Kembali" reply: "Balas" renote: "Posting ulang" - reacted: berekasi ke postinganmu + reacted: mereaksi postinganmu renoted: memposting ulang postinganmu voted: memilih di angketmu _deck: diff --git a/locales/it-IT.yml b/locales/it-IT.yml index acaee0750a..9bd45fa573 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -76,8 +76,8 @@ lists: "Liste" noLists: "Nessuna lista" note: "Post" notes: "Post" -following: "Follows" -followers: "Followers" +following: "Chi segui" +followers: "Chi ti segue" followsYou: "Ti segue" createList: "Aggiungi una nuova lista" manageLists: "Gestisci liste" @@ -92,13 +92,13 @@ youShouldUpgradeClient: "Per visualizzare la pagina è necessario aggiornare il alla nuova versione e ricaricare." enterListName: "Nome della lista" privacy: "Privacy" -makeFollowManuallyApprove: "Richiedi di approvare i follower manualmente" +makeFollowManuallyApprove: "Approva manualmente le richieste di follow" defaultNoteVisibility: "Privacy predefinita dei post" follow: "Segui" followRequest: "Richiesta di follow" followRequests: "Richieste di follow" unfollow: "Smetti di seguire" -followRequestPending: "La richiesta di follow deve essere approvata" +followRequestPending: "Richiesta di follow in approvazione" enterEmoji: "Inserisci emoji" renote: "Boost" unrenote: "Annulla boost" @@ -154,8 +154,7 @@ flagAsBotDescription: "Se l'account esegue principalmente operazioni automatiche i sistemi interni di Firefish perché trattino questo account come un bot." flagAsCat: "Io sono un gatto" flagAsCatDescription: "Abilita l'opzione \"Io sono un gatto\" per l'account." -autoAcceptFollowed: "Accetta automaticamente le richieste di follow da utenti che - già segui" +autoAcceptFollowed: "Accetta in automatico i follow dagli account che segui" addAccount: "Aggiungi account" loginFailed: "Accesso non riuscito" showOnRemote: "Apri la pagina di origine" @@ -165,7 +164,7 @@ setWallpaper: "Imposta sfondo" removeWallpaper: "Elimina lo sfondo" searchWith: "Cerca: {q}" youHaveNoLists: "Non hai ancora creato nessuna lista" -followConfirm: "Sei sicur@ di voler seguire {name}?" +followConfirm: "Confermi di voler seguire {name}?" proxyAccount: "Account proxy" proxyAccountDescription: "Un account proxy è un account che funziona da follower remoto sotto certe condizioni. Ad esempio, quando un utente aggiunge un utente remoto a @@ -229,8 +228,8 @@ all: "Tutti" subscribing: "Iscrivendo" publishing: "Pubblicando" notResponding: "Nessuna risposta" -instanceFollowing: "Seguiti su questo server" -instanceFollowers: "Follower del server" +instanceFollowing: "Seguiti da te su questo server" +instanceFollowers: "Chi ti segue su questo server" instanceUsers: "Utenti del server" changePassword: "Aggiorna Password" security: "Sicurezza" @@ -383,7 +382,7 @@ enableServiceworker: "Abilita ServiceWorker" antennaUsersDescription: "Inserisci solo un nome utente per riga" caseSensitive: "Sensibile alla distinzione tra maiuscole e minuscole" withReplies: "Includere le risposte" -connectedTo: "Sei conness@ agli account qui sotto:" +connectedTo: "Stai seguendo questi account" notesAndReplies: "Post e risposte" withFiles: "Con file in allegato" silence: "Silenzia" @@ -485,7 +484,7 @@ createAccount: "Crea il tuo account" existingAccount: "Account esistente" regenerate: "Generare di nuovo" fontSize: "Dimensione carattere" -noFollowRequests: "Non hai alcuna richiesta di follow" +noFollowRequests: "Non ci sono richieste di follow" openImageInNewTab: "Aprire immagini in una nuova scheda" dashboard: "Pannello di controllo" local: "Locale" @@ -560,9 +559,9 @@ disablePagesScript: "Disabilita AiScript nelle pagine" updateRemoteUser: "Aggiornare le informazioni di utente remot@" deleteAllFiles: "Elimina tutti i file" deleteAllFilesConfirm: "Vuoi davvero eliminare tutti i file?" -removeAllFollowing: "Cancella tutti i follows" -removeAllFollowingDescription: "Cancella tutti i follow verso il server {host}. È - utile soprattutto se per esempio il server non esiste più." +removeAllFollowing: "Smetti di seguire tutti" +removeAllFollowingDescription: "Smetti di seguire tutti gli account del server {host}. + È utile specialmente se il server non esiste più." userSuspended: "L'utente è sospes@." userSilenced: "L'utente è silenziat@." yourAccountSuspendedTitle: "Questo account è sospeso." @@ -704,14 +703,13 @@ driveUsage: "Utilizzazione del Drive" noCrawle: "Rifiuta l'indicizzazione dai robot." noCrawleDescription: "Richiedi ai motori di ricerca di non indicizzare la tua pagina del profilo, i tuoi post, pagine, ecc." -lockedAccountInfo: "I tuoi post saranno visibili a tutti, a meno che non imposti la - visibilità a \"Solo ai follower\", anche se hai configurato l'account per confermare - manualmente le richieste di follow." +lockedAccountInfo: "Se non imposti la visibilità a \"Solo chi ti segue\", i singoli + post saranno visibili a tutti, anche se per seguirti è necessaria la tua approvazione." alwaysMarkSensitive: "Segnare i media come sensibili per impostazione predefinita" loadRawImages: "Visualizza le intere immagini allegate invece delle miniature." disableShowingAnimatedImages: "Disabilita le immagini animate" -verificationEmailSent: "Una mail di verifica è stata inviata. Si prega di accedere - al collegamento per compiere la verifica." +verificationEmailSent: "Una mail di verifica è stata inviata. Clicca sul link per + completare la verifica." notSet: "Non impostato" emailVerified: "Il tuo indirizzo email è stato verificato" noteFavoritesCount: "Numero di post preferiti" @@ -845,7 +843,7 @@ aiChanMode: "Modalità Ai" keepCw: "Mantieni il CW" resolved: "Risolto" unresolved: "Non risolto" -breakFollow: "Smetti di seguire" +breakFollow: "Rimuovi follower" itsOn: "Abilitato" itsOff: "Disabilitato" emailRequiredForSignup: "È necessario un indirizzo mail per registrare un account" @@ -886,7 +884,7 @@ _emailUnavailable: smtp: "Il server email non risponde" _ffVisibility: public: "Pubblico" - followers: "Mostra solo ai follower" + followers: "Mostra solo a chi ti segue" private: "Invisibile" _signup: almostThere: "Quasi completo" @@ -1064,7 +1062,7 @@ _channel: removeBanner: "Rimuovi intestazione" featured: "Tendenze" owned: "I miei canali" - following: "Seguiti" + following: "Chi segui" usersCount: "{n} partecipanti" notesCount: "{n} post" nameAndDescription: Nome e descrizione @@ -1105,7 +1103,7 @@ _theme: constant: "Costante" defaultValue: "Valore predefinito" color: "Colore" - refConst: "Chiama costante" + refConst: "Valore di una costante" key: "Chiave" func: "Funzione" funcKind: "Tipo di funzione" @@ -1161,8 +1159,8 @@ _theme: wallpaperOverlay: Trasparenza rispetto allo sfondo importInfo: Se inserisci qui il codice di un tema, potrai importarlo nell'editor del tema - refProp: Riferimento a una proprietà - basedProp: Proprietà riferenziata + refProp: Valore di una proprietà + basedProp: Nome proprietà _sfx: note: "Nuovo post" noteMy: "Proprio post" @@ -1192,11 +1190,11 @@ _tutorial: step1_2: "Vediamo di configurarla. Sarete operativi in men che non si dica!" step2_1: "Per prima cosa, compila il tuo profilo" step2_2: "Fornendo alcune informazioni su chi sei, sarà più facile per gli altri - capire se vogliono vedere i tuoi post o seguirti" + capire se vogliono vedere i tuoi post o seguirti." step3_1: "Ora è il momento di seguire qualcuno!" - step3_2: "La vostra home e le vostre timeline social si basano su chi seguite, quindi - provate a seguire un paio di account per iniziare.\nCliccate sul cerchio più in - alto a destra di un profilo per seguirlo" + step3_2: "Le tue timeline Home e Social si basano su chi segui, quindi prova a seguire + un paio di account per iniziare.\nClicca sul cerchio in alto a destra di un profilo + per seguirlo." step4_1: "Fatevi conoscere" step4_2: "Per il primo post, alcuni preferiscono fare un post di {introduction} o un semplice \"Ciao mondo!\"" @@ -1261,8 +1259,8 @@ _permissions: "write:drive": "Gestire il Drive" "read:favorites": "Visualizza i tuoi preferiti" "write:favorites": "Gestisci i tuoi preferiti" - "read:following": "Vedi le informazioni di follow" - "write:following": "Seguiti/ Smetti di seguire" + "read:following": "Vedi le informazioni su chi segui" + "write:following": "Aggiungi o rimuovi account da seguire" "read:messaging": "Visualizzare la chat" "write:messaging": "Gestire la chat" "read:mutes": "Vedi account silenziati" @@ -1296,7 +1294,7 @@ _auth: allPermissions: Accesso completo all'account _antennaSources: all: "Tutti i post" - homeTimeline: "Post dagli utenti che segui" + homeTimeline: "Post dagli account che segui" users: "Post dagli utenti selezionati" userList: "Post dagli utenti di una lista specifica" userGroup: "Post dagli utenti in un gruppo specifico" @@ -1370,8 +1368,8 @@ _visibility: publicDescription: "Il tuo post sarà visibile in tutte le timeline pubbliche" home: "Home" homeDescription: "Visibile solo sulla timeline \"Home\"" - followers: "Followers" - followersDescription: "Visibile solo per i tuoi followers e gli utenti che menzioni" + followers: "Chi ti segue" + followersDescription: "Visibile solo a chi ti segue e a chi menzioni" specified: "Diretta" specifiedDescription: "Visibile solo per gli/le utenti menzionatə" localOnly: "Soltanto locale" @@ -1405,7 +1403,7 @@ _profile: l'ora locale in cui ti trovi. _exportOrImport: allNotes: "Tutti i post" - followingList: "Follows" + followingList: "Account che segui" muteList: "Account silenziati" blockingList: "Account bloccati" userLists: "Liste" @@ -1431,8 +1429,8 @@ _instanceCharts: usersTotal: "Totale cumulativo di utenti" notes: "Differenza nel numero di post" notesTotal: "Totale cumulativo di post" - ff: "Variazione dei follow/ follower" - ffTotal: "Totale cumulato dei follow/ follower" + ff: "Differenza tra chi segui e chi ti segue " + ffTotal: "Totale tra chi segui e chi ti segue" cacheSize: "Variazione dello spazio occupato dalla cache" cacheSizeTotal: "Totale cumulato dello spazio occupato dalla cache" files: "Variazione del numero di file" @@ -1748,28 +1746,28 @@ _notification: youGotPoll: "{name} ha votato" youGotMessagingMessageFromUser: "{name} ti ha mandato un messaggio" youGotMessagingMessageFromGroup: "{name} ti ha mandato un messaggio nella chat" - youWereFollowed: "Ha iniziato a seguirti" + youWereFollowed: "ha iniziato a seguirti" youReceivedFollowRequest: "Hai ricevuto una richiesta di follow" yourFollowRequestAccepted: "La tua richiesta di follow è stata accettata" youWereInvitedToGroup: "Invitat@ al gruppo" _types: all: "Tutto" - follow: "Nuovə follower" + follow: "Nuovi che ti seguono" mention: "Menzioni" reply: "Risposte" renote: "Boost" quote: "Cita" reaction: "Reazioni" pollVote: "Voti ricevuti" - receiveFollowRequest: "Richiesta di follow ricevuta" - followRequestAccepted: "Richiesta di follow accettata" + receiveFollowRequest: "Qualcuno ha richiesto di seguirti" + followRequestAccepted: "Richiesta accettata" groupInvited: "Invito a un gruppo" app: "Notifiche da applicazioni" pollEnded: Fine del sondaggio _actions: reply: "Rispondi" renote: "Boost" - followBack: ricambia il tuo follow + followBack: ha ricambiato il follow e ti segue reacted: ha aggiunto una reazione al tuo post renoted: ha dato un boost al tuo post pollEnded: I risultati del sondaggio sono disponibili @@ -1870,7 +1868,7 @@ unclip: Togli il clip instanceSecurity: Sicurezza del server recommended: Suggerito seperateRenoteQuote: Separa i bottoni di boost e citazione -ffVisibility: Visibilità dei follower +ffVisibility: Visibilità di chi segui e chi ti segue failedToFetchAccountInformation: Non è possibile ottenere informazioni sull'account rateLimitExceeded: Limite di richieste superato document: Documentazione @@ -1974,8 +1972,7 @@ keepOriginalUploadingDescription: Salva l'immagine caricata originariamente cos Se disattivato, al momento del caricamento verrà generata una versione da visualizzare sul web. accessibility: Accessibilità -ffVisibilityDescription: Puoi configurare chi può vedere chi segui e anche i tuoi - follower. +ffVisibilityDescription: Puoi far vedere chi segui e chi ti segue. continueThread: Continua la conversazione smartphone: Smartphone tablet: Tablet @@ -2004,7 +2001,7 @@ allowedInstances: Whitelist dei server customCssWarn: Questa impostazione dovrebbe essere usata solo se sai cosa stai facendo. Inserire valori errati potrebbe bloccare il funzionamento del client. lastCommunication: Ultima comunicazione -breakFollowConfirm: Vuoi veramente rimuovere il follower? +breakFollowConfirm: Confermi la rimozione del follower? makeReactionsPublic: Rendi pubblica la storia di tutte le reazioni makeReactionsPublicDescription: Questa opzione rende visibile a tutti l'elenco delle tue reazioni ai post nel passato. @@ -2081,7 +2078,7 @@ noGraze: Per favore disattiva l'estenzione del browser "Graze for Mastodon", per silencedWarning: Vedi questa pagina perché gli utenti sono su un server che il tuo admin ha silenziato, quindi potrebbero essere spam. isBot: Questo account è un bot -isLocked: Questo account richiede l'approvazione del follow +isLocked: Serve una approvazione per seguire questo account moveFromDescription: Questa operazione crea un alias del vecchio account in modo che tu possa migrare su questo nuovo account. Fallo PRIMA di migrare il tuo vecchio account. Usa il formato @nomeutente@server.com @@ -2139,13 +2136,13 @@ _preferencesBackups: deleteConfirm: Rimuovere il backup "{name}"? renameConfirm: Rinominare il backup da "{old}" a "{new}"? _filters: - followersOnly: Solo i tuoi follower + followersOnly: Solo chi ti segue fromUser: Dall'utente withFile: Con file fromDomain: Dal dominio notesAfter: Post successivi notesBefore: Post precedenti - followingOnly: Solo i tuoi follow + followingOnly: Solo chi segui _instanceMute: heading: Elenco di server da silenziare title: Nascondi i post dai server elencati. diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index f3731802d9..7fcc86c5f1 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -1,8 +1,6 @@ _lang_: "한국어" -headlineFirefish: "노트로 연결되는 네트워크" -introFirefish: "환영합니다! Firefish 는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n\"노트\" 를 작성해서, 지금 일어나고 - 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요📡\n\"리액션\" 기능으로, 친구의 노트에 총알같이 반응을 추가할 수도 있습니다👍\n - 새로운 세계를 탐험해 보세요🚀" +headlineFirefish: "영원히 무료로 제공되는 오픈 소스 탈중앙화 소셜 미디어 플랫폼 🚀" +introFirefish: "환영합니다! Firefish 는 영원히 무료로 제공되는 오픈 소스 분산형 소셜 미디어 플랫폼입니다! 🚀" monthAndDay: "{month}월 {day}일" search: "검색" notifications: "알림" @@ -14,8 +12,8 @@ ok: "OK" gotIt: "알겠어요" cancel: "취소" enterUsername: "유저명 입력" -renotedBy: "{user}님이 Renote" -noNotes: "노트가 없습니다" +renotedBy: "{user}님이 부스트" +noNotes: "게시물이 없습니다" noNotifications: "표시할 알림이 없습니다" instance: "서버" settings: "설정" @@ -45,7 +43,7 @@ copyContent: "내용 복사" copyLink: "링크 복사" delete: "삭제" deleteAndEdit: "삭제 후 편집" -deleteAndEditConfirm: "이 노트를 삭제한 뒤 다시 편집하시겠습니까? 이 노트에 대한 리액션, 리노트, 답글 또한 모두 삭제됩니다." +deleteAndEditConfirm: "이 게시물을 삭제한 뒤 다시 편집하시겠습니까? 이 게시물에 대한 리액션, 부스트, 답글 또한 모두 삭제됩니다." addToList: "리스트에 추가" sendMessage: "메시지 보내기" copyUsername: "유저명 복사" @@ -59,20 +57,20 @@ receiveFollowRequest: "새로운 팔로우 요청이 있습니다" followRequestAccepted: "팔로우가 수락되었습니다" mention: "멘션" mentions: "받은 멘션" -directNotes: "다이렉트 노트" +directNotes: "다이렉트 게시물" importAndExport: "가져오기와 내보내기" import: "가져오기" export: "내보내기" files: "파일" download: "다운로드" -driveFileDeleteConfirm: "파일 \"{name}\" 을 삭제하시겠습니까? 이 파일이 첨부되었더 노트에서도 같이 삭제됩니다." +driveFileDeleteConfirm: "파일 \"{name}\" 을 삭제하시겠습니까? 이 파일이 첨부되었더 게시물에서도 같이 삭제됩니다." unfollowConfirm: "{name}님을 언팔로우하시겠습니까?" exportRequested: "내보내기를 요청하였습니다. 이 작업은 시간이 걸릴 수 있습니다. 내보내기가 완료되면 \"드라이브\"에 추가됩니다." importRequested: "가져오기를 요청하였습니다. 이 작업에는 시간이 걸릴 수 있습니다." lists: "리스트" noLists: "리스트가 없습니다" -note: "노트" -notes: "노트" +note: "게시" +notes: "게시물" following: "팔로잉" followers: "팔로워" followsYou: "당신을 팔로우합니다" @@ -96,13 +94,13 @@ followRequests: "팔로우 요청" unfollow: "팔로우 해제" followRequestPending: "팔로우 허가 대기중" enterEmoji: "이모지 입력" -renote: "Renote" -unrenote: "Renote 취소" -renoted: "Renote 하였습니다" -cantRenote: "이 게시물은 Renote할 수 없습니다." -cantReRenote: "Renote를 Renote할 수 없습니다." +renote: "부스트" +unrenote: "부스트 취소" +renoted: "부스트 하였습니다" +cantRenote: "이 게시물은 부스트할 수 없습니다." +cantReRenote: "부스트를 부스트할 수 없습니다." quote: "인용" -pinnedNote: "고정해놓은 노트" +pinnedNote: "고정해놓은 게시물" pinned: "프로필에 고정" you: "당신" clickToShow: "클릭하여 보기" @@ -146,7 +144,7 @@ flagAsBotDescription: "이 계정을 자동화된 수단으로 운용할 경우 봇 끼리의 무한 연쇄 반응을 회피하거나, 이 계정의 시스템 상에서의 취급이 Bot 운영에 최적화되는 등의 변화가 생깁니다." flagAsCat: "나는 고양이다냥" flagAsCatDescription: "이 계정이 고양이라면 활성화 해주세요." -flagShowTimelineReplies: "타임라인에 노트의 답글을 표시하기" +flagShowTimelineReplies: "타임라인에 게시물의 답글을 표시하기" flagShowTimelineRepliesDescription: "이 설정을 활성화하면 타임라인에 다른 유저 간의 답글을 표시합니다." autoAcceptFollowed: "팔로우 중인 유저로부터의 팔로우 요청을 자동 수락" addAccount: "계정 추가" @@ -703,7 +701,7 @@ experimentalFeatures: "실험실" developer: "개발자" makeExplorable: "\"발견하기\"에 내 계정 보이기" makeExplorableDescription: "비활성화하면 \"발견하기\"에 나의 계정을 표시하지 않습니다." -showGapBetweenNotesInTimeline: "타임라인의 노트 사이를 띄워서 표시" +showGapBetweenNotesInTimeline: "타임라인의 게시물 사이를 띄워서 표시" duplicate: "복제" left: "왼쪽" center: "가운데" @@ -758,7 +756,7 @@ unlikeConfirm: "좋아요를 취소할까요?" fullView: "전체 화면" quitFullView: "전체 화면 해제" addDescription: "설명 추가" -userPagePinTip: "각 게시물의 메뉴에서 「프로필에 고정」을 선택하는 것으로, 여기에 노트를 표시해 둘 수 있어요." +userPagePinTip: "각 게시물의 메뉴에서 「프로필에 고정」을 선택하는 것으로, 여기에 게시물을 표시해 둘 수 있어요." notSpecifiedMentionWarning: "수신자가 선택되지 않은 멘션이 있어요" info: "정보" userInfo: "유저 정보" @@ -1135,7 +1133,7 @@ _wordMute: _instanceMute: instanceMuteDescription: "뮤트한 서버에서 오는 답글을 포함한 모든 게시물과 부스트를 뮤트합니다." instanceMuteDescription2: "한 줄에 하나씩 입력해 주세요" - title: "지정한 서버의 노트를 숨깁니다." + title: "지정한 서버의 게시물을 숨깁니다." heading: "뮤트할 서버" _theme: explore: "테마 찾아보기" @@ -1748,7 +1746,7 @@ _notification: youGotMention: "{name}님이 멘션함" youGotReply: "{name}님이 답글함" youGotQuote: "{name}님이 인용함" - youRenoted: "{name}님이 Boost" + youRenoted: "{name}님의 부스트" youGotPoll: "{name}님이 투표함" youGotMessagingMessageFromUser: "{name} 님이 보낸 채팅이 있어요" youGotMessagingMessageFromGroup: "{name}에서 보낸 채팅이 있어요" @@ -1825,7 +1823,7 @@ replayTutorial: 튜토리얼 다시 보기 renoteMute: 부스트 뮤트 antennaInstancesDescription: 서버 호스트를 한 줄에 하나씩 입력하세요 userSaysSomethingReason: '{name} 님이 {reason}에 대해 말했습니다' -userSaysSomethingReasonQuote: '{name} 님이 {reason} 을 포함하는 노트를 인용했습니다' +userSaysSomethingReasonQuote: '{name} 님이 {reason} 을 포함하는 게시물을 인용했습니다' pushNotification: 푸시 알림 channelFederationWarn: 현재 채널은 다른 서버로 연합되지 않습니다 enableServerMachineStats: 서버의 머신 정보를 공개 @@ -1868,7 +1866,7 @@ showEmojisInReactionNotifications: 리액션 알림에 이모지 보이기 hiddenTagsDescription: 트렌드와 '발견하기'에서 제외할 해시태그를 ('#'을 제외하고) 한 줄에 하나씩 입력하여 주십시오. 이 설정은 트렌드와 '발견하기' 외에는 영향을 주지 않습니다. antennasDesc: "안테나에서는 조건에 맞는 게시물이 표시됩니다.\n'타임라인' 페이지에서 접근할 수 있습니다." -expandOnNoteClick: 노트를 클릭하여 자세히 표시 +expandOnNoteClick: 게시물을 클릭하여 자세히 표시 expandOnNoteClickDesc: 비활성화한 경우에도 우클릭 메뉴 또는 타임스탬프를 클릭하여 열 수 있습니다. customMOTDDescription: 유저가 페이지를 로딩/새로고침할 때 마다 무작위로 표시할 메시지를 한 줄에 하나씩 입력합니다. moveFrom: 다른 계정에서 이 계정으로 이사하기 @@ -1897,14 +1895,14 @@ splash: 스플래시 화면 preventAiLearningDescription: 업로드한 게시물이나 미디어를 AI 모델이 학습하지 말기를 요구합니다. isBot: 이 계정은 봇입니다 isAdmin: 관리자 -newer: 새로운 노트 -older: 이전 노트 +newer: 새로운 게시물 +older: 이전 게시물 renoteUnmute: 부스트 뮤트 해제 accountMoved: '이 유저는 다른 계정으로 이사했습니다:' silencedInstances: 사일런스한 서버 accessibility: 접근성 -userSaysSomethingReasonReply: '{name} 님이 {reason} 을 포함하는 노트에 답글했습니다' -userSaysSomethingReasonRenote: '{name} 님이 {reason} 을 포함하는 노트를 부스트했습니다' +userSaysSomethingReasonReply: '{name} 님이 {reason} 을 포함하는 게시물에 답글했습니다' +userSaysSomethingReasonRenote: '{name} 님이 {reason} 을 포함하는 게시물을 부스트했습니다' breakFollowConfirm: 팔로워를 해제하시겠습니까? indexFrom: 이 게시물 ID부터 인덱싱하기 noThankYou: 괜찮습니다 @@ -1960,7 +1958,7 @@ _messaging: _tutorial: title: Firefly의 사용 방법 step5_5: '{icon} 소셜 타임라인은 홈 타임라인과 로컬 타임라인을 합친 것과 같습니다.' - step4_1: 첫 노트를 올려 봅시다. + step4_1: 첫 글을 올려 봅시다. step5_3: '{icon} 홈 타임라인은 내가 팔로우하고 있는 계정의 게시물을 볼 수 있는 타임라인입니다.' step6_2: 이 서버에 가입을 마친 당신은 단순히 Firefish 서버의 유저가 아닌, 수많은 서버가 서로 상호작용하는 연합우주에 참가하시게 된 것입니다. diff --git a/locales/th-TH.yml b/locales/th-TH.yml index 3a81d28354..4d34471cae 100644 --- a/locales/th-TH.yml +++ b/locales/th-TH.yml @@ -1,22 +1,22 @@ ---- _lang_: "ภาษาไทย" headlineFirefish: "เชื่อมต่อเครือข่ายโดยโน้ต" -introFirefish: "ยินดีต้อนรับจ้าาา! Firefish เป็นบริการไมโครบล็อกโอเพ่นซอร์ส แบบการกระจายอำนาจ\nสร้าง \"โน้ต\" เพื่อแบ่งปันความคิดของคุณกับทุกคนรอบตัวคุณกันเถอะ 📡\nด้วยการ \"รีแอคชั่นผู้คน\" คุณยังสามารถแสดงความรู้สึกของคุณเกี่ยวกับบันทึกของทุกคนได้อย่างรวดเร็ว 👍\n\nแล้วมาท่องสำรวจโลกใบใหม่กันเถอะ! 🚀" +introFirefish: "ยินดีต้อนรับค่ะ/ครับ! Firefish เป็นแพลตฟอร์มโซเชียลมีเดียแบบโอเพ่นซอร์สที่มีการกระจายอำนาจซึ่งให้บริการฟรีตลอดไป! + 🚀" monthAndDay: "{เดือน}/{วัน}" search: "ค้นหา" notifications: "การเเจ้งเตือน" username: "ชื่อผู้ใช้" password: "รหัสผ่าน" -forgotPassword: "ลืมรหัสผ่าน?" +forgotPassword: "ลืมรหัสผ่านอ่ะ" fetchingAsApObject: "กำลังดึงข้อมูล จาก เฟดิเวิร์ส" ok: "ตกลง" gotIt: "เข้าใจแล้ว !" cancel: "ยกเลิก" enterUsername: "ใส่ชื่อผู้ใช้" -renotedBy: "รีโน้ตโดย {ผู้ใช้}" -noNotes: "ไม่มีโน้ต" +renotedBy: "บูตเตอร์โดย {user}" +noNotes: "ไม่มีโพสต์" noNotifications: "ไม่มีการแจ้งเตือน" -instance: "ตัวอย่าง" +instance: "เซิฟเวอร์" settings: "การตั้งค่า" basicSettings: "การตั้งค่าพื้นฐาน" otherSettings: "การตั้งค่าอื่นๆ" @@ -44,7 +44,8 @@ copyContent: "คัดลอกเนื้อหา" copyLink: "คัดลอกลิงก์" delete: "ลบ" deleteAndEdit: "ลบและแก้ไข" -deleteAndEditConfirm: "นายแน่ใจแล้วเหรอ? ว่าต้องการลบโน้ตนี้และแก้ไข คุณอาจจะสูญเสียการโต้ตอบ, โน้ต, และการตอบกลับทั้งหมดได้นะ" +deleteAndEditConfirm: "คุณแน่ใจแล้วเหรอว่าต้องการลบโพสต์นี้และแก้ไข? คุณอาจจะสูญเสียการโต้ตอบ, + โพสต์, และการตอบกลับทั้งหมดได้นะ" addToList: "เพิ่มในลิสต์" sendMessage: "ส่งข้อความ" copyUsername: "คัดลอกชื่อผู้ใช้" @@ -58,30 +59,31 @@ receiveFollowRequest: "คำขอผู้ติดตามที่ได้ followRequestAccepted: "ผู้ติดตามได้ตอบรับคำขอร้องของคุณแล้ว" mention: "กล่าวถึง" mentions: "พูดถึง" -directNotes: "ไดเร็คโน้ต" +directNotes: "ไดเร็คข้อความ" importAndExport: "นำเข้า / ส่งออก" import: "การนำเข้า" export: "การนำออก" files: "ไฟล์" download: "ดาวน์โหลด" -driveFileDeleteConfirm: "นายแน่ใจแล้วหรอ? ว่าต้องการลบไฟล์ \"{name}\" โน้ตย่อที่แนบมากับไฟล์นี้ก็จะถูกลบด้วยนะ" -unfollowConfirm: "นายแน่ใจแล้วหรอว่าต้องการเลิกติดตาม {name}?" +driveFileDeleteConfirm: "คุณแน่ใจแล้วหรอว่าต้องการลบไฟล์ \"{name}\"? โพสต์ย่อที่แนบมากับไฟล์นี้ก็จะถูกลบด้วยนะ" +unfollowConfirm: "คุณแน่ใจแล้วหรอว่าต้องการเลิกติดตาม {name}?" exportRequested: "เมื่อคุณได้ร้องขอการส่งออก อาจจะต้องใช้เวลาสักครู่ และจะถูกเพิ่มในไดรฟ์ของคุณเมื่อเสร็จสิ้นแล้ว" importRequested: "เมื่อคุณได้ร้องขอการนำเข้า อาจจะต้องใช้เวลาสักครู่นะ" lists: "รายการ" noLists: "คุณไม่มีลิสต์ใดๆนะ" -note: "ตัวโน้ต" -notes: "หมายเหตุ" +note: "โพสต์" +notes: "โพสต์" following: "กำลังติดตาม" followers: "ผู้ติดตาม" followsYou: "ติดตามคุณ" createList: "สร้างลิสต์" manageLists: "จัดการลิสต์" -error: "ผิดพลาด!" +error: "ผิดพลาด" somethingHappened: "อุ๊ย ! มีอะไรบางอย่างผิดพลาด" retry: "ลองใหม่อีกครั้ง" pageLoadError: "เกิดข้อผิดพลาดในการโหลดหน้านี้" -pageLoadErrorDescription: "โดยปกติแล้วมักจะเกิดจากข้อผิดพลาดของเครือข่ายหรือแคชของเบราว์เซอร์ ลองล้างแคชแล้วลองใหม่อีกครั้งหลังจากรอสักครู่ " +pageLoadErrorDescription: "โดยปกติแล้วมักจะเกิดจากข้อผิดพลาดของเครือข่ายหรือแคชของเบราว์เซอร์ + ลองล้างแคชแล้วลองใหม่อีกครั้งหลังจากรอสักครู่นะ" serverIsDead: "เซิร์ฟเวอร์นี้ไม่มีการตอบสนอง ได้โปรดกรุณารอสักครู่แล้วลองใหม่อีกครั้งนะ" youShouldUpgradeClient: "หากต้องการดูหน้านี้ได้โปรดกรุณา รีเซ็ตเพื่ออัปเดตไคลเอ็นต์ของคุณนะ" enterListName: "ใส่ชื่อสำหรับรายการลิสต์" @@ -89,18 +91,18 @@ privacy: "ความเป็นส่วนตัว" makeFollowManuallyApprove: "ติดตามคำขอที่ต้องได้รับการอนุมัติ" defaultNoteVisibility: "การมองเห็นที่เป็นค่าเริ่มต้น" follow: "กำลังติดตาม" -followRequest: "ส่งคำขอติดตาม" +followRequest: "คำขอติดตาม" followRequests: "ติดตามการร้องขอ" unfollow: "เลิกติดตาม" followRequestPending: "กำลังรอดำเนินการร้องขอติดตาม" enterEmoji: "ใส่อีโมจิ" -renote: "รีโน้ต" -unrenote: "เลิกรีโน้ต" -renoted: "รีโน้ตเอาไว้" -cantRenote: "โพสต์นี้ไม่สามารถรีโน้ตไว้ใหม่ได้นะ" -cantReRenote: "ไม่สามารถรีโน้ตเอาไว้ใหม่ได้นะ" +renote: "บูสต์" +unrenote: "เลิกบูสต์" +renoted: "บูสต์แล้ว" +cantRenote: "โพสต์นี้ไม่สามารถบูสต์ใหม่ได้" +cantReRenote: "ไม่สามารถบูสต์ไว้ใหม่ได้" quote: "อ้างคำพูด" -pinnedNote: "โน้ตที่ปักหมุดเอาไว้" +pinnedNote: "โพสต์ที่ปักหมุดแล้ว" pinned: "ปักหมุดไปยังโปรไฟล์" you: "ตัวเอง" clickToShow: "คลิกเพื่อแสดง" @@ -109,7 +111,7 @@ add: "เพิ่ม" reaction: "รีแอคชั่น" reactionSetting: "รีแอคชั่นไปยังแสดงผลในตัวเลือกการรีแอคชั่น" reactionSettingDescription2: "กดลากเพื่อจัดลำดับใหม่ กดคลิกเพื่อลบ กด \"+\" เพื่อเพิ่ม" -rememberNoteVisibility: "จดจำการตั้งค่าการมองเห็นตัวโน้ต" +rememberNoteVisibility: "จดจำการตั้งค่าการมองเห็นโพสต์" attachCancel: "ลบไฟล์ออกที่แนบมา" markAsSensitive: "ทำเครื่องหมายว่าละเอียดอ่อน" unmarkAsSensitive: "ยกเลิกทำเครื่องหมายเป็น NSFW" @@ -120,11 +122,11 @@ block: "บล็อค" unblock: "เลิกปิดกั้น" suspend: "ถูกระงับ" unsuspend: "ยกเลิกระงับ" -blockConfirm: "คุณแน่ใจแล้วเหรอ? ว่าต้องการบล็อกบัญชีนี้" -unblockConfirm: "คุณแน่ใจแล้วเหรอ? ว่าต้องการปลดบล็อคบัญชีนี้" -suspendConfirm: "นายแน่ใจแล้วเหรอว่าต้องการระงับบัญชีนี้อ่ะ?" -unsuspendConfirm: "นายแน่ใจแล้วหรอ? ว่าต้องการยกเลิกการระงับบัญชีนี้" -selectList: "เลือกรายการ (Automatic Translation)" +blockConfirm: "คุณแน่ใจแล้วเหรอ ว่าต้องการบล็อกบัญชีนี้?" +unblockConfirm: "คุณแน่ใจแล้วเหรอ ว่าต้องการปลดบล็อคบัญชีนี้?" +suspendConfirm: "คุณแน่ใจแล้วเหรอว่าต้องการระงับบัญชีนี้อ่ะ?" +unsuspendConfirm: "คุณแน่ใจแล้วหรอว่าต้องการยกเลิกการระงับบัญชีนี้?" +selectList: "เลือกรายการ" selectAntenna: "เลือกเสาอากาศ" selectWidget: "เลือกวิดเจ็ต" editWidgets: "แก้ไขวิดเจ็ต" @@ -137,13 +139,17 @@ emojiUrl: "อิโมจิ URL" addEmoji: "แทรกอีโมจิ" settingGuide: "การตั้งค่าที่แนะนำ" cacheRemoteFiles: "แคชไฟล์ระยะไกล" -cacheRemoteFilesDescription: "เมื่อปิดใช้งานการตั้งค่านี้ ไฟล์ระยะไกลนั้นจะถูกโหลดโดยตรงจากอินสแตนซ์ระยะไกล แต่กรณีการปิดใช้งานนี้จะช่วยลดปริมาณการใช้พื้นที่จัดเก็บข้อมูล แต่เพิ่มปริมาณการใช้งาน เพราะเนื่องจากจะไม่มีการสร้างภาพขนาดย่อ" +cacheRemoteFilesDescription: "เมื่อปิดใช้งานการตั้งค่านี้ ไฟล์ระยะไกลนั้นจะถูกโหลดโดยตรงจากระยะไกลเซิฟเวอร์ + แต่กรณีการปิดใช้งานนี้จะช่วยลดปริมาณการใช้พื้นที่จัดเก็บข้อมูล แต่เพิ่มปริมาณการใช้งาน + เพราะเนื่องจากจะไม่มีการสร้างภาพขนาดย่อ" flagAsBot: "ทำเครื่องหมายบอกว่าบัญชีนี้เป็นบอท" -flagAsBotDescription: "การเปิดใช้งานตัวเลือกนี้หากบัญชีนี้ถูกควบคุมโดยนักเขียนโปรแกรม หรือ ถ้าหากเปิดใช้งาน มันจะทำหน้าที่เป็นแฟล็กสำหรับนักพัฒนารายอื่นๆ และเพื่อป้องกันการโต้ตอบแบบไม่มีที่สิ้นสุดกับบอทตัวอื่นๆ และยังสามารถปรับเปลี่ยนระบบภายในของ Firefish เพื่อปฏิบัติต่อบัญชีนี้เป็นบอท" +flagAsBotDescription: "การเปิดใช้งานตัวเลือกนี้หากบัญชีนี้ถูกควบคุมโดยนักเขียนโปรแกรม + หรือ ถ้าหากเปิดใช้งาน มันจะทำหน้าที่เป็นแฟล็กสำหรับนักพัฒนารายอื่นๆ และเพื่อป้องกันการโต้ตอบแบบไม่มีที่สิ้นสุดกับบอทตัวอื่นๆ + และยังสามารถปรับเปลี่ยนระบบภายในของ Firefish เพื่อปฏิบัติต่อบัญชีนี้เป็นบอท" flagAsCat: "ทำเครื่องหมายบอกว่าบัญชีนี้เป็นแมว" -flagAsCatDescription: "การเปิดใช้งานตัวเลือกนี้เพื่อทำเครื่องหมายบอกว่าบัญชีนี้เป็นแมว" +flagAsCatDescription: "คุณจะได้รับหูแมวและพูดเหมือนแมวนะ!" flagShowTimelineReplies: "แสดงตอบกลับ ในไทม์ไลน์" -flagShowTimelineRepliesDescription: "แสดงการตอบกลับของผู้ใช้งานไปยังโน้ตของผู้ใช้งานรายอื่นๆในไทม์ไลน์หากได้เปิดเอาไว้" +flagShowTimelineRepliesDescription: "แสดงการตอบกลับของผู้ใช้งานไปยังโพสต์ของผู้ใช้งานรายอื่นๆในไทม์ไลน์หากได้เปิดเอาไว้" autoAcceptFollowed: "อนุมัติคำขอติดตามโดยอัตโนมัติทันที จากผู้ใช้งานที่คุณกำลังติดตาม" addAccount: "เพิ่มบัญชี" loginFailed: "การเข้าสู่ระบบไม่สำเร็จ" @@ -155,15 +161,17 @@ removeWallpaper: "นำวอลเปเปอร์ออก" searchWith: "ค้นหา: {q}" youHaveNoLists: "รายการนี้ว่างเปล่า" followConfirm: "คุณแน่ใจแล้วหรอว่าต้องการที่จะติดตาม {name}?" -proxyAccount: "บัญชี พร็อกซี่" -proxyAccountDescription: "บัญชีพร็อกซี่ คือ บัญชีที่จะทำหน้าที่เป็นผู้ติดตามระยะไกลสำหรับผู้ใช้งานที่อยู่ภายใต้ด้วยเงื่อนไขบางอย่าง ยกตัวอย่าง เช่น เมื่อมีผู้ใช้งานนั้นได้เพิ่มผู้ใช้งานจากระยะไกลลงในรายการ แต่กิจกรรมของผู้ใช้ในระยะไกลนั้นจะไม่ถูกส่งไปยังอินสแตนซ์หากไม่มีผู้ใช้งานในพื้นที่ติดตามผู้ใช้รายนั้น ดังนั้นบัญชีพร็อกซีนี้จะติดตามแทน" +proxyAccount: "บัญชีพร็อกซี" +proxyAccountDescription: "บัญชีพร็อกซี่ คือ บัญชีที่จะทำหน้าที่เป็นผู้ติดตามระยะไกลสำหรับผู้ใช้งานที่อยู่ภายใต้ด้วยเงื่อนไขบางอย่าง + ยกตัวอย่าง เช่น เมื่อมีผู้ใช้งานนั้นได้เพิ่มผู้ใช้งานจากระยะไกลลงในรายการ แต่กิจกรรมของผู้ใช้ในระยะไกลนั้นจะไม่ถูกส่งไปยังเซิฟเวอร์ + หากไม่มีผู้ใช้งานในพื้นที่ติดตามผู้ใช้รายนั้น ดังนั้นบัญชีพร็อกซีนี้จะติดตามแทน" host: "โฮสต์" selectUser: "เลือกผู้ใช้งาน" recipient: "ผู้รับ" annotation: "ความคิดเห็น" federation: "สหพันธ์" -instances: "ตัวอย่าง" -registeredAt: "จดทะเบียนที่" +instances: "เซิฟเวอร์" +registeredAt: "จดทะเบียนแล้วที่" latestRequestSentAt: "ส่งคำขอล่าสุดไปแล้ว" latestRequestReceivedAt: "ได้รับคำขอล่าสุดไปแล้ว" latestStatus: "สถานะล่าสุด" @@ -186,7 +194,8 @@ instanceInfo: "ข้อมูล อินสแตนซ์" statistics: "สถิติการใช้งาน" clearQueue: "ล้างคิว" clearQueueConfirmTitle: "คุณแน่ใจแล้วหรอว่าต้องการที่จะล้างคิว?" -clearQueueConfirmText: "บันทึกย่อที่ยังไม่ได้ส่งที่เหลืออยู่ในคิวนั้นมักจะ ไม่ถูกรวมเข้าด้วยกัน โดยปกติแล้วไม่จำเป็นต้องดำเนินการนี้" +clearQueueConfirmText: "บันทึกย่อที่ยังไม่ได้ส่งที่เหลืออยู่ในคิวนั้นมักจะ ไม่ถูกรวมเข้าด้วยกัน + โดยปกติแล้วไม่จำเป็นต้องดำเนินการนี้" clearCachedFiles: "ล้างแคช" clearCachedFilesConfirm: "นายแน่ใจแล้วหรอว่าต้องการที่จะลบไฟล์ระยะไกลที่แคชไว้ทั้งหมด?" blockedInstances: "อินสแตนซ์ที่ ถูกบล็อก" @@ -232,14 +241,15 @@ announcements: "ประกาศ" imageUrl: "url รูปภาพ" remove: "ลบ" removed: "ถูกลบไปแล้ว" -removeAreYouSure: "นายแน่ใจจริงหรอว่าต้องการที่จะลบออก \"{x}\"" -deleteAreYouSure: "นายแน่ใจจริงหรอว่าต้องการที่จะลบออก \"{x}\"" -resetAreYouSure: "รีเซ็ตเลยไหม" +removeAreYouSure: "คุณแน่ใจจริงหรอว่าต้องการที่จะลบออก \"{x}\"?" +deleteAreYouSure: "คุณแน่ใจหรอว่าต้องการที่จะลบออก \"{x}\"?" +resetAreYouSure: "จริงหรอรีเซ็ตเลยไหม?" saved: "บันทึกแล้ว" messaging: "แชท" upload: "อัพโหลด" keepOriginalUploading: "เก็บภาพต้นฉบับ" -keepOriginalUploadingDescription: "บันทึกรูปภาพที่อัพโหลดต้นฉบับตามที่เป็นอยู่ ถ้าหากปิดอยู่ ระบบจะสร้างเวอร์ชั่นที่จะแสดงบนเว็บเมื่ออัพโหลดนะ" +keepOriginalUploadingDescription: "บันทึกรูปภาพที่อัพโหลดต้นฉบับตามที่เป็นอยู่ ถ้าหากปิดอยู่ + ระบบจะสร้างเวอร์ชั่นที่จะแสดงบนเว็บเมื่ออัพโหลดนะ" fromDrive: "จากไดรฟ์" fromUrl: "จาก URL" uploadFromUrl: "อัพโหลดจาก URL" @@ -253,7 +263,7 @@ startMessaging: "เริ่มการสนทนา" nUsersRead: "อ่านโดย {n}" agreeTo: "ฉันยอมรับที่จะ {0}" tos: "ข้อกำหนดและเงื่อนไข" -start: "เริ่มต้น​ใช้งาน​" +start: "เริ่มต้น" home: "หน้าแรก" remoteUserCaution: "เนื่องจากผู้ใช้งานรายนี้นั้น มาจากอินสแตนซ์ระยะไกล ข้อมูลที่แสดงดังกล่าวนั้นอาจจะไม่สมบูรณ์ก็ได้นะ" activity: "กิจกรรม" @@ -334,9 +344,11 @@ bannerUrl: "URL รูปภาพแบนเนอร์" backgroundImageUrl: "URL ภาพพื้นหลัง" basicInfo: "ข้อมูลเบื้องต้น" pinnedUsers: "ผู้ใช้งานที่ได้รับการปักหมุด" -pinnedUsersDescription: "ลิสต์ชื่อผู้ใช้โดยคั่นด้วยการขึ้นบรรทัดใหม่เพื่อปักหมุดในแท็บ \"สำรวจ\"" +pinnedUsersDescription: "ลิสต์ชื่อผู้ใช้โดยคั่นด้วยการขึ้นบรรทัดใหม่เพื่อปักหมุดในแท็บ + \"สำรวจ\"" pinnedPages: "หน้าที่ปักหมุด" -pinnedPagesDescription: "ป้อนเส้นทางของหน้าที่คุณต้องการตรึงไว้ที่หน้าแรกของอินสแตนซ์นี้ โดยคั่นด้วยตัวแบ่งบรรทัด" +pinnedPagesDescription: "ป้อนเส้นทางของหน้าที่คุณต้องการตรึงไว้ที่หน้าแรกของอินสแตนซ์นี้ + โดยคั่นด้วยตัวแบ่งบรรทัด" pinnedClipId: "ID ของคลิปที่จะปักหมุด" pinnedNotes: "โน้ตที่ปักหมุดเอาไว้" hcaptcha: "hCaptcha" @@ -347,14 +359,17 @@ recaptcha: "reCAPTCHA" enableRecaptcha: "เปิดใช้ reCAPTCHA" recaptchaSiteKey: "คีย์ไซต์" recaptchaSecretKey: "คีย์ลับ" -avoidMultiCaptchaConfirm: "การใช้ระบบ Captcha หลายระบบอาจทำให้เกิดการรบกวนหรืออาจจะเกิดข้อผิดพลาดได้ หากต้องการที่จะปิดการใช้งานระบบ Captcha อื่น ๆ แนะนำให้ปิดตัวอื่นๆก่อน ถ้าหากคุณต้องการให้เปิดใช้งานต่อไป ให้ กด ยกเลิก" +avoidMultiCaptchaConfirm: "การใช้ระบบ Captcha หลายระบบอาจทำให้เกิดการรบกวนหรืออาจจะเกิดข้อผิดพลาดได้ + หากต้องการที่จะปิดการใช้งานระบบ Captcha อื่น ๆ แนะนำให้ปิดตัวอื่นๆก่อน ถ้าหากคุณต้องการให้เปิดใช้งานต่อไป + ให้ กด ยกเลิก" antennas: "เสาอากาศ" manageAntennas: "จัดการเสาอากาศ" name: "ชื่อ" antennaSource: "แหล่งเสาอากาศ" antennaKeywords: "คีย์เวิร์ดที่ควรฟัง" antennaExcludeKeywords: "คีย์เวิร์ดที่จะยกเว้น" -antennaKeywordsDescription: "คั่นด้วยช่องว่างสำหรับเงื่อนไข AND หรือด้วยการขึ้นบรรทัดใหม่สำหรับเงื่อนไข OR นะ" +antennaKeywordsDescription: "คั่นด้วยช่องว่างสำหรับเงื่อนไข AND หรือด้วยการขึ้นบรรทัดใหม่สำหรับเงื่อนไข + OR นะ" notifyAntenna: "แจ้งเตือนเกี่ยวกับโน้ตใหม่" withFileAntenna: "เฉพาะโน้ตที่มีไฟล์" enableServiceworker: "เปิดใช้งาน การแจ้งเตือนแบบพุชสำหรับเบราว์เซอร์ของคุณ" @@ -433,7 +448,8 @@ invitationCode: "รหัสคำเชิญ" checking: "Checking" available: "พร้อมใช้งาน" unavailable: "ไม่พร้อมใช้" -usernameInvalidFormat: "คุณสามารถใช้อักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ตัวเลข และขีดล่างได้นะ ( a-z , A-Z , 0-9 , รวมไปถึงอักษรพิเศษเช่น + * / , . - อื่นๆเป็นต้น )" +usernameInvalidFormat: "คุณสามารถใช้อักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ตัวเลข และขีดล่างได้นะ + ( a-z , A-Z , 0-9 , รวมไปถึงอักษรพิเศษเช่น + * / , . - อื่นๆเป็นต้น )" tooShort: "สั้นเกินไปนะ" tooLong: "ยาวเกินไปนะ" weakPassword: "รหัสผ่าน แย่มาก" @@ -483,19 +499,26 @@ showFeaturedNotesInTimeline: "แสดงโน้ตเด่นในไท objectStorage: "อ็อบเจ็กต์ ที่จัดเก็บ" useObjectStorage: "ใช้ อ็อบเจ็กต์ ที่จัดเก็บ" objectStorageBaseUrl: "URL ฐาน" -objectStorageBaseUrlDesc: "URL ที่ใช้เป็นข้อมูลอ้างอิง ระบุ URL ของ CDN หรือ Proxy ถ้าหากคุณใช้อย่างใดอย่างหนึ่ง\n สำหรับการใช้งาน S3 'https://.s3.amazonaws.com' และสำหรับ GCS หรือบริการที่เทียบเท่าใช้ 'https://storage.googleapis.com/', เป็นต้น" +objectStorageBaseUrlDesc: "URL ที่ใช้เป็นข้อมูลอ้างอิง ระบุ URL ของ CDN หรือ Proxy + ถ้าหากคุณใช้อย่างใดอย่างหนึ่ง\n สำหรับการใช้งาน S3 'https://.s3.amazonaws.com' + และสำหรับ GCS หรือบริการที่เทียบเท่าใช้ 'https://storage.googleapis.com/', + เป็นต้น" objectStorageBucket: "Bucket" objectStorageBucketDesc: "โปรดระบุชื่อที่เก็บข้อมูลที่ใช้กับผู้ให้บริการของคุณ" objectStoragePrefix: "คำนำหน้า" objectStoragePrefixDesc: "ไฟล์ทั้งหมดจะถูกเก็บไว้ภายใต้ไดเร็กทอรีที่มีคำนำหน้านี้นะ" objectStorageEndpoint: "ปลายทาง" -objectStorageEndpointDesc: "เว้นว่างไว้หากคุณใช้ AWS S3 หรือระบุปลายทางเป็น '' หรือ ':' ทั้งนี้ขึ้นอยู่กับผู้ให้บริการที่คุณใช้อยู่ด้วย" +objectStorageEndpointDesc: "เว้นว่างไว้หากคุณใช้ AWS S3 หรือระบุปลายทางเป็น '' + หรือ ':' ทั้งนี้ขึ้นอยู่กับผู้ให้บริการที่คุณใช้อยู่ด้วย" objectStorageRegion: "ภูมิภาค" -objectStorageRegionDesc: "ระบุภูมิภาค เช่น 'xx-east-1' ถ้าหากบริการของคุณไม่ได้แยกความแตกต่างระหว่างภูมิภาคก็ให้ เว้นว่างไว้หรือป้อน 'us-east-1'" +objectStorageRegionDesc: "ระบุภูมิภาค เช่น 'xx-east-1' ถ้าหากบริการของคุณไม่ได้แยกความแตกต่างระหว่างภูมิภาคก็ให้ + เว้นว่างไว้หรือป้อน 'us-east-1'" objectStorageUseSSL: "ใช้ SSL" -objectStorageUseSSLDesc: "ปิดการทำงานนี้ไว้ ถ้าหากคุณจะไม่ใช้ HTTPS สำหรับการเชื่อมต่อ API" +objectStorageUseSSLDesc: "ปิดการทำงานนี้ไว้ ถ้าหากคุณจะไม่ใช้ HTTPS สำหรับการเชื่อมต่อ + API" objectStorageUseProxy: "เชื่อมต่อผ่านพร็อกซี" -objectStorageUseProxyDesc: "ปิดสิ่งนี้ไว้ถ้าหากคุณจะไม่ใช้ Proxy สำหรับการเชื่อมต่อ API" +objectStorageUseProxyDesc: "ปิดสิ่งนี้ไว้ถ้าหากคุณจะไม่ใช้ Proxy สำหรับการเชื่อมต่อ + API" objectStorageSetPublicRead: "ตั้งค่า \"public-read\" ในการอัปโหลด" serverLogs: "บันทึกของเซิร์ฟเวอร์" deleteAll: "ลบทั้งหมด" @@ -523,7 +546,8 @@ sort: "เรียงลำดับ" ascendingOrder: "เรียงจากน้อยไปมาก" descendingOrder: "เรียงจากมากไปน้อย" scratchpad: "กระดานทดลอง" -scratchpadDescription: "Scratchpad เป็นการจัดเตรียมสภาพแวดล้อมสำหรับการทดลอง AiScript แต่คุณสามารถเขียน ดำเนินการ และตรวจสอบผลลัพธ์ของการโต้ตอบกับ Firefish มันได้ด้วยนะ" +scratchpadDescription: "Scratchpad เป็นการจัดเตรียมสภาพแวดล้อมสำหรับการทดลอง AiScript + แต่คุณสามารถเขียน ดำเนินการ และตรวจสอบผลลัพธ์ของการโต้ตอบกับ Firefish มันได้ด้วยนะ" output: "เอาท์พุต" script: "สคริปต์" disablePagesScript: "ปิดการใช้งาน AiScript บนเพจ" @@ -531,11 +555,14 @@ updateRemoteUser: "อัปเดตข้อมูลผู้ใช้งา deleteAllFiles: "ลบไฟล์ทั้งหมด" deleteAllFilesConfirm: "นายแน่ใจแล้วหรอว่าต้องการที่จะลบไฟล์ทั้งหมด?" removeAllFollowing: "เลิกติดตามผู้ใช้ที่ติดตามทั้งหมด" -removeAllFollowingDescription: "การที่คุณดำเนินการนี้จะเลิกติดตามบัญชีทั้งหมดจาก {host} โปรดเรียกใช้คำสั่งสิ่งนี้หากต้องการยกเลิกอินสแตนซ์ เช่น ไม่มีอยู่แล้ว" +removeAllFollowingDescription: "การที่คุณดำเนินการนี้จะเลิกติดตามบัญชีทั้งหมดจาก {host} + โปรดเรียกใช้คำสั่งสิ่งนี้หากต้องการยกเลิกอินสแตนซ์ เช่น ไม่มีอยู่แล้ว" userSuspended: "ผู้ใช้รายนี้ถูกระงับการใช้งาน" userSilenced: "ผู้ใช้รายนี้กำลังถูกปิดกั้น" yourAccountSuspendedTitle: "บัญชีนี้นั้นถูกระงับ" -yourAccountSuspendedDescription: "บัญชีนี้ถูกระงับ เนื่องจากละเมิดข้อกำหนดในการให้บริการของเซิร์ฟเวอร์หรืออาจจะละเมิดหลักเกณฑ์ชุมชน หรือ อาจจะโดนร้องเรียนเรื่องการละเมิดลิขสิทธิ์และอื่นๆอย่างต่อเนื่องซ้ำๆ หากคุณคิดว่าไม่ได้ทำผิดจริงๆหรือตัดสินผิดพลาด ได้โปรดกรุณาติดต่อผู้ดูแลระบบหากคุณต้องการทราบเหตุผลโดยละเอียดเพิ่มเติม และขอความกรุณาอย่าสร้างบัญชีใหม่" +yourAccountSuspendedDescription: "บัญชีนี้ถูกระงับ เนื่องจากละเมิดข้อกำหนดในการให้บริการของเซิร์ฟเวอร์หรืออาจจะละเมิดหลักเกณฑ์ชุมชน + หรือ อาจจะโดนร้องเรียนเรื่องการละเมิดลิขสิทธิ์และอื่นๆอย่างต่อเนื่องซ้ำๆ หากคุณคิดว่าไม่ได้ทำผิดจริงๆหรือตัดสินผิดพลาด + ได้โปรดกรุณาติดต่อผู้ดูแลระบบหากคุณต้องการทราบเหตุผลโดยละเอียดเพิ่มเติม และขอความกรุณาอย่าสร้างบัญชีใหม่" menu: "เมนู" divider: "ตัวแบ่ง" addItem: "เพิ่มรายการ" @@ -589,13 +616,15 @@ smtpHost: "โฮสต์" smtpPort: "พอร์ต" smtpUser: "ชื่อผู้ใช้" smtpPass: "รหัสผ่าน" -emptyToDisableSmtpAuth: "ปล่อยชื่อผู้ใช้และรหัสผ่านว่างไว้เพื่อปิดใช้งานการยืนยัน SMTP" +emptyToDisableSmtpAuth: "ปล่อยชื่อผู้ใช้และรหัสผ่านว่างไว้เพื่อปิดใช้งานการยืนยัน + SMTP" smtpSecure: "ใช้โดยนัย SSL/TLS สำหรับการเชื่อมต่อ SMTP" smtpSecureInfo: "ปิดสิ่งนี้เมื่อใช้ STARTTLS" testEmail: "ทดสอบการส่งอีเมล" wordMute: "ปิดเสียงคำ" regexpError: "ข้อผิดพลาดของนิพจน์ทั่วไป" -regexpErrorDescription: "เกิดข้อผิดพลาดในนิพจน์ทั่วไปในบรรทัดที่ {line} ของการปิดเสียงคำ {tab} ของคุณ:" +regexpErrorDescription: "เกิดข้อผิดพลาดในนิพจน์ทั่วไปในบรรทัดที่ {line} ของการปิดเสียงคำ + {tab} ของคุณ:" instanceMute: "ปิดเสียง อินสแตนซ์" userSaysSomething: "{name} พูดอะไรบางอย่าง" makeActive: "เปิดใช้งาน" @@ -611,10 +640,12 @@ create: "สร้าง" notificationSetting: "ตั้งค่าการแจ้งเตือน" notificationSettingDesc: "เลือกประเภทการแจ้งเตือนที่ต้องการจะแสดง" useGlobalSetting: "ใช้การตั้งค่าส่วนกลาง" -useGlobalSettingDesc: "หากเปิดไว้ ระบบจะใช้การตั้งค่าการแจ้งเตือนของบัญชีของคุณ หากปิดอยู่ สามารถทำการกำหนดค่าแต่ละรายการได้นะ" +useGlobalSettingDesc: "หากเปิดไว้ ระบบจะใช้การตั้งค่าการแจ้งเตือนของบัญชีของคุณ หากปิดอยู่ + สามารถทำการกำหนดค่าแต่ละรายการได้นะ" other: "อื่น ๆ" regenerateLoginToken: "สร้างโทเค็นการเข้าสู่ระบบอีกครั้ง" -regenerateLoginTokenDescription: "สร้างโทเค็นใหม่ที่ใช้ภายในระหว่างการเข้าสู่ระบบ โดยตามหลักปกติแล้วการดำเนินการนี้ไม่จำเป็น หากสร้างใหม่ อุปกรณ์ทั้งหมดจะถูกออกจากระบบนะ" +regenerateLoginTokenDescription: "สร้างโทเค็นใหม่ที่ใช้ภายในระหว่างการเข้าสู่ระบบ + โดยตามหลักปกติแล้วการดำเนินการนี้ไม่จำเป็น หากสร้างใหม่ อุปกรณ์ทั้งหมดจะถูกออกจากระบบนะ" setMultipleBySeparatingWithSpace: "คั่นหลายรายการด้วยช่องว่าง" fileIdOrUrl: "ไฟล์ ID หรือ URL" behavior: "พฤติกรรม" @@ -622,7 +653,8 @@ sample: "ตัวอย่าง" abuseReports: "รายงาน" reportAbuse: "รายงาน" reportAbuseOf: "รายงาน {ชื่อ}" -fillAbuseReportDescription: "กรุณากรอกรายละเอียดเกี่ยวกับรายงานนี้ หากเป็นเรื่องเกี่ยวกับโน้ตโดยเฉพาะ ได้โปรดระบุ URL" +fillAbuseReportDescription: "กรุณากรอกรายละเอียดเกี่ยวกับรายงานนี้ หากเป็นเรื่องเกี่ยวกับโน้ตโดยเฉพาะ + ได้โปรดระบุ URL" abuseReported: "เราได้ส่งรายงานของคุณไปแล้ว ขอบคุณมากๆนะ" reporter: "นักข่าว" reporteeOrigin: "รายงานต้นทาง" @@ -648,7 +680,8 @@ createNewClip: "สร้างคลิปใหม่" unclip: "ลบคลิป" confirmToUnclipAlreadyClippedNote: "โน้ตนี้เป็นส่วนหนึ่งของคลิป \"{name}\" แล้ว คุณต้องการลบออกจากคลิปนี้แทนอย่างงั้นหรอ?" public: "สาธารณะ" -i18nInfo: "Firefish กำลังได้รับการแปลเป็นภาษาต่างๆ โดยอาสาสมัคร คุณสามารถช่วยเหลือได้ที่ {link}" +i18nInfo: "Firefish กำลังได้รับการแปลเป็นภาษาต่างๆ โดยอาสาสมัคร คุณสามารถช่วยเหลือได้ที่ + {link}" manageAccessTokens: "การจัดการโทเค็นการเข้าถึง" accountInfo: "ข้อมูลบัญชี" notesCount: "จำนวนของโน้ต" @@ -667,8 +700,10 @@ no: "ไม่" driveFilesCount: "จำนวนไฟล์ไดรฟ์" driveUsage: "การใช้พื้นที่ไดรฟ์" noCrawle: "ปฏิเสธการจัดทำดัชนีของโปรแกรมรวบรวมข้อมูล" -noCrawleDescription: "ขอให้เครื่องมือค้นหาไม่จัดทำดัชนีหน้าโปรไฟล์ บันทึกย่อ หน้า ฯลฯ" -lockedAccountInfo: "เว้นแต่ว่าคุณจะต้องตั้งค่าการเปิดเผยโน้ตเป็น \"ผู้ติดตามเท่านั้น\" โน้ตย่อของคุณจะปรากฏแก่ทุกคน ถึงแม้ว่าคุณจะเป็นกำหนดให้ผู้ติดตามต้องได้รับการอนุมัติด้วยตนเองก็ตาม" +noCrawleDescription: "ขอให้เครื่องมือค้นหาไม่จัดทำดัชนีหน้าโปรไฟล์ บันทึกย่อ หน้า + ฯลฯ" +lockedAccountInfo: "เว้นแต่ว่าคุณจะต้องตั้งค่าการเปิดเผยโน้ตเป็น \"ผู้ติดตามเท่านั้น\"\ + \ โน้ตย่อของคุณจะปรากฏแก่ทุกคน ถึงแม้ว่าคุณจะเป็นกำหนดให้ผู้ติดตามต้องได้รับการอนุมัติด้วยตนเองก็ตาม" alwaysMarkSensitive: "ทำเครื่องหมายเป็น NSFW เป็นค่าเริ่มต้น" loadRawImages: "โหลดภาพต้นฉบับแทนการแสดงภาพขนาดย่อ" disableShowingAnimatedImages: "ไม่ต้องเล่นภาพเคลื่อนไหว" @@ -684,7 +719,8 @@ clips: "คลิป" experimentalFeatures: "ฟังก์ชั่นทดสอบ" developer: "สำหรับนักพัฒนา" makeExplorable: "ทำให้บัญชีมองเห็นใน \"สำรวจ\"" -makeExplorableDescription: "ถ้าหากคุณปิดการทำงานนี้ บัญชีของคุณนั้นจะไม่แสดงในส่วน \"สำรวจ\" นะ" +makeExplorableDescription: "ถ้าหากคุณปิดการทำงานนี้ บัญชีของคุณนั้นจะไม่แสดงในส่วน + \"สำรวจ\" นะ" showGapBetweenNotesInTimeline: "แสดงช่องว่างระหว่างโพสต์บนไทม์ไลน์" duplicate: "ทำซ้ำ" left: "ซ้าย" @@ -699,7 +735,9 @@ onlineUsersCount: "{n} ผู้ใช้คนนี้กำลังออน nUsers: "{n} ผู้ใช้งาน" nNotes: "{n} โน้ต" sendErrorReports: "ส่งรายงานว่าข้อผิดพลาด" -sendErrorReportsDescription: "เมื่อเปิดใช้งาน ข้อมูลข้อผิดพลาดโดยรายละเอียดนั้นจะถูกแชร์ให้กับ Firefish เมื่อเกิดปัญหา ซึ่งช่วยปรับปรุงคุณภาพของ Firefish\nซึ่งจะรวมถึงข้อมูล เช่น เวอร์ชั่นของระบบปฏิบัติการ เบราว์เซอร์ที่คุณใช้ กิจกรรมของคุณใน Firefish เป็นต้น" +sendErrorReportsDescription: "เมื่อเปิดใช้งาน ข้อมูลข้อผิดพลาดโดยรายละเอียดนั้นจะถูกแชร์ให้กับ + Firefish เมื่อเกิดปัญหา ซึ่งช่วยปรับปรุงคุณภาพของ Firefish\nซึ่งจะรวมถึงข้อมูล เช่น + เวอร์ชั่นของระบบปฏิบัติการ เบราว์เซอร์ที่คุณใช้ กิจกรรมของคุณใน Firefish เป็นต้น" myTheme: "ธีมของฉัน" backgroundColor: "ภาพพื้นหลัง" accentColor: "รูปแบบสี" @@ -745,7 +783,8 @@ userInfo: "ข้อมูลผู้ใช้" unknown: "ไม่ทราบสถานะ" onlineStatus: "สถานะออนไลน์" hideOnlineStatus: "ซ่อนสถานะออนไลน์" -hideOnlineStatusDescription: "การซ่อนสถานะออนไลน์ของคุณช่วยลดความสะดวกของคุณสมบัติบางอย่าง เช่น การค้นหา อ่ะนะ" +hideOnlineStatusDescription: "การซ่อนสถานะออนไลน์ของคุณช่วยลดความสะดวกของคุณสมบัติบางอย่าง + เช่น การค้นหา อ่ะนะ" online: "ออนไลน์" active: "ใช้งานอยู่" offline: "ออฟไลน์" @@ -795,7 +834,8 @@ whatIsNew: "แสดงการเปลี่ยนแปลง" translate: "แปลภาษา" translatedFrom: "แปลมาจาก {x}" accountDeletionInProgress: "กำลังดำเนินการลบบัญชีอยู่" -usernameInfo: "ชื่อที่ระบุบัญชีของคุณจากผู้อื่นในเซิร์ฟเวอร์นี้ คุณสามารถใช้ตัวอักษร (a~z, A~Z), ตัวเลข (0~9) หรือขีดล่าง (_) ชื่อผู้ใช้ไม่สามารถเปลี่ยนแปลงได้ในภายหลัง" +usernameInfo: "ชื่อที่ระบุบัญชีของคุณจากผู้อื่นในเซิร์ฟเวอร์นี้ คุณสามารถใช้ตัวอักษร + (a~z, A~Z), ตัวเลข (0~9) หรือขีดล่าง (_) ชื่อผู้ใช้ไม่สามารถเปลี่ยนแปลงได้ในภายหลัง" aiChanMode: "โหมด Ai " keepCw: "เก็บคำเตือนเนื้อหา" pubSub: "บัญชีผับ/ย่อย" @@ -864,7 +904,8 @@ typeToConfirm: "โปรดป้อน {x} เพื่อยืนยัน" deleteAccount: "ลบบัญชี" document: "เอกสาร" numberOfPageCache: "จำนวนหน้าเพจที่แคช" -numberOfPageCacheDescription: "การเพิ่มจำนวนนี้จะช่วยเพิ่มความสะดวกให้กับผู้ใช้งาน แต่จะทำให้เซิร์ฟเวอร์โหลดมากขึ้นและต้องใช้หน่วยความจำมากขึ้นอีกด้วย" +numberOfPageCacheDescription: "การเพิ่มจำนวนนี้จะช่วยเพิ่มความสะดวกให้กับผู้ใช้งาน + แต่จะทำให้เซิร์ฟเวอร์โหลดมากขึ้นและต้องใช้หน่วยความจำมากขึ้นอีกด้วย" logoutConfirm: "คุณแน่ใจว่าต้องการออกจากระบบ?" lastActiveDate: "ใช้งานล่าสุดที่" statusbar: "ไอคอนบนแถบสถานะ" @@ -881,22 +922,29 @@ sensitiveMediaDetection: "การตรวจจับของสื่อ NS localOnly: "เฉพาะท้องถิ่น" remoteOnly: "รีโมทเท่านั้น" failedToUpload: "การอัปโหลดล้มเหลว" -cannotUploadBecauseInappropriate: "ไม่สามารถอัปโหลดไฟล์นี้ได้เนื่องจากระบบตรวจพบบางส่วนของไฟล์ว่านี้อาจจะเป็น NSFW" +cannotUploadBecauseInappropriate: "ไม่สามารถอัปโหลดไฟล์นี้ได้เนื่องจากระบบตรวจพบบางส่วนของไฟล์ว่านี้อาจจะเป็น + NSFW" cannotUploadBecauseNoFreeSpace: "การอัปโหลดนั้นล้มเหลวเนื่องจากไม่มีความจุของไดรฟ์" beta: "เบต้า" enableAutoSensitive: "ทำเครื่องหมาย NSFW อัตโนมัติ" -enableAutoSensitiveDescription: "อนุญาตให้ตรวจหาและทำเครื่องหมายสื่อ NSFW โดยอัตโนมัติผ่านการเรียนรู้ของเครื่องหากเป็นไปได้ แม้ว่าตัวเลือกนี้จะถูกปิดใช้งาน แต่ก็สามารถเปิดใช้งานได้ทั้งอินสแตนซ์นี้" -activeEmailValidationDescription: "เปิดใช้งานการตรวจสอบที่อยู่อีเมลให้มีความเข้มงวดยิ่งขึ้น ซึ่งอาจจะรวมไปถึงการตรวจสอบที่อยู่อีเมล์ที่ใช้แล้วทิ้งและโดยให้พิจารณาว่าสามารถสื่อสารด้วยได้หรือไม่ เมื่อไม่เลือกระบบจะตรวจสอบเฉพาะรูปแบบของอีเมลเท่านั้น" +enableAutoSensitiveDescription: "อนุญาตให้ตรวจหาและทำเครื่องหมายสื่อ NSFW โดยอัตโนมัติผ่านการเรียนรู้ของเครื่องหากเป็นไปได้ + แม้ว่าตัวเลือกนี้จะถูกปิดใช้งาน แต่ก็สามารถเปิดใช้งานได้ทั้งอินสแตนซ์นี้" +activeEmailValidationDescription: "เปิดใช้งานการตรวจสอบที่อยู่อีเมลให้มีความเข้มงวดยิ่งขึ้น + ซึ่งอาจจะรวมไปถึงการตรวจสอบที่อยู่อีเมล์ที่ใช้แล้วทิ้งและโดยให้พิจารณาว่าสามารถสื่อสารด้วยได้หรือไม่ + เมื่อไม่เลือกระบบจะตรวจสอบเฉพาะรูปแบบของอีเมลเท่านั้น" navbar: "แถบนำทาง" shuffle: "สลับ" account: "บัญชีผู้ใช้" move: "ย้าย" _sensitiveMediaDetection: - description: "ลดความพยายามในการดูแลเซิร์ฟเวอร์ผ่านการจดจำสื่อ NSFW โดยอัตโนมัติผ่านการเรียนรู้ของเครื่อง การทำสิ่งนี้อาจจะเพิ่มภาระบนเซิร์ฟเวอร์เล็กน้อย" + description: "ลดความพยายามในการดูแลเซิร์ฟเวอร์ผ่านการจดจำสื่อ NSFW โดยอัตโนมัติผ่านการเรียนรู้ของเครื่อง + การทำสิ่งนี้อาจจะเพิ่มภาระบนเซิร์ฟเวอร์เล็กน้อย" sensitivity: "การตรวจจับความไว" - sensitivityDescription: "การลดความไวนั้นจะนำไปสู่การตรวจจับที่ผิดพลาดน้อยลง (ผลบวกที่ผิดพลาด) แต่ในขณะที่การเพิ่มนั้นจะนำไปสู่การตรวจหาที่พลาดน้อยลง (ผลลบเท็จ)" + sensitivityDescription: "การลดความไวนั้นจะนำไปสู่การตรวจจับที่ผิดพลาดน้อยลง (ผลบวกที่ผิดพลาด) + แต่ในขณะที่การเพิ่มนั้นจะนำไปสู่การตรวจหาที่พลาดน้อยลง (ผลลบเท็จ)" setSensitiveFlagAutomatically: "ทำเครื่องหมายว่าเป็น NSFW" - setSensitiveFlagAutomaticallyDescription: "ผลลัพธ์ของการตรวจจับภายในนั้นจะยังคงอยู่ ถึงแม้ว่าจะปิดตัวเลือกนี้" + setSensitiveFlagAutomaticallyDescription: "ผลลัพธ์ของการตรวจจับภายในนั้นจะยังคงอยู่ + ถึงแม้ว่าจะปิดตัวเลือกนี้" analyzeVideos: "เปิดใช้งานวิเคราะห์ของวิดีโอ" analyzeVideosDescription: "การวิเคราะห์วิดีโอนอกเหนือจากรูปภาพนั้น การทำสิ่งนี้จะทำให้เพิ่มภาระบนเซิร์ฟเวอร์เล็กน้อย" _emailUnavailable: @@ -915,7 +963,8 @@ _signup: emailSent: "เราได้ส่งอีเมลยืนยันไปยังที่อยู่อีเมลของคุณแล้วนะ ({email}) โปรดคลิกลิงก์ที่รวมไว้เพื่อสร้างบัญชีให้เสร็จสิ้น" _accountDelete: accountDelete: "ลบบัญชีผู้ใช้" - mayTakeTime: "เนื่องจากการลบบัญชีนี้จะเป็นกระบวนการที่ต้องใช้ทรัพยากรมาก จึงอาจจะต้องใช้เวลาสักครู่ถึงจะเสร็จสมบูรณ์ ทั้งนี้ขึ้นอยู่กับจำนวนเนื้อหาที่คุณสร้างและจำนวนไฟล์ที่คุณอัปโหลดนะ" + mayTakeTime: "เนื่องจากการลบบัญชีนี้จะเป็นกระบวนการที่ต้องใช้ทรัพยากรมาก จึงอาจจะต้องใช้เวลาสักครู่ถึงจะเสร็จสมบูรณ์ + ทั้งนี้ขึ้นอยู่กับจำนวนเนื้อหาที่คุณสร้างและจำนวนไฟล์ที่คุณอัปโหลดนะ" sendEmail: "เมื่อการลบบัญชีนี้เสร็จสิ้น เราอาจจะส่งอีเมลไปยังที่อยู่อีเมลของคุณที่เคยลงทะเบียนไว้กับบัญชีนี้นะ" requestAccountDelete: "ร้องขอให้ลบบัญชี" started: "การลบได้เริ่มต้นขึ้น" @@ -950,11 +999,13 @@ _preferencesBackups: inputName: "กรุณาป้อนชื่อสำหรับข้อมูลสำรองนี้" cannotSave: "การบันทึกล้มเหลว" nameAlreadyExists: "มีข้อมูลสำรองชื่อ \"{name}\" นี้อยู่แล้ว กรุณาป้อนชื่ออื่นนะ" - applyConfirm: "คุณต้องการใช้ข้อมูลสำรอง \"{name}\" กับอุปกรณ์นี้อย่างงั้นจริงหรอ การตั้งค่าที่มีอยู่ของอุปกรณ์นี้จะถูกเขียนทับนะ" + applyConfirm: "คุณต้องการใช้ข้อมูลสำรอง \"{name}\" กับอุปกรณ์นี้อย่างงั้นจริงหรอ + การตั้งค่าที่มีอยู่ของอุปกรณ์นี้จะถูกเขียนทับนะ" saveConfirm: "บันทึกข้อมูลสำรองเป็น {name} มั้ย?" deleteConfirm: "ลบข้อมูลสำรอง {name} มั้ย?" renameConfirm: "เปลี่ยนชื่อข้อมูลสำรองนี้จาก \"{old}\" เป็น \"{new}\" หรือป่าว" - noBackups: "ไม่มีข้อมูลสำรองนะ คุณสามารถสำรองข้อมูลการตั้งค่าไคลเอนต์ของคุณบนเซิร์ฟเวอร์นี้โดยใช้ \"สร้างการสำรองข้อมูลใหม่\"ได้นะ" + noBackups: "ไม่มีข้อมูลสำรองนะ คุณสามารถสำรองข้อมูลการตั้งค่าไคลเอนต์ของคุณบนเซิร์ฟเวอร์นี้โดยใช้ + \"สร้างการสำรองข้อมูลใหม่\"ได้นะ" createdAt: "สร้างเมื่อ: {date} {time}" updatedAt: "อัปเดตเมื่อ: {date} {time}" cannotLoad: "การโหลดล้มเหลว" @@ -972,7 +1023,8 @@ _aboutFirefish: source: "ซอร์สโค้ด" translation: "รับแปลภาษา Firefish" donate: "บริจาคให้กับ Firefish" - morePatrons: "เราขอขอบคุณสำหรับความช่วยเหลือจากผู้ช่วยอื่นๆ ที่ไม่ได้ระบุไว้ที่นี่นะ ขอขอบคุณ! 🥰" + morePatrons: "เราขอขอบคุณสำหรับความช่วยเหลือจากผู้ช่วยอื่นๆ ที่ไม่ได้ระบุไว้ที่นี่นะ + ขอขอบคุณ! 🥰" patrons: "สมาชิกพันธมิตร" _nsfw: respect: "ซ่อนสื่อ NSFW" @@ -980,7 +1032,8 @@ _nsfw: force: "ซ่อนสื่อทั้งหมด" _mfm: cheatSheet: "โค้ด MFM Cheat Sheet" - intro: "MFM เป็นภาษามาร์กอัปพิเศษเฉพาะของ Firefish ที่สามารถใช้ได้ในหลายที่ คุณยังสามารถดูรายการไวยากรณ์ MFM ที่มีอยู่ทั้งหมดได้ที่นี่นะ" + intro: "MFM เป็นภาษามาร์กอัปพิเศษเฉพาะของ Firefish ที่สามารถใช้ได้ในหลายที่ คุณยังสามารถดูรายการไวยากรณ์ + MFM ที่มีอยู่ทั้งหมดได้ที่นี่นะ" dummy: "Firefish ขยายโลกของ Fediverse" mention: "กล่าวถึง" mentionDescription: "คุณสามารถระบุผู้ใช้โดยใช้ At-Symbol และชื่อผู้ใช้ได้นะ" @@ -1069,15 +1122,18 @@ _menuDisplay: hide: "ซ่อน" _wordMute: muteWords: "ปิดเสียงคำ" - muteWordsDescription: "คั่นด้วยช่องว่างสำหรับเงื่อนไข AND หรือด้วยการขึ้นบรรทัดใหม่สำหรับเงื่อนไข OR นะ" + muteWordsDescription: "คั่นด้วยช่องว่างสำหรับเงื่อนไข AND หรือด้วยการขึ้นบรรทัดใหม่สำหรับเงื่อนไข + OR นะ" muteWordsDescription2: "ล้อมรอบคีย์เวิร์ดด้วยเครื่องหมายทับเพื่อใช้นิพจน์ทั่วไป" softDescription: "ซ่อนโน้ตให้ตรงตามเงื่อนไขที่ตั้งไว้จากไทม์ไลน์" - hardDescription: "ป้องกันไม่ให้โน้ตย่อที่ตรงตามเงื่อนไขที่ตั้งไว้ไม่ให้ถูกเพิ่มลงในไทม์ไลน์ นอกจากนี้ โน้ตเหล่านี้จะไม่ถูกเพิ่มลงในไทม์ไลน์แม้ว่าจะมีการเปลี่ยนแปลงเงื่อนไขยังไงก็ตาม" + hardDescription: "ป้องกันไม่ให้โน้ตย่อที่ตรงตามเงื่อนไขที่ตั้งไว้ไม่ให้ถูกเพิ่มลงในไทม์ไลน์ + นอกจากนี้ โน้ตเหล่านี้จะไม่ถูกเพิ่มลงในไทม์ไลน์แม้ว่าจะมีการเปลี่ยนแปลงเงื่อนไขยังไงก็ตาม" soft: "ซอฟ" hard: "ยาก" mutedNotes: "ปิดเสียงโน้ต" _instanceMute: - instanceMuteDescription: "การดำเนินการนี้จะปิดเสียง\"โน้ต/รีโน้ต\"จากอินสแตนซ์ที่อยู่ในรายการ รวมถึงบันทึกของผู้ใช้ที่ตอบกลับผู้ใช้จากอินสแตนซ์ที่ปิดเสียง" + instanceMuteDescription: "การดำเนินการนี้จะปิดเสียง\"โน้ต/รีโน้ต\"จากอินสแตนซ์ที่อยู่ในรายการ + รวมถึงบันทึกของผู้ใช้ที่ตอบกลับผู้ใช้จากอินสแตนซ์ที่ปิดเสียง" instanceMuteDescription2: "คั่นด้วยการขึ้นบรรทัดใหม่" title: "ซ่อนโน้ตจากอินสแตนซ์ที่มีอยู่ในรายการ" heading: "รายชื่ออินสแตนซ์ที่ถูกปิดเสียง" @@ -1191,3 +1247,23 @@ _deck: antenna: "เสาอากาศ" list: "รายการ" mentions: "พูดถึง" +noThankYou: ไม่ล่ะขอบคุณ +removeReaction: ลบรีเเอดชั่นของคุณ +renoteMute: ปิดเสียงบูส +renoteUnmute: เลิกปิดเสียงบูส +manageGroups: จัดการกลุ่ม +addInstance: เพิ่มเซิฟเวอร์ +searchPlaceholder: ค้นหา Firefish +deleted: ลบแล้ว +editNote: แก้ไขโพสต์ +edited: แก้ไขแล้วเมื่อ {date} {time} +jumpToPrevious: ข้ามไปที่ก่อนหน้านี้ +listsDesc: ลิสต์รายการนั้นช่วยให้คุณได้สร้างไทม์ไลน์กับผู้ใช้ที่ระบุได้นะ ยังสามารถเข้าถึงได้จากหน้าไทม์ไลน์ได้อีกด้วย +enableEmojiReactions: เปิดใช้งานรีแอดชั่นอีโมจิ +selectChannel: เลือกช่อง +older: เก่ากว่านี้ +newer: ใหม่กว่านี้ +selectInstance: เลือกเซิฟเวอร์ +showEmojisInReactionNotifications: แสดงอิโมจิในการแจ้งเตือนรีแอคชั่น +flagSpeakAsCat: พูดเหมือนแมว +cw: คำเตือนเนื้อหา diff --git a/packages/backend/native-utils/Cargo.lock b/packages/backend/native-utils/Cargo.lock index 71206507bd..05e9809eea 100644 --- a/packages/backend/native-utils/Cargo.lock +++ b/packages/backend/native-utils/Cargo.lock @@ -1412,6 +1412,7 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" name = "migration" version = "0.1.0" dependencies = [ + "basen", "futures", "indicatif", "native-utils", diff --git a/packages/backend/native-utils/migration/Cargo.toml b/packages/backend/native-utils/migration/Cargo.toml index 32adb62c81..454d9bff43 100644 --- a/packages/backend/native-utils/migration/Cargo.toml +++ b/packages/backend/native-utils/migration/Cargo.toml @@ -10,11 +10,11 @@ path = "src/lib.rs" [features] default = [] -convert = ["dep:indicatif", "dep:futures"] +convert = ["dep:native-utils", "dep:indicatif", "dep:futures"] [dependencies] serde_json = "1.0.96" -native-utils = { path = "../" } +native-utils = { path = "../", optional = true } indicatif = { version = "0.17.4", features = ["tokio"], optional = true } tokio = { version = "1.28.2", features = ["full"] } futures = { version = "0.3.28", optional = true } @@ -24,6 +24,7 @@ urlencoding = "2.1.2" redis = { version = "0.23.0", features = ["tokio-rustls-comp"] } sea-orm = "0.11.3" url = { version = "2.4.0", features = ["serde"] } +basen = "0.1.0" [dependencies.sea-orm-migration] version = "0.11.0" diff --git a/packages/backend/native-utils/migration/src/lib.rs b/packages/backend/native-utils/migration/src/lib.rs index dbe2ce1a0c..57ca203f6d 100644 --- a/packages/backend/native-utils/migration/src/lib.rs +++ b/packages/backend/native-utils/migration/src/lib.rs @@ -1,5 +1,7 @@ pub use sea_orm_migration::prelude::*; +use basen::BASE36; + mod m20230531_180824_drop_reversi; mod m20230627_185451_index_note_url; mod m20230709_000510_move_antenna_to_cache; @@ -18,3 +20,12 @@ impl MigratorTrait for Migrator { ] } } + +pub fn get_timestamp(id: &str) -> i64 { + const TIME_2000: i64 = 946_684_800_000; + let n: Option = BASE36.decode_var_len(&id[0..8]); + match n { + None => -1, + Some(n) => n as i64 + TIME_2000, + } +} diff --git a/packages/backend/native-utils/migration/src/m20230806_170616_fix_antenna_stream_ids.rs b/packages/backend/native-utils/migration/src/m20230806_170616_fix_antenna_stream_ids.rs index ea23f4319f..6d45b76139 100644 --- a/packages/backend/native-utils/migration/src/m20230806_170616_fix_antenna_stream_ids.rs +++ b/packages/backend/native-utils/migration/src/m20230806_170616_fix_antenna_stream_ids.rs @@ -1,9 +1,10 @@ use std::env; -use native_utils::util::id; use redis::Commands; use sea_orm_migration::prelude::*; +use crate::get_timestamp; + #[derive(DeriveMigrationName)] pub struct Migration; @@ -31,7 +32,7 @@ impl MigrationTrait for Migration { let all_elems: Vec>> = redis_conn.xrange_all(key).unwrap(); // Get all post IDs in stream let stream_ids = all_elems .iter() - .map(|v| format!("{}-*", id::get_timestamp(&v[1][1]))); // Get correct stream id with timestamp + .map(|v| format!("{}-*", get_timestamp(&v[1][1]))); // Get correct stream id with timestamp redis_conn.del::<_, ()>(key).unwrap(); for (j, v) in stream_ids.enumerate() { redis_conn diff --git a/packages/backend/package.json b/packages/backend/package.json index 099cc852f0..dfd0012855 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -102,6 +102,7 @@ "nodemailer": "6.9.4", "nsfwjs": "2.4.2", "oauth": "^0.10.0", + "opencc-js": "^1.0.5", "os-utils": "0.0.14", "otpauth": "^9.1.4", "parse5": "7.1.2", diff --git a/packages/backend/src/server/api/endpoints/notes/translate.ts b/packages/backend/src/server/api/endpoints/notes/translate.ts index d86fc12a2e..414e761c1c 100644 --- a/packages/backend/src/server/api/endpoints/notes/translate.ts +++ b/packages/backend/src/server/api/endpoints/notes/translate.ts @@ -1,6 +1,7 @@ import { URLSearchParams } from "node:url"; import fetch from "node-fetch"; import config from "@/config/index.js"; +import { Converter } from "opencc-js"; import { getAgentByUrl } from "@/misc/fetch.js"; import { fetchMeta } from "@/misc/fetch-meta.js"; import { Notes } from "@/models/index.js"; @@ -38,6 +39,13 @@ export const paramDef = { required: ["noteId", "targetLang"], } as const; +function convertChinese(convert: boolean, src: string) { + if (!convert) return src; + + const converter = Converter({ from: "cn", to: "twp" }); + return converter(src); +} + export default define(meta, paramDef, async (ps, user) => { const note = await getNote(ps.noteId, user).catch((err) => { if (err.id === "9725d0ce-ba28-4dde-95a7-2cbb2c15de24") @@ -93,7 +101,7 @@ export default define(meta, paramDef, async (ps, user) => { return { sourceLang: json.detectedLanguage?.language, - text: json.translatedText, + text: convertChinese(ps.targetLang === "zh-TW", json.translatedText), }; } @@ -128,6 +136,6 @@ export default define(meta, paramDef, async (ps, user) => { return { sourceLang: json.translations[0].detected_source_language, - text: json.translations[0].text, + text: convertChinese(ps.targetLang === "zh-TW", json.translations[0].text), }; }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2bf98cba5f..602cb832b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -306,6 +306,9 @@ importers: oauth: specifier: ^0.10.0 version: 0.10.0 + opencc-js: + specifier: ^1.0.5 + version: 1.0.5 os-utils: specifier: 0.0.14 version: 0.0.14 @@ -14612,6 +14615,10 @@ packages: is-wsl: 2.2.0 dev: true + /opencc-js@1.0.5: + resolution: {integrity: sha512-LD+1SoNnZdlRwtYTjnQdFrSVCAaYpuDqL5CkmOaHOkKoKh7mFxUicLTRVNLU5C+Jmi1vXQ3QL4jWdgSaa4sKjg==} + dev: false + /opencollective-postinstall@2.0.3: resolution: {integrity: sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==} hasBin: true