diff --git a/.config/example.yml b/.config/example.yml index c8735bf69..fcf22debc 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -30,6 +30,10 @@ url: https://example.tld/ # The port that your Misskey server should listen on. port: 3000 +# You can also use UNIX domain socket. +# socket: /path/to/misskey.sock +# chmodSocket: '777' + # ┌──────────────────────────┐ #───┘ PostgreSQL configuration └──────────────────────────────── diff --git a/CHANGELOG.md b/CHANGELOG.md index 66fa58919..4194a0427 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,9 @@ - フォローやお気に入り登録をしていないチャンネルを開く時は概要ページを開くように - 画面ビューワをタップした場合、マウスクリックと同様に画像ビューワを閉じるように - オフライン時の画面にリロードボタンを追加 +- Deckで非ルートページにアクセスした際に簡易UIで表示しない設定を追加 +- ロール設定画面でロールIDを確認できるように +- コンテキストメニュー表示時のパフォーマンスを改善 - Fix: サーバーメトリクスが90度傾いている - Fix: 非ログイン時にクレデンシャルが必要なページに行くとエラーが出る問題を修正 - Fix: sparkle内にリンクを入れるとクリック不能になる問題の修正 @@ -55,6 +58,7 @@ - リモートサーバーからのNSFW映像のキャッシュだけを無効化できるオプションを追加 - MeilisearchにIndexするノートの範囲を設定できるように - Export notes with file detail +- Add unix socket support - Fix: Remove Meilisearch index when notes are deleted - Fix: 非英語環境でのPostgreSQLのエラーハンドリングを修正 - Fix: インスタンスのアイコンがbase64の場合の挙動を修正 diff --git a/locales/es-ES.yml b/locales/es-ES.yml index 2d1a68de9..127dc367e 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -49,6 +49,7 @@ delete: "Borrar" deleteAndEdit: "Borrar y editar" deleteAndEditConfirm: "¿Estás seguro de que quieres borrar esta nota y editarla? Perderás todas las reacciones, renotas y respuestas." addToList: "Agregar a lista" +addToAntenna: "Añadir a la antena" sendMessage: "Enviar un mensaje" copyRSS: "Copiar RSS" copyUsername: "Copiar nombre de usuario" @@ -56,6 +57,7 @@ copyUserId: "Copiar ID del usuario" copyNoteId: "Copiar ID de la nota" copyFileId: "Copiar un archivo ID" copyFolderId: "Copiar carpeta ID" +copyProfileUrl: "Copiar la URL del perfil" searchUser: "Buscar un usuario" reply: "Responder" loadMore: "Ver más" @@ -154,6 +156,8 @@ addEmoji: "Agregar emoji" settingGuide: "Configuración sugerida" cacheRemoteFiles: "Mantener en cache los archivos remotos" cacheRemoteFilesDescription: "Si desactiva esta configuración, Los archivos remotos se cargarán desde el link directo sin usar la caché. Con eso se puede ahorrar almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas." +cacheRemoteSensitiveFiles: "Cachear archivos remotos sensibles" +cacheRemoteSensitiveFilesDescription: "Cuando esta opción está desactivada, los archivos remotos sensibles son cargador directamente de la instancia origen sin ser cacheados." flagAsBot: "Esta cuenta es un bot" flagAsBotDescription: "En caso de que esta cuenta fuera usada por un programa, active esta opción. Al hacerlo, esta opción servirá para otros desarrolladores para evitar cadenas infinitas de reacciones, y ajustará los sistemas internos de Misskey para que trate a esta cuenta como un bot." flagAsCat: "Esta cuenta es un gato" @@ -1002,6 +1006,7 @@ rolesAssignedToMe: "Roles asignados a mí" resetPasswordConfirm: "¿Realmente quieres cambiar la contraseña?" sensitiveWords: "Palabras sensibles" sensitiveWordsDescription: "La visibilidad de todas las notas que contienen cualquiera de las palabras configuradas serán puestas en \"Inicio\" automáticamente. Puedes enumerás varias separándolas con saltos de línea" +sensitiveWordsDescription2: "Si se usan espacios se crearán expresiones AND y las palabras subsecuentes con barras inclinadas se convertirán en expresiones regulares." notesSearchNotAvailable: "No se puede buscar una nota" license: "Licencia" unfavoriteConfirm: "¿Desea quitar de favoritos?" @@ -1021,23 +1026,46 @@ dataSaver: "Ahorro de datos" accountMigration: "Migración de cuenta" accountMoved: "Este usuario se movió a una nueva cuenta:" accountMovedShort: "Esta cuenta ha sido migrada." +operationForbidden: "Operación prohibida" +forceShowAds: "Siempre mostrar anuncios" addMemo: "Añadir nota" editMemo: "Editar nota" reactionsList: "Lista de reacciones" renotesList: "Renotas" +notificationDisplay: "Notificaciones" +leftTop: "Arriba a la izquierda" +rightTop: "Arriba a la derecha" +leftBottom: "Abajo a la izquierda" +rightBottom: "Abajo a la derecha" stackAxis: "Dirección de apilado" +vertical: "Vertical" horizontal: "Horizontal" position: "Posición" serverRules: "Reglas del servidor" +pleaseConfirmBelowBeforeSignup: "Por favor confirma antes de continuar el registro" +pleaseAgreeAllToContinue: "Tienes que estar de acuerdo con los campos anteriores para contnuar." continue: "Continuar" preservedUsernames: "Nombre de usuario reservado" +preservedUsernamesDescription: "La lista de nombres de usuario para reservar tienen que separarse con saltos de línea.\nEstos estarán indisponibles durante la creación de cuentas, pero pueden ser usados para que los administradores puedan crear esas cuentas manualmente. Las cuentas existentes con esos nombres de usuario no se verán afectadas." +createNoteFromTheFile: "Componer una nota desde éste archivo" archive: "Archivo" channelArchiveConfirmTitle: "¿Seguro de archivar {name}?" +channelArchiveConfirmDescription: "Un canal archivado no aparecerá en la lista de canales ni en los resultados. Las nuevas publicaciones tampoco serán añadidas." +thisChannelArchived: "El canal ha sido archivado." displayOfNote: "Mostrar notas" initialAccountSetting: "Configración inicial de su cuenta\nか\nConfigración de inicio" youFollowing: "Siguiendo" +preventAiLearning: "Rechazar el uso en el Aprendizaje de Máquinas. (IA Generativa)" +preventAiLearningDescription: "Pedirle a las arañas (crawlers) no usar los textos publicados o imágenes en el aprendizaje automático (IA Predictiva / Generativa). Ésto se logra añadiendo una marca respuesta HTML con la cadena \"noai\" al cantenido. Una prevención total no podría lograrse sólo usando ésta marca, ya que puede ser simplemente ignorada." options: "Opción" +specifyUser: "Especificar usuario" +failedToPreviewUrl: "No se pudo generar la vista previa" update: "Actualizar" +rolesThatCanBeUsedThisEmojiAsReaction: "Roles que pueden usar este emoji como reacción" +rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "Si no se especifican roles, cualquiera podrá usar éste emoji como reacción." +rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Éstos roles deben ser públicos." +cancelReactionConfirm: "¿Realmente quieres eliminar la reacción?" +changeReactionConfirm: "¿Realmente quieres cambiar la reacción?" later: "Ahora no" goToMisskey: "ir a Misskey" additionalEmojiDictionary: "Diccionario adicional de Emoji" @@ -1045,6 +1073,24 @@ installed: "Instalado" branding: "Marca" enableServerMachineStats: "Publicar estadísticas de hardware del servidor" enableIdenticonGeneration: "Activar generación de identicon por usuario" +turnOffToImprovePerformance: "Desactivar esto puede aumentar el rendimiento." +createInviteCode: "Generar invitación" +createWithOptions: "Generar con opciones" +createCount: "Conteo de invitaciones" +inviteCodeCreated: "Invitación generada" +inviteLimitExceeded: "Has excedido el límite de invitaciones que puedes generar." +createLimitRemaining: "Límite de invitaciones: quedan {limit}" +inviteLimitResetCycle: "El límite ha sido reiniciado a {limit} por {time}." +expirationDate: "Fecha de caducidad" +noExpirationDate: "Sin caducidad" +inviteCodeUsedAt: "Código de invitación usado el" +registeredUserUsingInviteCode: "Invitación usada por" +waitingForMailAuth: "Verificación de correo pendiente" +inviteCodeCreator: "Invitación creada por" +usedAt: "Usada el" +unused: "Sin usar" +used: "Usada" +expired: "Caducada" _initialAccountSetting: accountCreated: "¡La cuenta ha sido creada!" letsStartAccountSetup: "Para empezar, creemos tu perfil." @@ -1054,14 +1100,28 @@ _initialAccountSetting: theseSettingsCanEditLater: "Puedes cambiar estos ajustes más tarde." youCanEditMoreSettingsInSettingsPageLater: "Desde la pestaña de \"Configuración\" puedes modificar más ajustes. Asegúrate de visitarla después." followUsers: "Comienza a seguir a usuarios que te interesen para construir tu línea de tiempo." + pushNotificationDescription: "Habilitar las notificaciones push te permitirá recibir notificaciones de {name} directamente en tu dispositivo." + initialAccountSettingCompleted: "¡Configuración del perfil completada!" + haveFun: "¡Disfruta de {name}!" + ifYouNeedLearnMore: "Si quieres aprender cómo usar {name} (Misskey), por favor, visita {link}." + skipAreYouSure: "¿Realmente quieres saltarte la configuración del perfil?" + laterAreYouSure: "¿Realmente quieres configurar tu perfil después?" +_serverRules: + description: "Un conjunto de reglas que serán mostradas antes del registro. Configurar un sumario de términos de servicio es recomendado." _accountMigration: moveFrom: "Trasladar de otra cuenta a ésta" + moveFromSub: "Crear un alias para otra cuenta." moveFromLabel: "Cuenta desde la que se realiza el traslado:" moveFromDescription: "Si quieres transferir seguidores de otra cuenta a esta cuenta y trasladarlos, tendrás que crear un alias aquí. Asegúrate de crearlo antes de realizar el traslado. Introduce la cuenta desde la que estás moviendo los seguidores así: @person@instance.com" moveTo: "Mover esta cuenta a una nueva" moveToLabel: "Cuenta destino:" + moveCannotBeUndone: "La migración de la cuenta no puede ser revertida." moveAccountDescription: "Esta operación no puede deshacerse. En primer lugar, asegúrese de haber creado un alias para esta cuenta en la cuenta a la que se va a trasladar. Después de crear el alias, introduzca la cuenta a la que se está trasladando de la siguiente manera: @person@instance.com" + moveAccountHowTo: "Para migrar, primero crea un alias para ésta cuenta en la cuenta a donde te moverás.\nDespués de crear el alias, ingresa la cuenta a mover de la siguiente forma:\n@usuario@servidor.ejempo.com" + startMigration: "Migrar" migrationConfirm: "¿Estás seguro de que quieres mover esta cuenta a {account}? Una vez trasladada, no podrás deshacer el traslado y no podrás volver a utilizar la cuenta original.\n\nAdemás, compruebe que ha configurado un alias en el destino del traslado." + movedAndCannotBeUndone: "\nLa migración decuenta ha sido completada.\nNo se puede revertir éste proceso." + postMigrationNote: "Ésta cuenta dejará de seguir a todas las cuentas en las siguientes 24 horas después de que finalice la migración.\nEl número de seguidos y seguidores serán 0. Para evitar que Para evitar que tus seguidores dejen de ver las publicaciones, todas serán marcadas como \"sólo seguidores\"." movedTo: "Cuenta destino:" _achievements: earnedAt: "Desbloqueado el" @@ -1236,6 +1296,7 @@ _achievements: description: "30 minutos dedicados a Misskey" _client60min: title: "Viendo mucho Misskey." + description: "Dejar abierto Misskey por al menos 60 minutos" _noteDeletedWithin1min: title: "Ah... Mejor no..." description: "Borrar una nota antes que de pase 1 minuto" @@ -1324,6 +1385,8 @@ _role: iconUrl: "URL del ícono" asBadge: "Mostrar como emblema" descriptionOfAsBadge: "Este ícono de rol se mostrará a lado del nombre de usuario cuando este rol se encuentre activo." + isExplorable: "Hacer el rol explorable" + descriptionOfIsExplorable: "La línea de tiempo de éste rol y la lista de usuarios serán públicos si se activa.." displayOrder: "Posición" descriptionOfDisplayOrder: "Entre más alto el número, mayor es la posición en la interfaz." canEditMembersByModerator: "Permitir a los moderadores editar los miembros" @@ -1338,8 +1401,12 @@ _role: ltlAvailable: "Explorar la línea de tiempo local" canPublicNote: "Permitir la publicación" canInvite: "Puede crear códigos de invitación" + inviteLimit: "Límite de invitaciones" + inviteLimitCycle: "Enfriamiento del límite de invitaciones" + inviteExpirationTime: "Intervalo de caducidad de invitaciones" canManageCustomEmojis: "Administrar emojis personalizados" driveCapacity: "Capacidad del drive" + alwaysMarkNsfw: "Siempre marcar archivos como NSFW" pinMax: "Máximo de notas fijadas" antennaMax: "Máximo de antenas" wordMuteMax: "Máximo de caracteres en palabras silenciadas" @@ -1399,6 +1466,7 @@ _ad: back: "Deseleccionar" reduceFrequencyOfThisAd: "Mostrar menos este anuncio." hide: "No mostrar" + timezoneinfo: "El día de la semana está determidado por la zona horaria del servidor." _forgotPassword: enterEmail: "Ingrese el correo usado para registrar la cuenta. Se enviará un link para resetear la contraseña." ifNoEmail: "Si no utilizó un correo para crear la cuenta, contáctese con el administrador." @@ -1450,6 +1518,10 @@ _aboutMisskey: donate: "Donar a Misskey" morePatrons: "Muchas más personas nos apoyan. Muchas gracias🥰" patrons: "Patrocinadores" +_displayOfSensitiveMedia: + respect: "Esconder medios marcados como sensibles" + ignore: "Mostrar medios marcados como sensibles" + force: "Esconder todala multimedia" _instanceTicker: none: "No mostrar" remote: "Mostrar a usuarios remotos" @@ -1468,6 +1540,8 @@ _channel: following: "Siguiendo" usersCount: "{n} participantes" notesCount: "{n} notas" + nameAndDescription: "Nombre y descripción" + nameOnly: "Sólo nombre" _menuDisplay: sideFull: "Horizontal" sideIcon: "Horizontal (ícono)" @@ -1586,6 +1660,13 @@ _time: hour: "Horas" day: "Días" _timelineTutorial: + title: "Cómo usar Misskey" + step1_1: "Ésta es la \"línea de tiempo\". Todas las \"notas\" que sean publicadas en {name} serán mostradas cronológicamente aquí." + step1_2: "Hay varias líneas de tiempo. Por ejemplo, la línea temporal \"Inicio\" contiene las notas de otros usuarios que sigues, y la línea \"Local\" contandrá las notas de todos los usuarios de {name}." + step2_1: "Ahora probemos publicar una nota. Puedes hacerlo presionando el botón que tiene un ícono de lápiz." + step2_2: "¿Qué tal si escribimos una introducción? o sólo un \"¡Hola {name}!\" ¿No te apetece?" + step3_1: "¿Terminaste de publicar tu primera nota?" + step3_2: "Tu primera nota ahora se mostrará en tu línea de tiempo." step4_1: "También puedes añadir \"Reacciones\" a notas." step4_2: "Para añadir una reacción selecciona el botón \"+\" en la nota y escoge el emoji que quieras para reaccionar." _2fa: @@ -1915,6 +1996,7 @@ _deck: introduction: "¡Crea la interfaz perfecta para tí organizando las columnas libremente!" introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas columnas donde quieras." widgetsIntroduction: "Por favor selecciona \"Editar Widgets\" en el menú columna y agrega un widget." + useSimpleUiForNonRootPages: "Mostrar páginas no pertenecientes a la raíz con la interfaz simple" _columns: main: "Principal" widgets: "Widgets" @@ -1925,6 +2007,7 @@ _deck: channel: "Canal" mentions: "Menciones" direct: "Notas directas" + roleTimeline: "Linea de tiempo del rol" _dialog: charactersExceeded: "¡Has excedido el límite de caracteres! Actualmente {current} de {max}." charactersBelow: "¡Estás por debajo del límite de caracteres! Actualmente {current} de {min}." diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 5d7a773f8..f76a26632 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -52,6 +52,11 @@ addToList: "Ajouter à une liste" sendMessage: "Envoyer un message" copyRSS: "Copier le RSS" copyUsername: "Copier le nom d’utilisateur·rice" +copyUserId: "Copier l'identifiant de l'utilisateur" +copyNoteId: "Copier l'identifiant de la note" +copyFileId: "Copier l'identifiant du fichier" +copyFolderId: "Copier l'identifiant du dossier" +copyProfileUrl: "Copier l'URL du profil" searchUser: "Chercher un·e utilisateur·rice" reply: "Répondre" loadMore: "Afficher plus …" @@ -134,6 +139,7 @@ unsuspendConfirm: "Êtes-vous sûr·e de vouloir annuler la suspension de ce com selectList: "Sélectionner une liste" selectChannel: "Sélectionner un canal" selectAntenna: "Sélectionner une antenne" +editAntenna: "Modifier l'antenne" selectWidget: "Sélectionner un widget" editWidgets: "Modifier les widgets" editWidgetsExit: "Valider les modifications" @@ -146,6 +152,8 @@ addEmoji: "Ajouter un émoji" settingGuide: "Configuration proposée" cacheRemoteFiles: "Mise en cache des fichiers distants" cacheRemoteFilesDescription: "Lorsque cette option est désactivée, les fichiers distants sont chargés directement depuis l’instance distante. La désactiver diminuera certes l’utilisation de l’espace de stockage local mais augmentera le trafic réseau puisque les miniatures ne seront plus générées." +cacheRemoteSensitiveFiles: "Mettre en cache les fichiers distants sensibles" +cacheRemoteSensitiveFilesDescription: "Si vous désactivez ce paramètre, les fichiers sensibles distants ne seront pas mis en cache et un lien direct sera utilisé à la place" flagAsBot: "Ce compte est un robot" flagAsBotDescription: "Si ce compte est géré de manière automatisée, choisissez cette option. Si elle est activée, elle agira comme un marqueur pour les autres développeurs afin d'éviter des chaînes d'interaction sans fin avec d'autres robots et d'ajuster les systèmes internes de Misskey pour traiter ce compte comme un robot." flagAsCat: "Ce compte est un chat" @@ -154,6 +162,7 @@ flagShowTimelineReplies: "Afficher les réponses dans le fil" flagShowTimelineRepliesDescription: "Affiche les réponses des utilisateurs aux notes des autres utilisateurs dans la timeline si cette option est activée." autoAcceptFollowed: "Accepter automatiquement les demandes d’abonnement venant d’utilisateur·rice·s que vous suivez" addAccount: "Ajouter un compte" +reloadAccountsList: "Rafraichir la liste des comptes" loginFailed: "Échec de la connexion" showOnRemote: "Voir sur l’instance distante" general: "Général" @@ -260,6 +269,8 @@ noMoreHistory: "Il n’y a plus d’historique" startMessaging: "Commencer à discuter" nUsersRead: "Lu par {n} personnes" agreeTo: "J’accepte {0}" +agree: "Accepter" +termsOfService: "Conditions d'utilisation" start: "Commencer" home: "Principal" remoteUserCaution: "Les informations de ce compte risqueraient d’être incomplètes du fait que l’utilisateur·rice provient d’une instance distante." @@ -302,6 +313,7 @@ copyUrl: "Copier l’URL" rename: "Renommer" avatar: "Avatar" banner: "Bannière" +displayOfSensitiveMedia: "Afficher les médias sensibles" whenServerDisconnected: "Lorsque la connexion au serveur est perdue" disconnectedFromServer: "Déconnecté·e du serveur" reload: "Rafraîchir" @@ -391,11 +403,15 @@ about: "Informations" aboutMisskey: "À propos de Misskey" administrator: "Administrateur" token: "Jeton" +2fa: "Authentification à deux facteurs" +totp: "Application d'authentification" +totpDescription: "Entrez un mot de passe à usage unique à l'aide d'une application d'authentification" moderator: "Modérateur·rice·s" moderation: "Modérations" nUsersMentioned: "{n} utilisateur·rice·s mentionné·e·s" securityKey: "Clé de sécurité" lastUsed: "Dernier utilisé" +lastUsedAt: "Dernière utilisation : {t}" unregister: "Se désinscrire" passwordLessLogin: "Se connecter sans mot de passe" resetPassword: "Réinitialiser le mot de passe" @@ -533,9 +549,14 @@ userSuspended: "Cet·te utilisateur·rice a été suspendu·e." userSilenced: "Cette utilisateur·trice a été mis·e en sourdine." yourAccountSuspendedTitle: "Ce compte est suspendu" yourAccountSuspendedDescription: "Ce compte est suspendu car vous avez enfreint les conditions d'utilisation de l'instance, ou pour un motif similaire. Si vous souhaitez connaître en détail les raisons de cette suspension, renseignez-vous auprès de l'administrateur·rice de votre instance. Merci de ne pas créer de nouveau compte." +tokenRevoked: "Ce jeton est invalide." +tokenRevokedDescription: "Votre jeton de connexion a expiré. Veuillez vous reconnecter." +accountDeleted: "Compte supprimé" +accountDeletedDescription: "Ce compte a été supprimé." menu: "Menu" divider: "Séparateur" addItem: "Ajouter un élément" +rearrange: "Trier par" relays: "Relais" addRelay: "Ajouter un relais" inboxUrl: "Inbox URL" @@ -677,6 +698,8 @@ contact: "Contact" useSystemFont: "Utiliser la police par défaut du système" clips: "Clips" experimentalFeatures: "Fonctionnalités expérimentales" +experimental: "Expérimental" +thisIsExperimentalFeature: "Ceci est une fonctionnalité expérimentale. Il y a une possibilité que les spécifications changent ou qu'elle ne fonctionne pas correctement." developer: "Développeur" makeExplorable: "Rendre le compte visible sur la page \"Découvrir\"." makeExplorableDescription: "Si vous désactivez cette option, votre compte n'apparaîtra pas sur la page \"Découvrir\"." @@ -761,6 +784,7 @@ noMaintainerInformationWarning: "Informations administrateur non configurées." noBotProtectionWarning: "La protection contre les bots n'est pas configurée." configure: "Configurer" postToGallery: "Publier dans la galerie" +postToHashtag: "Publier avec ce hashtag" gallery: "Galerie" recentPosts: "Les plus récentes" popularPosts: "Les plus consultées" @@ -799,6 +823,7 @@ lastCommunication: "Dernière communication" resolved: "Résolu" unresolved: "En attente" breakFollow: "Ne plus suivre" +breakFollowConfirm: "Êtes-vous sûr de vouloir vous désabonner ?" itsOn: "Activé" itsOff: "Désactivé" emailRequiredForSignup: "Une adresse e-mail est nécessaire pour créer un compte" diff --git a/locales/index.d.ts b/locales/index.d.ts index 082cde078..66b24890f 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -2135,6 +2135,7 @@ export interface Locale { "introduction": string; "introduction2": string; "widgetsIntroduction": string; + "useSimpleUiForNonRootPages": string; "_columns": { "main": string; "widgets": string; diff --git a/locales/it-IT.yml b/locales/it-IT.yml index cb4b44315..48d9621c3 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -156,6 +156,8 @@ addEmoji: "Aggiungi un emoji" settingGuide: "Configurazione suggerita" cacheRemoteFiles: "Memorizza i file remoti nella cache" cacheRemoteFilesDescription: "Disabilitando questa opzione, i file remoti verranno linkati direttamente senza essere memorizzati nella cache. Sarà possibile risparmiare spazio di archiviazione sul server, ma il traffico aumenterà in quanto non verranno generate anteprime." +cacheRemoteSensitiveFiles: "Memorizza nella cache i file sensibili remoti" +cacheRemoteSensitiveFilesDescription: "Disattivando questa opzione, i file sensibili verranno caricati direttamente dall'istanza remota senza essere salvati dal server." flagAsBot: "Io sono un robot" flagAsBotDescription: "Attiva questo campo se il profilo esegue principalmente operazioni automatiche. L'attivazione segnala agli altri sviluppatori come comportarsi per evitare catene d’interazione infinite con altri bot. I sistemi interni di Misskey si adegueranno al fine di trattare questo profilo come bot." flagAsCat: "Sono un gatto" @@ -1072,6 +1074,23 @@ branding: "Branding" enableServerMachineStats: "Pubblicare le informazioni sul server" enableIdenticonGeneration: "Generazione automatica delle Identicon" turnOffToImprovePerformance: "Disattiva, per migliorare le prestazioni" +createInviteCode: "Genera codice di invito" +createWithOptions: "Genera con opzioni" +createCount: "Conteggio inviti" +inviteCodeCreated: "Inviti generati" +inviteLimitExceeded: "Hai raggiunto il numero massimo di codici invito generabili." +createLimitRemaining: "Inviti generabili: {limit} rimanenti" +inviteLimitResetCycle: "Alle {time}, il limite verrà ripristinato a {limit}" +expirationDate: "Scadenza" +noExpirationDate: "Perpetuo" +inviteCodeUsedAt: "Codice di invito usato alle" +registeredUserUsingInviteCode: "Codice di invito usato da" +waitingForMailAuth: "In attesa della verifica email" +inviteCodeCreator: "Codice di invito creato da" +usedAt: "Usato alle" +unused: "Inutilizzato" +used: "Utilizzato" +expired: "Scaduto" _initialAccountSetting: accountCreated: "Il tuo profilo è stato creato!" letsStartAccountSetup: "Per iniziare, impostiamo il tuo profilo." @@ -1382,6 +1401,9 @@ _role: ltlAvailable: "Disponibilità della Timeline Locale" canPublicNote: "Può scrivere Note con Visibilità Pubblica" canInvite: "Genera codici di invito all'istanza" + inviteLimit: "Limite di codici invito" + inviteLimitCycle: "Intervallo di emissione del codice di invito" + inviteExpirationTime: "Scadenza del codice di invito" canManageCustomEmojis: "Gestire le emoji personalizzate" driveCapacity: "Capienza del Drive" alwaysMarkNsfw: "Imposta sempre come NSFW" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index ceff2a7cf..5f728e0e8 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -2050,6 +2050,7 @@ _deck: introduction: "カラムを組み合わせて自分だけのインターフェイスを作りましょう!" introduction2: "画面の右にある + を押して、いつでもカラムを追加できます。" widgetsIntroduction: "カラムのメニューから、「ウィジェットの編集」を選択してウィジェットを追加してください" + useSimpleUiForNonRootPages: "非ルートページは簡易UIで表示" _columns: main: "メイン" diff --git a/locales/th-TH.yml b/locales/th-TH.yml index cabdb155d..3b2eb92ef 100644 --- a/locales/th-TH.yml +++ b/locales/th-TH.yml @@ -1056,6 +1056,7 @@ displayOfNote: "การแสดงโน้ต" initialAccountSetting: "ตั้งค่าโปรไฟล์" youFollowing: "ติดตามแล้ว" preventAiLearning: "ปฏิเสธการใช้งาน ในการเรียนรู้ของเครื่อง (Generative AI)" +preventAiLearningDescription: "การส่งคำร้องขอโปรแกรมรวบรวมข้อมูลไม่ให้ใช้ข้อความที่โพสต์หรือรูปภาพ ฯลฯ ในชุดข้อมูลแมชชีนเลิร์นนิง (Predictive / Generative AI) สิ่งนี้นั้นทำได้โดยการเพิ่มแฟล็กการตอบสนอง \"noai\" HTML ให้กับเนื้อหาที่เกี่ยวข้อง แต่อย่างไรก็ตามแล้ว การป้องกันโดยสมบูรณ์นั้นไม่สามารถทำได้ผ่านแฟล็กนี้เนื่องจากอาจจะทำให้ถูกเพิกเฉยได้" options: "ตัวเลือกบทบาท" specifyUser: "ผู้ใช้เฉพาะ" failedToPreviewUrl: "ไม่สามารถดูตัวอย่างได้" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index ee34d9159..83f60ec75 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -1072,6 +1072,10 @@ branding: "品牌" enableServerMachineStats: "公开服务器硬件统计信息" enableIdenticonGeneration: "启用生成用户 Identicon" turnOffToImprovePerformance: "关闭该选项可以提高性能。" +inviteCodeCreated: "已创建邀请码" +unused: "未使用" +used: "已使用" +expired: "已过期" _initialAccountSetting: accountCreated: "账户创建完成了!" letsStartAccountSetup: "来进行帐户的初始设置吧。" diff --git a/package.json b/package.json index 7788ca655..d40b055aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "13.14.0-beta.4", + "version": "13.14.0-beta.5", "codename": "nasubi", "repository": { "type": "git", diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts index b04234fd1..c253f697f 100644 --- a/packages/backend/src/boot/master.ts +++ b/packages/backend/src/boot/master.ts @@ -78,7 +78,7 @@ export async function masterMain() { await spawnWorkers(config.clusterLimit); } - bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true); + bootLogger.succ(config.socket ? `Now listening on socket ${config.socket} on ${config.url}` : `Now listening on port ${config.port} on ${config.url}`, null, true); } function showEnvironment(): void { diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index 23ed6e59b..8c312256d 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -14,7 +14,9 @@ export type Source = { repository_url?: string; feedback_url?: string; url: string; - port: number; + port?: number; + socket?: string; + chmodSocket?: string; disableHsts?: boolean; db: { host: string; diff --git a/packages/backend/src/server/ServerService.ts b/packages/backend/src/server/ServerService.ts index 1bae71617..051920958 100644 --- a/packages/backend/src/server/ServerService.ts +++ b/packages/backend/src/server/ServerService.ts @@ -224,7 +224,18 @@ export class ServerService implements OnApplicationShutdown { } }); - fastify.listen({ port: this.config.port, host: '0.0.0.0' }); + if (this.config.socket) { + if (fs.existsSync(this.config.socket)) { + fs.unlinkSync(this.config.socket); + } + fastify.listen({ path: this.config.socket }, (err, address) => { + if (this.config.chmodSocket) { + fs.chmodSync(this.config.socket!, this.config.chmodSocket); + } + }); + } else { + fastify.listen({ port: this.config.port, host: '0.0.0.0' }); + } await fastify.ready(); } diff --git a/packages/frontend/src/boot/main-boot.ts b/packages/frontend/src/boot/main-boot.ts index d2db5e98b..0a351cd6e 100644 --- a/packages/frontend/src/boot/main-boot.ts +++ b/packages/frontend/src/boot/main-boot.ts @@ -13,10 +13,11 @@ import { miLocalStorage } from '@/local-storage'; import { claimAchievement, claimedAchievements } from '@/scripts/achievements'; import { mainRouter } from '@/router'; import { initializeSw } from '@/scripts/initialize-sw'; +import { deckStore } from '@/ui/deck/deck-store'; export async function mainBoot() { const { isClientUpdated } = await common(() => createApp( - new URLSearchParams(window.location.search).has('zen') || (ui === 'deck' && location.pathname !== '/') ? defineAsyncComponent(() => import('@/ui/zen.vue')) : + new URLSearchParams(window.location.search).has('zen') || (ui === 'deck' && deckStore.state.useSimpleUiForNonRootPages && location.pathname !== '/') ? defineAsyncComponent(() => import('@/ui/zen.vue')) : !$i ? defineAsyncComponent(() => import('@/ui/visitor.vue')) : ui === 'deck' ? defineAsyncComponent(() => import('@/ui/deck.vue')) : ui === 'classic' ? defineAsyncComponent(() => import('@/ui/classic.vue')) : diff --git a/packages/frontend/src/components/MkAutocomplete.vue b/packages/frontend/src/components/MkAutocomplete.vue index fd892d817..9211d92df 100644 --- a/packages/frontend/src/components/MkAutocomplete.vue +++ b/packages/frontend/src/components/MkAutocomplete.vue @@ -356,9 +356,7 @@ onMounted(() => { props.textarea.addEventListener('keydown', onKeydown); - for (const el of Array.from(document.querySelectorAll('body *'))) { - el.addEventListener('mousedown', onMousedown); - } + document.body.addEventListener('mousedown', onMousedown); nextTick(() => { exec(); @@ -374,9 +372,7 @@ onMounted(() => { onBeforeUnmount(() => { props.textarea.removeEventListener('keydown', onKeydown); - for (const el of Array.from(document.querySelectorAll('body *'))) { - el.removeEventListener('mousedown', onMousedown); - } + document.body.removeEventListener('mousedown', onMousedown); }); diff --git a/packages/frontend/src/components/MkContextMenu.vue b/packages/frontend/src/components/MkContextMenu.vue index fb11834f4..f39c94419 100644 --- a/packages/frontend/src/components/MkContextMenu.vue +++ b/packages/frontend/src/components/MkContextMenu.vue @@ -61,15 +61,11 @@ onMounted(() => { rootEl.style.top = `${top}px`; rootEl.style.left = `${left}px`; - for (const el of Array.from(document.querySelectorAll('body *'))) { - el.addEventListener('mousedown', onMousedown); - } + document.body.addEventListener('mousedown', onMousedown); }); onBeforeUnmount(() => { - for (const el of Array.from(document.querySelectorAll('body *'))) { - el.removeEventListener('mousedown', onMousedown); - } + document.body.removeEventListener('mousedown', onMousedown); }); function onMousedown(evt: Event) { diff --git a/packages/frontend/src/components/MkInviteCode.vue b/packages/frontend/src/components/MkInviteCode.vue index fdde79b17..97bf73235 100644 --- a/packages/frontend/src/components/MkInviteCode.vue +++ b/packages/frontend/src/components/MkInviteCode.vue @@ -45,8 +45,8 @@
- {{ i18n.ts.copy }} - {{ i18n.ts.delete }} + {{ i18n.ts.copy }} + {{ i18n.ts.delete }}
@@ -102,6 +102,7 @@ function copyInviteCode() { font-size: 0.85em; padding: 0 0 8px 0; user-select: none; + opacity: 0.7; } .user { diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue index 196a1b76e..39d9d020d 100644 --- a/packages/frontend/src/pages/about-misskey.vue +++ b/packages/frontend/src/pages/about-misskey.vue @@ -167,6 +167,18 @@ const patronsWithIcon = [{ }, { name: 'Nagi8410', icon: 'https://misskey-hub.net/patrons/31b102ab4fc540ed806b0461575d38be.jpg', +}, { + name: '山岡士郎', + icon: 'https://misskey-hub.net/patrons/84b9056341684266bb1eda3e680d094d.jpg', +}, { + name: 'よもやまたろう', + icon: 'https://misskey-hub.net/patrons/4273c9cce50d445f8f7d0f16113d6d7f.jpg', +}, { + name: '花咲ももか', + icon: 'https://misskey-hub.net/patrons/8c9b2b9128cb4fee99f04bb4f86f2efa.jpg', +}, { + name: 'カガミ', + icon: 'https://misskey-hub.net/patrons/226ea3a4617749548580ec2d9a263e24.jpg', }]; const patrons = [ @@ -263,6 +275,7 @@ const patrons = [ '渡志郎', 'ぷーざ', '越貝鯛丸', + 'Nick / pprmint.', ]; let thereIsTreasure = $ref($i && !claimedAchievements.includes('foundTreasure')); diff --git a/packages/frontend/src/pages/admin/roles.editor.vue b/packages/frontend/src/pages/admin/roles.editor.vue index 7fe5624fb..1ba502ff8 100644 --- a/packages/frontend/src/pages/admin/roles.editor.vue +++ b/packages/frontend/src/pages/admin/roles.editor.vue @@ -1,5 +1,9 @@