diff --git a/.github/workflows/docker-develop.yml b/.github/workflows/docker-develop.yml new file mode 100644 index 000000000..09331edd1 --- /dev/null +++ b/.github/workflows/docker-develop.yml @@ -0,0 +1,33 @@ +name: Publish Docker image (develop) + +on: + push: + branches: + - develop + workflow_dispatch: + +jobs: + push_to_registry: + name: Push Docker image to Docker Hub + runs-on: ubuntu-latest + + steps: + - name: Check out the repo + uses: actions/checkout@v2 + - name: Docker meta + id: meta + uses: docker/metadata-action@v3 + with: + images: misskey/misskey + - name: Log in to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build and Push to Docker Hub + uses: docker/build-push-action@v2 + with: + context: . + push: true + tags: misskey/misskey:develop + labels: develop diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 9a32dac94..a91572ad7 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -16,16 +16,16 @@ jobs: services: postgres: - image: postgres:10-alpine + image: postgres:12.2-alpine ports: - - 5432:5432 + - 54312:5432 env: POSTGRES_DB: test-misskey POSTGRES_HOST_AUTH_METHOD: trust redis: - image: redis:alpine + image: redis:4.0-alpine ports: - - 6379:6379 + - 56312:6379 steps: - uses: actions/checkout@v2 @@ -40,7 +40,7 @@ jobs: - name: Check yarn.lock run: git diff --exit-code yarn.lock - name: Copy Configure - run: cp .circleci/misskey/*.yml .config + run: cp test/test.yml .config - name: Build run: yarn build - name: Test diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 40b781b55..843b732cd 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,12 +1,10 @@ { "recommendations": [ - "ducksoupdev.vue2", "editorconfig.editorconfig", "eg2.vscode-npm-script", - "hollowtree.vue-snippets", "ms-vscode.typescript-javascript-grammar", "ms-vscode.vscode-typescript-tslint-plugin", - "octref.vetur", + "johnsoncodehk.volar", "sysoev.language-stylus" ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index f8331854c..873716a3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,49 @@ ## 12.x.x (unreleased) ### Improvements +- ページロードエラーページにリロードボタンを追加 ### Bugfixes --> +## 12.92.0 (2021/10/16) + +### Improvements +- アカウント登録にメールアドレスの設定を必須にするオプション +- クライアント: 全体的なUIのブラッシュアップ +- クライアント: MFM関数構文のサジェストを実装 +- クライアント: ノート本文を投稿フォーム内でプレビューできるように +- クライアント: 未読の通知のみ表示する機能 +- クライアント: 通知ページで通知の種類によるフィルタ +- クライアント: アニメーションを減らす設定の適用範囲を拡充 +- クライアント: 新しいダークテーマを追加 +- クライアント: テーマコンパイラに hue と saturate 関数を追加 +- ActivityPub: HTML -> MFMの変換を強化 +- API: グループから抜ける users/groups/leave エンドポイントを実装 +- API: i/notifications に unreadOnly オプションを追加 +- API: ap系のエンドポイントをログイン必須化+レートリミット追加 +- MFM: Add tag syntaxes of bold and strikethrough + +### Bugfixes +- Fix createDeleteAccountJob +- admin inbox queue does not show individual jobs +- クライアント: ヘッダーのタブが折り返される問題を修正 +- クライアント: ヘッダーにタブが表示されている状態でタイトルをクリックしたときにタブ選択が表示されるのを修正 +- クライアント: ユーザーページのタブが機能していない問題を修正 +- クライアント: ピン留めユーザーの設定項目がない問題を修正 +- クライアント: Deck UIにおいて、重ねたカラムの片方を畳んだ状態で右に出すと表示が壊れる問題を修正 +- API: 管理者およびモデレーターをブロックできてしまう問題を修正 +- MFM: Mentions in the link label are parsed as text +- MFM: Add a property to the URL node indicating whether it was enclosed in <> +- MFM: Disallows < and > in hashtags + +### Changes +- 保守性やユーザビリティの観点から、Misskeyのコマンドラインオプションが削除されました。 + - 必要であれば、代わりに環境変数で設定することができます +- MFM: パフォーマンス、保守性、構文誤認識抑制の観点から、旧関数構文のサポートが削除されました。 + - 旧構文(`[foo bar]`)を使用せず、現行の構文(`$[foo bar]`)を使用してください。 + ## 12.91.0 (2021/09/22) ### Improvements diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 72a7dc4b1..f5e0eece1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -57,6 +57,17 @@ If your language is not listed in Crowdin, please open an issue. - Test codes are located in [`/test`](/test). ### Run test +Create a config file. +``` +cp test/test.yml .config/ +``` +Prepare DB/Redis for testing. +``` +docker-compose -f test/docker-compose.yml up +``` +Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`. + +Run all test. ``` npm run test ``` @@ -177,6 +188,10 @@ npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前 ### JSONのimportに気を付けよう TypeScriptでjsonをimportすると、tscでコンパイルするときにそのjsonファイルも一緒にdistディレクトリに吐き出されてしまう。この挙動により、意図せずファイルの書き換えが発生することがあるので、jsonをimportするときは書き換えられても良いものかどうか確認すること。書き換えされて欲しくない場合は、importで読み込むのではなく、`fs.readFileSync`などの関数を使って読み込むようにすればよい。 +### コンポーネントのスタイル定義でmarginを持たせない +コンポーネント自身がmarginを設定するのは問題の元となることはよく知られている +marginはそのコンポーネントを使う側が設定する + ## その他 ### HTMLのクラス名で follow という単語は使わない 広告ブロッカーで誤ってブロックされる diff --git a/locales/ar-SA.yml b/locales/ar-SA.yml index 3de8ac764..3685eda5f 100644 --- a/locales/ar-SA.yml +++ b/locales/ar-SA.yml @@ -6,6 +6,7 @@ search: "البحث" notifications: "الإشعارات" username: "اسم المستخدم" password: "الكلمة السرية" +forgotPassword: "نسيتَ كلمة السر" fetchingAsApObject: "جارٍ جلبه مِن الفديفرس…" ok: " حسناً" gotIt: "فهِمت" diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 8f7a4c24e..cebb95109 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -81,6 +81,8 @@ somethingHappened: "Ein Fehler ist aufgetreten" retry: "Wiederholen" pageLoadError: "Laden der Seite fehlgeschlagen." pageLoadErrorDescription: "Dieser Fehler wird meist durch Netzwerkfehler oder den Browser-Cache verursacht. Bitte leere den Cache oder versuche es nach einiger Zeit erneut." +serverIsDead: "Dieser Server antwortet nicht. Bitte warte einen Moment und versuche es dann erneut." +youShouldUpgradeClient: "Bitte aktualisiere diese Seite, um eine neuere Version deines Clients zu verwenden." enterListName: "Name der Liste eingeben" privacy: "Privatsphäre" makeFollowManuallyApprove: "Follow-Anfragen benötigen Bestätigung" @@ -545,7 +547,7 @@ invisibleNote: "Private Notiz" enableInfiniteScroll: "Automatisch mehr Notizen laden" visibility: "Sichtbarkeit" poll: "Umfrage" -useCw: "Inhalt verbergen" +useCw: "Inhaltswarnung verwenden" enablePlayer: "Video-Player öffnen" disablePlayer: "Video-Player schließen" expandTweet: "Tweet ausklappen" @@ -764,6 +766,7 @@ middle: "Mittel" low: "Niedrig" emailNotConfiguredWarning: "Keine Email-Adresse hinterlegt" ratio: "Verhältnis" +previewNoteText: "Vorschau anzeigen" customCss: "Benutzerdefiniertes CSS" customCssWarn: "Verwende diese Einstellung nur, wenn du weißt, was sie tut. Ungültige Eingaben können dazu führen, dass der Client nicht mehr normal funktioniert." global: "Global" @@ -782,11 +785,22 @@ translatedFrom: "Aus {x} übersetzt" accountDeletionInProgress: "Löschung des Benutzerkontos momentan in Bearbeitung" usernameInfo: "Ein Name, durch den dein Benutzerkonto auf diesem Server identifiziert werden kann. Du kannst das Alphabet (a~z, A~Z), Ziffern (0~9) oder Unterstriche (_) verwenden. Benutzernamen können später nicht geändert werden." aiChanMode: "Ai Modus" -keepCw: "Inhaltswarnung beibehalten" +keepCw: "Inhaltswarnungen beibehalten" pubSub: "Pub/Sub Benutzerkonten" lastCommunication: "Letzte Kommunikation" resolved: "Gelöst" unresolved: "Ungelöst" +itsOn: "Eingeschaltet" +itsOff: "Ausgeschaltet" +emailRequiredForSignup: "Angaben einer Email-Adresse als benötigt markieren" +unread: "Ungelesen" +filter: "Filter" +controllPanel: "Systemsteuerung" +manageAccounts: "Benutzerkonten verwalten" +_signup: + almostThere: "Fast geschafft" + emailAddressInfo: "Bitte gib deine Email-Adresse ein." + emailSent: "An deine Email-Adresse ({email}) wurde soeben eine Bestätigungsmail geschickt. Bitte klicke auf den enthaltenen Link, um die Erstellung deines Benutzerkontos abzuschließen." _accountDelete: accountDelete: "Benutzerkonto löschen" mayTakeTime: "Da die Löschung eines Benutzerkontos ein aufwendiger Prozess ist, kann dessen Dauer davon abhängen, wie viel Inhalt in diesem erstellt wurde oder wie viele Dateien hochgeladen wurden." @@ -901,6 +915,8 @@ _mfm: fontDescription: "Setzt die Schriftart des Inhaltes fest." rainbow: "Regenbogen" rainbowDescription: "Lässt den Inhalt in Regenbogenfarben erscheinen." + sparkle: "Glitzer" + sparkleDescription: "Verleiht Inhalt einen glitzernden Partikeleffekt." _reversi: reversi: "Reversi" gameSettings: "Spieleinstellungen" @@ -1024,9 +1040,9 @@ _theme: infoFg: "Text von Informationen" infoWarnBg: "Hintergrund von Warnungen" infoWarnFg: "Text von Warnungen" - cwBg: "Hintergrund von verborgenen Inhalten" - cwFg: "Text von verborgenen Inhalten" - cwHoverBg: "Hintergrund von verborgenen Inhalten (Mouseover)" + cwBg: "Hintergrund des Inhaltswarnungsknopfs" + cwFg: "Text des Inhaltswarnungsknopfs" + cwHoverBg: "Hintergrund des Inhaltswarnungsknopfs (Mouseover)" toastBg: "Hintergrund von Benachrichtigungen" toastFg: "Text von Benachrichtigungen" buttonBg: "Hintergrund von Schaltflächen" @@ -1173,7 +1189,7 @@ _widgets: aiscript: "AiScript-Konsole" aichan: "Ai" _cw: - hide: "Verbergen" + hide: "Inhalt verbergen" show: "Inhalt anzeigen" chars: "{count} Zeichen" files: "{count} Datei(en)" diff --git a/locales/en-US.yml b/locales/en-US.yml index 4e843ce06..aeb0aa1ea 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1,7 +1,7 @@ --- _lang_: "English" headlineMisskey: "A network connected by notes" -introMisskey: "Welcome! Misskey is an open source, decentralized microblogging service.\nCreate \"notes\" to share what your thoughts with everyone around you. 📡\nWith \"reactions\", you can also quickly express your feelings about everyone's notes. 👍\nLet's explore a new world! 🚀" +introMisskey: "Welcome! Misskey is an open source, decentralized microblogging service.\nCreate \"notes\" to share your thoughts with everyone around you. 📡\nWith \"reactions\", you can also quickly express your feelings about everyone's notes. 👍\nLet's explore a new world! 🚀" monthAndDay: "{month}/{day}" search: "Search" notifications: "Notifications" @@ -81,6 +81,8 @@ somethingHappened: "An error occurred" retry: "Retry" pageLoadError: "Failed to load page." pageLoadErrorDescription: "This is normally caused by network errors or the browser's cache. Try clearing the cache and then try again after waiting a little while." +serverIsDead: "This server is not responding. Please wait for a while and try again." +youShouldUpgradeClient: "To view this page, please refresh to update your client." enterListName: "Enter a list name" privacy: "Privacy" makeFollowManuallyApprove: "Follow requests require approval" @@ -764,6 +766,7 @@ middle: "Medium" low: "Low" emailNotConfiguredWarning: "Email address not set." ratio: "Ratio" +previewNoteText: "Show preview" customCss: "Custom CSS" customCssWarn: "This setting should only be used if you know what it does. Entering improper values may cause the client to stop functioning normally." global: "Global" @@ -782,11 +785,22 @@ translatedFrom: "Translated from {x}" accountDeletionInProgress: "Account deletion is currently in progress" usernameInfo: "A name that identifies your account from others on this server. You can use the alphabet (a~z, A~Z), digits (0~9) or underscores (_). Usernames cannot be changed later." aiChanMode: "Ai Mode" -keepCw: "Keep Content Warning" +keepCw: "Keep Content Warnings" pubSub: "Pub/Sub Accounts" lastCommunication: "Last communication" resolved: "Resolved" unresolved: "Unresolved" +itsOn: "Enabled" +itsOff: "Disabled" +emailRequiredForSignup: "Require email address for sign-up" +unread: "Unread" +filter: "Filter" +controllPanel: "Control Panel" +manageAccounts: "Manage Accounts" +_signup: + almostThere: "Almost there" + emailAddressInfo: "Please enter your email address." + emailSent: "A confirmation email has been sent to your email address ({email}). Please click the included link to complete account creation." _accountDelete: accountDelete: "Delete Account" mayTakeTime: "As account deletion is a resource-heavy process, it may take some time to complete depending on how much content you have created and how many files you have uploaded." diff --git a/locales/eo-UY.yml b/locales/eo-UY.yml index fbc1aa31e..a76d5b5fd 100644 --- a/locales/eo-UY.yml +++ b/locales/eo-UY.yml @@ -1,8 +1,8 @@ --- _lang_: "Esperanto" -headlineMisskey: "Jen la reto konektita de notoj" -introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza mikrobloga servo.\nKreu \"noto\"n por diskonigu tion kio nun okazas, aŭ por parolu pri vi. 📡\nUzu la funkcion \"reago\" por esprimu rapide vian senton pri ies noto. 👍\nBonvole esploru novan mondon. 🚀" -monthAndDay: "{day}a/{month}" +headlineMisskey: "Jen la reto konektata de notoj" +introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza etbloga servo.\nKreu \"noto\"n por paroli vian penson al iuj ĉirkaŭ vi. 📡\nLa funkcion \"reago\" ebligas esprimi rapide vian senton pri ies noto en Fediverso. 👍\nBonvole esploru novan mondon. 🚀" +monthAndDay: "La {day}-a de la {month}-a monato" search: "Serĉi" notifications: "Sciigoj" username: "Uzantnomo" @@ -33,18 +33,18 @@ save: "Konservi" users: "Uzantoj" addUser: "Aldoni uzanton" favorite: "Preferi" -favorites: "Preferataĵoj" +favorites: "Preferaĵoj" unfavorite: "Malpreferi" -favorited: "Aldonita al preferataĵoj" -alreadyFavorited: "Ankoraŭ aldonita al via listo de preferaĵoj." -cantFavorite: "Ne aldonita al preferataĵoj" -pin: "Alpingli al la profilo" +favorited: "Aldonita al via listo de preferaĵoj." +alreadyFavorited: "Ĝi jam estis aldonita al via listo de preferaĵoj." +cantFavorite: "Ne aldonita al via listo de preferaĵoj." +pin: "Alpingli" unpin: "Depingli" copyContent: "Kopii enhavon" copyLink: "Kopii ligilon" delete: "Forviŝi" -deleteAndEdit: "Forviŝi kaj redakti" -deleteAndEditConfirm: "Ĉu vi certas, ke vi volas forigi kaj redakti la noton? Kun tio foriĝos reagoj, plusendaĵoj, kaj respondoj ĉiuj de ĝi." +deleteAndEdit: "Redakti foriginte" +deleteAndEditConfirm: "Ĉu vi certas, ke vi volas forigi kaj redakti la noton? Tio forviŝos reagojn, notojn plusendintajn, kaj respondojn ĉiujn de ĝi." addToList: "Aldoni al listo" sendMessage: "Sendi mesaĝon" copyUsername: "Kopii uzantnomon" @@ -57,17 +57,17 @@ receiveFollowRequest: "Peto de sekvado estas ricevita" followRequestAccepted: "La peto de sekvado akceptita" mention: "Mencioj" mentions: "Al vi" -directNotes: "Notoj rektaj" +directNotes: "Rekte senditaj" importAndExport: "Importi/eksporti" import: "Importi" export: "Eksporti" files: "Dosieroj" download: "Elŝuti" driveFileDeleteConfirm: "Ĉu vi certas, ke vi volas forviŝi la dosieron \"{name}\"? Pro tio forviŝiĝos ankaŭ la notoj kiuj enhavas ĝin." -unfollowConfirm: "Ĉu vi certas, ke vi volas ne plu sekvi {name}'(o)n?" +unfollowConfirm: "Ĉu vi certas, ke vi volas ĉesi sekvi {name}'(o)n?" lists: "Listoj" noLists: "Neniu listo" -note: "Notoj" +note: "Sendi" notes: "Notoj" following: "Sekvatoj" followers: "Sekvantoj" @@ -92,13 +92,13 @@ cantRenote: "Oni ne povas plusendi la noton." cantReRenote: "Plusendado ne estas plusendebla." quote: "Citi" pinnedNote: "Alpinglita noto" -pinned: "Alpingli al la profilo" +pinned: "Alpingli" you: "Vi" clickToShow: "Klaku por malkaŝu" sensitive: "Enhavo ne estas deca por laborejo (NSFW)" add: "Aldoni" reaction: "Reagoj" -rememberNoteVisibility: "Rememoru la videblecon de la noto laste sendita" +rememberNoteVisibility: "Rememoru videblecon de la noto laste sendita " attachCancel: "Deigi aldonaĵon" markAsSensitive: "Troviĝi NSFW" unmarkAsSensitive: "Ne troviĝi NSFW" @@ -137,7 +137,7 @@ removeWallpaper: "Forviŝi ekranfonon. " searchWith: "Serĉi: {q}" youHaveNoLists: "Vi ne havas listojn." followConfirm: "Ĉu vi certas ke vi volas sekvi {name}'(o)n?" -host: "Gastiganto" +host: "Gastigo" selectUser: "Elekti uzanton" recipient: "Ricevonto" annotation: "Komentarioj" @@ -254,7 +254,7 @@ unwatch: "Malobservi" accept: "Permesi" normal: "Normala" instanceName: "Nomo de la nodo" -instanceDescription: "Mempriskribo de la nodo " +instanceDescription: "Priskribo de la nodo " maintainerName: "Nomo de la administranto" maintainerEmail: "Retpoŝto de la administranto" tosUrl: "URL de kondiĉoj de uzado" @@ -323,6 +323,7 @@ newPasswordIs: "La nova pasvorto estas {password}." share: "Diskonigi" notFound: "Ne trovita" cacheClear: "Malplenigi staplon" +markAsReadAllNotifications: "Marki ĉiujn sciigojn kiel legito" help: "Manlibro de uzado" inputMessageHere: "Entajpu masaĝo tie ĉi" close: "Fermi" @@ -344,10 +345,10 @@ quoteAttached: "Kun citaĵo" quoteQuestion: "Ĉu vi aldonas citaĵon?" noMessagesYet: "Ankoraŭ neniu mesaĝo" newMessageExists: "Vi ricevis novan mesaĝon." -onlyOneFileCanBeAttached: "Vi povas aldoni nur unu dosieron po unu mesaĝo." +onlyOneFileCanBeAttached: "Oni povas aldoni nur unu dosieron po mesaĝo." signinRequired: "Bonvolu ensaluti" invitations: "Inviti" -invitationCode: "Kodo de invito" +invitationCode: "Invita kodo" unavailable: "Ne disponebla" passwordMatched: "Konforma" passwordNotMatched: "Nekonforma" @@ -417,7 +418,7 @@ enablePlayer: "Vidi videon" disablePlayer: "Fermi videon" expandTweet: "Disvolvi pepon" themeEditor: "Redaktilo de koloraroj" -description: "Priskribe" +description: "Priskribo" describeFile: "Priskribi la bildon" enterFileDescription: "Priskribu" author: "Aŭtoro" @@ -433,7 +434,7 @@ emailServer: "Retpoŝta servilo" email: "Retpoŝto" emailAddress: "Retpoŝta adreso" smtpConfig: "Agordoj de SMTP servilo" -smtpHost: "Gastiganto" +smtpHost: "Gastigo" smtpPort: "Pordo" smtpUser: "Uzantnomo" smtpPass: "Pasvorto" @@ -481,7 +482,7 @@ notSet: "Ne elektita" emailVerified: "Via retpoŝto estis kontrolita." noteFavoritesCount: "La nombro de notoj preferataj" pageLikesCount: "La nombro de paĝoj kiun la uzanto preferas" -pageLikedCount: "La nombro de uzantoj kiuj preferas la paĝon" +pageLikedCount: "La nombro de uzantoj, kiuj preferas paĝon de ĉi tiu uzanto" contact: "Kontakto" makeExplorable: "Videbligi konton sur la paĝo \"Esplori\"" duplicate: "Duobligi" @@ -509,7 +510,7 @@ inUse: "Uzata" editCode: "Redakti kodon" emailNotification: "Sciigoj per retpoŝto" inChannelSearch: "Serĉi en kanalo" -useReactionPickerForContextMenu: "Oni malfermas reago-elektilon per dekstro-kliki" +useReactionPickerForContextMenu: "Malfermi reago-elektilon per dekstro-klaki" typingUsers: "{users} nun entajpas…" clear: "Vakigi" goBack: "Reiri antaŭ" @@ -540,6 +541,7 @@ troubleshooting: "Problemsolvi" learnMore: "Lernu pli" translate: "Traduki" translatedFrom: "Tradukita el {x}" +controllPanel: "Ŝaltpodio" _docs: continueReading: "Legi plu" features: "Funkcioj" @@ -614,8 +616,8 @@ _wordMute: mutedNotes: "Silentigitaj notoj" _theme: manage: "Administri kolorarojn" - code: "Kodo de koloraro" - description: "Priskribe" + code: "Kolorara kodo" + description: "Priskribo" color: "Koloro" darken: "Malbrileco" lighten: "Brileco" @@ -667,8 +669,8 @@ _permissions: "write:blocks": "Redakti vian liston de blokitoj" "read:drive": "Legi vian diskon" "write:drive": "Ĉia operacio por skribi, forviŝi, aŭ alimaniere ŝanĝi la informon de dosiero en via disko de Misskey" - "read:favorites": "Vidi vian liston de preferataĵoj" - "write:favorites": "Redakti vian liston de preferataĵoj." + "read:favorites": "Vidi vian liston de preferaĵoj" + "write:favorites": "Redakti vian liston de preferaĵoj" "read:following": "Vidi la infomaciojn pri tio, kion vi sekvas" "write:following": "Sekvi aŭ malsekvi alian uzanton" "read:messaging": "Vidi vian retbabiladon" @@ -715,23 +717,24 @@ _poll: vote: "Baloti" closed: "Oni jam balotis ĝin" _visibility: + public: "Publika" publicDescription: "Via noto estos videbla de ĉiuj uzantoj" home: "Hejma" homeDescription: "Dissendi nur sur hejma templinio" - followers: "Sekvantoj" - followersDescription: "Nur al sekvantoj al mi" - specified: "Rekta" - specifiedDescription: "Publikigi nur al specifaj uzantoj" + followers: "Nur al sekvantoj" + followersDescription: "Publiki nur al viaj sekvantoj" + specified: "Rekte" + specifiedDescription: "Montri nur al specifaj uzantoj" localOnly: "Nur loka" localOnlyDescription: "Ne montri al transaj uzantoj" _postForm: - replyPlaceholder: "Respondi tiun noton…" - quotePlaceholder: "Citi tiun noton…" + replyPlaceholder: "Respondi la noton…" + quotePlaceholder: "Citi la noton…" channelPlaceholder: "Mencii en kanalo…" _profile: name: "Nomo" username: "Uzantnomo" - description: "Pri mi" + description: "Sinprezento" metadata: "Kromaj informoj" metadataEdit: "Redakti kromaj informoj" changeAvatar: "Ŝanĝi profilbildon" @@ -746,7 +749,7 @@ _charts: federationInstancesTotal: "La totala nombro de nodoj kunfederantaj" usersTotal: "La totala nombro de la uzantoj" activeUsers: "La nombro de la uzantoj aktivaj" - notesTotal: "La totala nombro de la notoj" + notesTotal: "La totala nombro de notoj" filesTotal: "La totala nombro de la dosieroj" _timelines: home: "Hejma" @@ -859,16 +862,21 @@ _pages: argVariables: "Eniga junto" _notification: fileUploaded: "La dosiero sukcese alŝutiĝis." + youGotMention: "{name} mencis" + youGotReply: "{name} respondis" + youGotQuote: "{name} citis" youRenoted: "{name} plusendis" youGotPoll: "{name} balotis" youGotMessagingMessageFromUser: "{name} sentis mesaĝon al vi." youGotMessagingMessageFromGroup: "Retbabilan mesaĝon oni sendis al la grupo {name}" youWereFollowed: "eksekvis vin" youReceivedFollowRequest: "Vi ricevis peton de sekvado" - yourFollowRequestAccepted: "Via peto por sekvado estis akceptita." + yourFollowRequestAccepted: "Via peto de sekvado estis akceptita." _types: - follow: "Sekvatoj" + all: "Ĉio" + follow: "Nova sekvatoj" mention: "Mencioj" + reply: "Respondoj" renote: "Notoj plusenditaj" quote: "Citi" reaction: "Reagoj" @@ -882,4 +890,4 @@ _deck: antenna: "Antenoj" list: "Listoj" mentions: "Al vi" - direct: "Notoj rektaj" + direct: "Rekte" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index 0defcabd0..c55a00b82 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -7,6 +7,7 @@ search: "Buscar" notifications: "Notificaciones" username: "Nombre de usuario" password: "Contraseña" +forgotPassword: "Olvidé mi Contraseña" fetchingAsApObject: "Buscando en el fediverso" ok: "OK" gotIt: "Entendido" @@ -279,6 +280,7 @@ emptyDrive: "El drive está vacío" emptyFolder: "La carpeta está vacía" unableToDelete: "No se puede borrar" inputNewFileName: "Ingrese un nuevo nombre de archivo" +inputNewDescription: "Ingrese nueva descripción" inputNewFolderName: "Ingrese un nuevo nombre de la carpeta" circularReferenceFolder: "La carpeta de destino es una sub-carpeta de la carpeta que quieres mover." hasChildFilesOrFolders: "No se puede borrar esta carpeta. No está vacía." @@ -310,6 +312,8 @@ monthX: "Mes {month}" yearX: "Año {year}" pages: "Páginas" integration: "Integración" +connectService: "Conectar" +disconnectService: "Desconectar" enableLocalTimeline: "Habilitar linea de tiempo local" enableGlobalTimeline: "Habilitar linea de tiempo global" disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia el administrador y los moderadores pueden seguir usándolos" @@ -323,6 +327,7 @@ driveCapacityPerRemoteAccount: "Capacidad del drive por usuario remoto" inMb: "En megabytes" iconUrl: "URL de la imagen del avatar" bannerUrl: "URL de la imagen del banner" +backgroundImageUrl: "URL de la imagen de fondo" basicInfo: "Información básica" pinnedUsers: "Usuarios fijados" pinnedUsersDescription: "Describir los usuarios que quiere fijar en la página \"Descubrir\" separados por una linea nueva" @@ -524,6 +529,9 @@ removeAllFollowing: "Retener todos los siguientes" removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}. Ejecutar en caso de que esta instancia haya dejado de existir" userSuspended: "Este usuario ha sido suspendido." userSilenced: "Este usuario ha sido silenciado." +yourAccountSuspendedTitle: "Esta cuenta ha sido suspendida" +yourAccountSuspendedDescription: "Esta cuenta ha sido suspendida debido a violaciones de los términos de servicio del servidor y otras razones. Para más información, póngase en contacto con el administrador. Por favor, no cree una nueva cuenta." +menu: "Menú" divider: "Divisor" addItem: "Agregar elemento" rooms: "Cuartos" @@ -543,6 +551,8 @@ disablePlayer: "Cerrar reproductor" expandTweet: "Expandir tweet" themeEditor: "Editor de temas" description: "Descripción" +describeFile: "Añade una descripción" +enterFileDescription: "Introducir un título" author: "Autor" leaveConfirm: "Hay modificaciones sin guardar. ¿Desea descartarlas?" manage: "Administrar" @@ -645,29 +655,90 @@ driveFilesCount: "Cantidad de archivos en el drive" driveUsage: "Uso del drive" noCrawle: "Rechazar indexación del crawler" noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas, páginas, etc." +lockedAccountInfo: "A menos que configures la visibilidad de tus notas como \"Sólo seguidores\", tus notas serán visibles para cualquiera, incluso si requieres que los seguidores sean aprobados manualmente." alwaysMarkSensitive: "Marcar los medios de comunicación como contenido sensible por defecto" +loadRawImages: "Cargar las imágenes originales en lugar de mostrar las miniaturas" +disableShowingAnimatedImages: "No reproducir imágenes animadas" verificationEmailSent: "Se le ha enviado un correo electrónico de confirmación. Por favor, acceda al enlace proporcionado en el correo electrónico para completar la configuración." notSet: "Sin especificar" emailVerified: "Su dirección de correo electrónico ha sido verificada." noteFavoritesCount: "Número de notas favoritas" pageLikesCount: "Número de favoritos en la página" pageLikedCount: "Número de favoritos de su página" +reversiCount: "Numero de partidas Reversi" contact: "Contacto" +useSystemFont: "Utilizar la tipografía por defecto del sistema" clips: "Clip" +experimentalFeatures: "Características experimentales" +developer: "Desarrolladores" +makeExplorable: "Hacer visible la cuenta en \"Explorar\"" +makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la sección \"Explorar\"." +showGapBetweenNotesInTimeline: "Mostrar un intervalo entre notas en la línea de tiempo" +duplicate: "Duplicar" +left: "Izquierda" +center: "Centrar" +wide: "Ancho" +narrow: "Estrecho" +reloadToApplySetting: "Esta configuración sólo se aplicará después de recargar la página. ¿Recargar ahora?" +showTitlebar: "Mostrar la barra de título" clearCache: "Limpiar caché" +onlineUsersCount: "{n} usuarios en línea" +nUsers: "{n} Usuarios" +nNotes: "{n} Notas" +sendErrorReports: "Envíar informe de errores" +sendErrorReportsDescription: "Si habilita esta opción, ayudará a mejorar la calidad de Misskey compartiendo información detallada sobre los errores cuando se produzca un problema.\nEsto incluye información como la versión de su sistema operativo, el tipo de navegador que utiliza, su historial de actividad, etc." +myTheme: "Mi Tema" backgroundColor: "Fondo" accentColor: "Acento" textColor: "Texto" +saveAs: "Guardar como…" +advanced: "Avanzado" value: "Valores" +createdAt: "Fecha de creación" +updatedAt: "Actualizado" +saveConfirm: "¿Guardar cambios?" +deleteConfirm: "¿Desea eliminarlo?" +invalidValue: "Este no es un valor válido." +registry: "Registro" +closeAccount: "Cerrar cuenta" +currentVersion: "Versión actual" +latestVersion: "Última versión" +youAreRunningUpToDateClient: "Está utilizando la versión más reciente de su cliente." +newVersionOfClientAvailable: "Hay una versión más nueva de su cliente disponible." +usageAmount: "Uso" +capacity: "Capacidad" +inUse: "Usado" +editCode: "Editar código" goBack: "Deseleccionar" info: "Información" user: "Usuarios" administration: "Administrar" expiration: "Termina el" middle: "Mediano" +customCssWarn: "Este ajuste sólo debe utilizarse si se sabe lo que hace. Introducir valores inadecuados puede hacer que el cliente deje de funcionar con normalidad." global: "Global" +squareAvatars: "Mostrar iconos cuadrados" sent: "Enviar" +received: "Recibido" +searchResult: "Resultados de búsqueda" hashtags: "Hashtag" +troubleshooting: "Solución de problemas" +useBlurEffect: "Utilizar efecto de desenfoque en la interfaz de usuario" +learnMore: "Ver más" +misskeyUpdated: "¡Misskey ha sido actualizado!" +whatIsNew: "Mostrar cambios" +translate: "Traducir" +translatedFrom: "Traducido de {x}" +accountDeletionInProgress: "La eliminación de la cuenta está en curso" +usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres de usuario no se pueden cambiar posteriormente." +aiChanMode: "Modo Ai" +keepCw: "Mantener la advertencia de contenido" +pubSub: "Cuentas Pub/Sub" +lastCommunication: "Última comunicación" +resolved: "Resuelto" +unresolved: "Sin resolver" +_accountDelete: + accountDelete: "Eliminar Cuenta" _docs: admin: "Administrar" _ad: diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index c4fee0534..99d2b7bc0 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -81,6 +81,8 @@ somethingHappened: "Une erreur est survenue" retry: "Réessayer" pageLoadError: "Le chargement de la page a échoué" pageLoadErrorDescription: "Cela est généralement causé par le cache du navigateur ou par un problème réseau. Veuillez vider votre cache ou attendre un peu et réessayer." +serverIsDead: "Le serveur ne répond pas. Patientez quelques instants puis essayez à nouveau." +youShouldUpgradeClient: "Si la page ne s'affiche pas correctement, rechargez-la pour mettre votre client à jour." enterListName: "Nom de la liste" privacy: "Confidentialité" makeFollowManuallyApprove: "Accepter manuellement les demandes d’abonnement" @@ -136,7 +138,7 @@ 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." flagAsBot: "Ce compte est un robot" -flagAsBotDescription: "Si ce compte est géré de manière automatisée , définissez 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." +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" flagAsCatDescription: "Activer l'option \" Je suis un chat \" pour ce compte." autoAcceptFollowed: "Accepter automatiquement les demandes d’abonnement venant d’utilisateur·rice·s que vous suivez" @@ -377,7 +379,7 @@ aboutMisskey: "À propos de Misskey" administrator: "Administrateur" token: "Jeton" twoStepAuthentication: "Authentification à deux facteurs" -moderator: "Modérateurs" +moderator: "Modérateur·rice·s" nUsersMentioned: "{n} utilisateur·rice·s mentionné·e·s" securityKey: "Clé de sécurité" securityKeyName: "Nom de la clé" @@ -495,7 +497,7 @@ objectStorageSetPublicRead: "Régler sur « public » lors de l'envoi" serverLogs: "Journal du serveur" deleteAll: "Supprimer tout" showFixedPostForm: "Afficher le formulaire de publication en haut du fil d'actualité" -newNoteRecived: "Vous avez reçu une nouvelle note" +newNoteRecived: "Voir les nouvelles notes" sounds: "Sons" listen: "Écouter" none: "Rien" @@ -530,6 +532,7 @@ removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Ve 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." menu: "Menu" divider: "Séparateur" addItem: "Ajouter un élément" @@ -786,6 +789,15 @@ pubSub: "Comptes Pub/Sub" lastCommunication: "Dernière communication" resolved: "Résolu" unresolved: "En attente" +emailRequiredForSignup: "Une adresse e-mail est nécessaire pour créer un compte" +unread: "Non lu" +filter: "Filtre" +controllPanel: "Panneau de contrôle" +manageAccounts: "Gérer les comptes" +_signup: + almostThere: "Bientôt fini" + emailAddressInfo: "Insérez votre adresse e-mail." + emailSent: "Un courriel de confirmation vient d'être envoyé à l'adresse que vous avez renseignée ({email}). Cliquez sur le lien contenu dans le message pour terminer la création de votre compte." _accountDelete: accountDelete: "Supprimer le compte" mayTakeTime: "La suppression de compte nécessitant beaucoup de ressources, l'exécution du processus peut prendre du temps, en fonction de la quantité de contenus que vous avez créés et du nombre de fichiers que vous avez téléversés." @@ -900,6 +912,8 @@ _mfm: fontDescription: "Il est possible de choisir la police." rainbow: "Arc-en-ciel" rainbowDescription: "Permet d'afficher le contenu en couleurs arc-en-ciel." + sparkle: "Paillettes" + sparkleDescription: "Ajoute un effet scintillant au contenu." _reversi: reversi: "Reversi" gameSettings: "Réglages de la partie" @@ -1243,7 +1257,7 @@ _charts: federationInstancesTotal: "Nombre total d'instances fédérées" usersIncDec: "Variation du nombre d'utilisateur·rice·s" usersTotal: "Nombre des utilisateur·rice·s au total" - activeUsers: "Utilisateur·rice·s actif·ve·s" + activeUsers: "Nombre d'utilisateurices actif·ve·s" notesIncDec: "Variation du nombre des notes" localNotesIncDec: "Variation du nombre de notes locales" remoteNotesIncDec: "Variation du nombre de notes distantes" diff --git a/locales/id-ID.yml b/locales/id-ID.yml index 06191089c..44c7f49f1 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -780,6 +780,7 @@ translatedFrom: "Terjemahkan dari {x}" accountDeletionInProgress: "Penghapusan akun sedang dalam proses" usernameInfo: "Nama yang mengidentifikasikan akun kamu dari yang lain pada server ini. Kamu dapat menggunakan alfabet (a~z, A~Z), digit (0~9) atau garis bawah (_). Username tidak dapat diubah setelahnya." keepCw: "Biarkan Peringatan Konten" +controllPanel: "Panel kontrol" _accountDelete: accountDelete: "Hapus akun" mayTakeTime: "Karena penghapusan akun merupakan proses yang berat dan intensif, kemungkinan dapat membutuhkan waktu untuk menyelesaikan tergantung daripada berapa banyak konten yang kamu buat dan berapa banyak berkas yang telah kamu unggah." diff --git a/locales/it-IT.yml b/locales/it-IT.yml index f291eaa17..fc9060852 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -482,7 +482,7 @@ objectStorageSetPublicRead: "Imposta \"visibilità pubblica\" al momento di cari serverLogs: "Log del server" deleteAll: "Cancella cronologia" showFixedPostForm: "Visualizzare la finestra di pubblicazione in cima alla timeline" -newNoteRecived: "Nuova nota ricevuta" +newNoteRecived: "Vedi le nuove note" sounds: "Impostazioni suoni" listen: "Ascolta" none: "Niente" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index f050ad4df..358da897d 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -81,6 +81,8 @@ somethingHappened: "問題が発生しました" retry: "再試行" pageLoadError: "ページの読み込みに失敗しました。" pageLoadErrorDescription: "これは通常、ネットワークまたはブラウザキャッシュが原因です。キャッシュをクリアするか、しばらく待ってから再度試してください。" +serverIsDead: "サーバーの応答がありません。しばらく待ってから再度試してください。" +youShouldUpgradeClient: "このページを表示するためには、リロードして新しいバージョンのクライアントをご利用ください。" enterListName: "リスト名を入力" privacy: "プライバシー" makeFollowManuallyApprove: "フォローを承認制にする" @@ -764,6 +766,7 @@ middle: "中" low: "低" emailNotConfiguredWarning: "メールアドレスの設定がされていません。" ratio: "比率" +previewNoteText: "本文をプレビュー" customCss: "カスタムCSS" customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあります。" global: "グローバル" @@ -787,6 +790,18 @@ pubSub: "Pub/Subのアカウント" lastCommunication: "直近の通信" resolved: "解決済み" unresolved: "未解決" +itsOn: "オンになっています" +itsOff: "オフになっています" +emailRequiredForSignup: "アカウント登録にメールアドレスを必須にする" +unread: "未読" +filter: "フィルタ" +controllPanel: "コントロールパネル" +manageAccounts: "アカウントを管理" + +_signup: + almostThere: "ほとんど完了です" + emailAddressInfo: "あなたが使っているメールアドレスを入力してください。" + emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。" _accountDelete: accountDelete: "アカウントの削除" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 82c7c1a07..db0cf7f20 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -787,6 +787,7 @@ pubSub: "Pub/Sub 계정" lastCommunication: "마지막 통신" resolved: "해결됨" unresolved: "해결되지 않음" +controllPanel: "제어판" _accountDelete: accountDelete: "계정 삭제" mayTakeTime: "계정 삭제는 서버에 부하를 가하기 때문에, 작성한 콘텐츠나 업로드한 파일의 수가 많으면 완료까지 시간이 걸릴 수 있습니다." @@ -901,6 +902,8 @@ _mfm: fontDescription: "내용의 글꼴을 지정할 수 있습니다." rainbow: "무지개" rainbowDescription: "내용을 무지개로 표시합니다." + sparkle: "반짝반짝" + sparkleDescription: "반짝이는 파티클 효과를 추가합니다." _reversi: reversi: "리버시" gameSettings: "대국 설정" diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index b886d4c60..c8aa28df5 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -81,6 +81,8 @@ somethingHappened: "Что-то пошло не так" retry: "Повторить попытку" pageLoadError: "Не удалось загрузить страницу" pageLoadErrorDescription: "Обычно это случается из-за сбоев в сети или кэша браузера. Попробуйте очистить кэш, или подождать пару минут, а потом попытаться загрузить страницу снова." +serverIsDead: "Ответа от сервера нет. Пожалуйста, подождите немного и повторите попытку." +youShouldUpgradeClient: "Чтобы просмотреть эту страницу, пожалуйста, обновите ее." enterListName: "Название списка" privacy: "Конфиденциальность" makeFollowManuallyApprove: "Принимать подписчиков вручную" @@ -529,6 +531,8 @@ removeAllFollowing: "Удалить всех подписчиков" removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует." userSuspended: "Эта учётная запись заморожена" userSilenced: "Этот пользователь был заглушен" +yourAccountSuspendedTitle: "Эта учетная запись заблокирована" +yourAccountSuspendedDescription: "Эта учетная запись была заблокирована из-за нарушения условий предоставления услуг сервера. Свяжитесь с администратором, если вы хотите узнать более подробную причину. Пожалуйста, не создавайте новую учетную запись." menu: "Меню" divider: "Линия-разделитель" addItem: "Добавить элемент" @@ -775,6 +779,13 @@ useBlurEffect: "Размытие в интерфейсе" learnMore: "Подробнее" misskeyUpdated: "Misskey обновился!" whatIsNew: "Что новенького?" +translate: "Перевод" +accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи" +usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере. Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания (_). Имена пользователей не могут быть изменены позже." +aiChanMode: "ИИ режим" +keepCw: "Сохраняйте Предупреждения о содержимом" +controllPanel: "Панель управления" +manageAccounts: "Управление аккаунтом" _docs: continueReading: "Читать подробнее" features: "Возможности" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 00e5ffce4..a8e653f79 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -81,6 +81,8 @@ somethingHappened: "出现了一些问题!" retry: "重试" pageLoadError: "页面加载失败。" pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。" +serverIsDead: "服务器没有响应。 请稍等片刻,然后重试。" +youShouldUpgradeClient: "请重新加载并使用新版本的客户端查看此页面。" enterListName: "输入列表名称" privacy: "隐私" makeFollowManuallyApprove: "关注者的关注请求需要批准" @@ -764,6 +766,7 @@ middle: "中" low: "低" emailNotConfiguredWarning: "电子邮件地址未设置。" ratio: "比率" +previewNoteText: "预览文本" customCss: "自定义 CSS" customCssWarn: "这些设置必须有相关的基础知识,不当的配置可能导致客户端无法正常使用!" global: "全局" @@ -787,6 +790,17 @@ pubSub: "Pub/Sub账户" lastCommunication: "最近通信" resolved: "已解决" unresolved: "未解决" +itsOn: "已开启" +itsOff: "已关闭" +emailRequiredForSignup: "注册账户需要电子邮件地址" +unread: "未读" +filter: "筛选" +controllPanel: "控制面板" +manageAccounts: "管理账户" +_signup: + almostThere: "即将完成" + emailAddressInfo: "请输入您所使用的电子邮件地址" + emailSent: "已将确认邮件发送至您输入的电子邮件地址 ({email})。请访问电子邮件中的链接以完成帐户创建。" _accountDelete: accountDelete: "删除帐户" mayTakeTime: "删除账号是一个性能损耗较大的处理,如果账号持有的内容数量和上传的文件数量较多的话,完成需要花费一段时间。" @@ -901,6 +915,8 @@ _mfm: fontDescription: "可以设置内容所使用的字体。" rainbow: "彩虹" rainbowDescription: "用彩虹色来显示内容。" + sparkle: "闪光" + sparkleDescription: "添加发光粒子效果。" _reversi: reversi: "黑白棋" gameSettings: "对局设置" diff --git a/migration/1633068642000-email-required-for-signup.ts b/migration/1633068642000-email-required-for-signup.ts new file mode 100644 index 000000000..ab7be7a0d --- /dev/null +++ b/migration/1633068642000-email-required-for-signup.ts @@ -0,0 +1,14 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class emailRequiredForSignup1633068642000 implements MigrationInterface { + name = 'emailRequiredForSignup1633068642000' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "meta" ADD "emailRequiredForSignup" boolean NOT NULL DEFAULT false`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "emailRequiredForSignup"`); + } + +} diff --git a/migration/1633071909016-user-pending.ts b/migration/1633071909016-user-pending.ts new file mode 100644 index 000000000..28b556888 --- /dev/null +++ b/migration/1633071909016-user-pending.ts @@ -0,0 +1,16 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class userPending1633071909016 implements MigrationInterface { + name = 'userPending1633071909016' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "user_pending" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "code" character varying(128) NOT NULL, "username" character varying(128) NOT NULL, "email" character varying(128) NOT NULL, "password" character varying(128) NOT NULL, CONSTRAINT "PK_d4c84e013c98ec02d19b8fbbafa" PRIMARY KEY ("id"))`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_4e5c4c99175638ec0761714ab0" ON "user_pending" ("code") `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "IDX_4e5c4c99175638ec0761714ab0"`); + await queryRunner.query(`DROP TABLE "user_pending"`); + } + +} diff --git a/package.json b/package.json index 2d0c1cc5f..c1fcff712 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo ", - "version": "12.91.0", + "version": "12.92.0", "codename": "indigo", "repository": { "type": "git", @@ -47,7 +47,7 @@ "@sinonjs/fake-timers": "7.1.2", "@syuilo/aiscript": "0.11.1", "@types/bcryptjs": "2.4.2", - "@types/bull": "3.15.4", + "@types/bull": "3.15.5", "@types/cbor": "6.0.0", "@types/dateformat": "3.0.1", "@types/escape-regexp": "0.0.0", @@ -63,17 +63,17 @@ "@types/koa-bodyparser": "4.3.3", "@types/koa-cors": "0.0.2", "@types/koa-favicon": "2.0.21", - "@types/koa-logger": "3.1.1", + "@types/koa-logger": "3.1.2", "@types/koa-mount": "4.0.1", "@types/koa-send": "4.1.3", "@types/koa-views": "7.0.0", "@types/koa__cors": "3.0.3", "@types/koa__multer": "2.0.3", "@types/koa__router": "8.0.8", - "@types/markdown-it": "12.2.1", + "@types/markdown-it": "12.2.3", "@types/matter-js": "0.17.5", "@types/mocha": "8.2.3", - "@types/node": "16.9.6", + "@types/node": "16.10.3", "@types/node-fetch": "2.5.12", "@types/nodemailer": "6.4.4", "@types/nprogress": "0.2.0", @@ -102,47 +102,46 @@ "@types/webpack": "5.28.0", "@types/webpack-stream": "3.2.12", "@types/websocket": "1.0.4", - "@types/ws": "7.4.7", - "@typescript-eslint/parser": "4.31.2", - "@vue/compiler-sfc": "3.2.13", + "@types/ws": "8.2.0", + "@typescript-eslint/parser": "5.0.0", + "@vue/compiler-sfc": "3.2.20", "abort-controller": "3.0.0", "apexcharts": "3.28.3", "autobind-decorator": "2.4.0", "autosize": "4.0.4", "autwh": "0.1.0", - "aws-sdk": "2.992.0", + "aws-sdk": "2.1003.0", "bcryptjs": "2.4.3", "blurhash": "1.1.4", "broadcast-channel": "4.2.0", - "bull": "3.29.2", - "cacheable-lookup": "6.0.1", + "bull": "3.29.3", + "cacheable-lookup": "6.0.3", "cafy": "15.2.1", - "cbor": "8.0.0", + "cbor": "8.0.2", "chalk": "4.1.2", "chart.js": "2.9.4", "cli-highlight": "2.1.11", - "commander": "8.1.0", "compare-versions": "3.6.0", - "concurrently": "6.2.1", + "concurrently": "6.3.0", "content-disposition": "0.5.3", "crc-32": "1.2.0", - "css-loader": "6.3.0", + "css-loader": "6.4.0", "cssnano": "5.0.8", "dateformat": "4.5.1", "escape-regexp": "0.0.1", - "eslint": "7.32.0", - "eslint-plugin-vue": "7.18.0", + "eslint": "8.0.1", + "eslint-plugin-vue": "7.19.1", "eventemitter3": "4.0.7", "feed": "4.2.2", "file-type": "16.5.3", "fluent-ffmpeg": "2.1.2", - "glob": "7.1.7", + "glob": "7.2.0", "got": "11.8.2", "gulp": "4.0.2", "gulp-cssnano": "2.1.3", "gulp-rename": "2.0.0", "gulp-replace": "1.1.3", - "gulp-terser": "2.0.1", + "gulp-terser": "2.1.0", "gulp-tslint": "8.1.4", "hpagent": "0.1.2", "http-signature": "1.3.5", @@ -157,7 +156,7 @@ "jsonld": "5.2.0", "jsrsasign": "8.0.20", "katex": "0.13.18", - "koa": "2.13.1", + "koa": "2.13.3", "koa-bodyparser": "4.3.0", "koa-favicon": "2.1.0", "koa-json-body": "5.3.0", @@ -170,22 +169,22 @@ "markdown-it": "12.2.0", "markdown-it-anchor": "7.1.0", "matter-js": "0.17.1", - "mfm-js": "0.19.0", + "mfm-js": "0.20.0", "misskey-js": "0.0.6", "mocha": "8.4.0", "ms": "2.1.3", "multer": "1.4.3", "nested-property": "4.0.0", "node-fetch": "2.6.1", - "nodemailer": "6.6.3", + "nodemailer": "6.7.0", "os-utils": "0.0.14", "parse5": "6.0.1", "pg": "8.7.1", "portscanner": "2.2.0", - "postcss": "8.3.7", - "postcss-loader": "6.1.1", + "postcss": "8.3.9", + "postcss-loader": "6.2.0", "prismjs": "1.25.0", - "private-ip": "2.2.1", + "private-ip": "2.3.0", "probe-image-size": "7.2.1", "promise-limit": "2.7.0", "pug": "3.0.2", @@ -204,8 +203,8 @@ "rimraf": "3.0.2", "rndstr": "1.0.0", "s-age": "1.1.2", - "sass": "1.42.1", - "sass-loader": "12.1.0", + "sass": "1.43.2", + "sass-loader": "12.2.0", "seedrandom": "3.0.5", "sharp": "0.29.1", "speakeasy": "2.0.0", @@ -213,7 +212,7 @@ "style-loader": "3.3.0", "summaly": "2.4.1", "syslog-pro": "1.0.0", - "systeminformation": "5.9.3", + "systeminformation": "5.9.7", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", "three": "0.117.1", @@ -221,19 +220,19 @@ "tinycolor2": "1.4.2", "tmp": "0.2.1", "ts-loader": "9.2.6", - "ts-node": "10.2.1", - "tsc-alias": "1.3.9", + "ts-node": "10.3.0", + "tsc-alias": "1.3.10", "tsconfig-paths": "3.11.0", "tslint": "6.1.3", "tslint-sonarts": "1.9.0", "twemoji-parser": "13.1.0", - "typeorm": "0.2.37", - "typescript": "4.4.3", + "typeorm": "0.2.38", + "typescript": "4.4.4", "ulid": "2.3.0", "uuid": "8.3.2", "v-debounce": "0.1.2", "vanilla-tilt": "1.7.2", - "vue": "3.2.13", + "vue": "3.2.20", "vue-loader": "16.7.0", "vue-prism-editor": "2.0.0-alpha.2", "vue-router": "4.0.5", @@ -241,17 +240,17 @@ "vue-svg-loader": "0.17.0-beta.2", "vuedraggable": "4.0.1", "web-push": "3.4.5", - "webpack": "5.53.0", - "webpack-cli": "4.8.0", + "webpack": "5.58.2", + "webpack-cli": "4.9.0", "websocket": "1.0.34", - "ws": "8.2.2", + "ws": "8.2.3", "xev": "2.0.1" }, "devDependencies": { "@redocly/openapi-core": "1.0.0-beta.54", "@types/fluent-ffmpeg": "2.1.17", "cross-env": "7.0.3", - "cypress": "8.4.1", + "cypress": "8.5.0", "start-server-and-test": "1.14.0" } } diff --git a/src/argv.ts b/src/argv.ts deleted file mode 100644 index 106ecf267..000000000 --- a/src/argv.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Command } from 'commander'; -import config from '@/config/index'; - -const program = new Command(); - -program.version(config.version); -program.option('--no-daemons', 'Disable daemon processes (for debbuging)'); -program.option('--disable-clustering', 'Disable clustering'); -program.option('--only-server', 'Run server only (without job queue processing)'); -program.option('--only-queue', 'Pocessing job queue only (without server)'); -program.option('--quiet', 'Suppress all logs'); -program.option('--verbose', 'Enable all logs'); -program.option('--with-log-time', 'Include timestamp for each logs'); -program.option('--slow', 'Delay all requests (for debbuging)'); -program.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.'); -program.parse(process.argv); - -if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true; -if (process.env.NODE_ENV === 'test') program.disableClustering = true; -//if (process.env.NODE_ENV === 'test') program.quiet = true; -if (process.env.NODE_ENV === 'test') program.noDaemons = true; - -export { program }; diff --git a/src/boot/index.ts b/src/boot/index.ts index 20c53a366..cb4c8536d 100644 --- a/src/boot/index.ts +++ b/src/boot/index.ts @@ -3,7 +3,7 @@ import * as chalk from 'chalk'; import Xev from 'xev'; import Logger from '@/services/logger'; -import { program } from '../argv'; +import { envOption } from '../env'; // for typeorm import 'reflect-metadata'; @@ -20,7 +20,7 @@ const ev = new Xev(); export default async function() { process.title = `Misskey (${cluster.isMaster ? 'master' : 'worker'})`; - if (cluster.isMaster || program.disableClustering) { + if (cluster.isMaster || envOption.disableClustering) { await masterMain(); if (cluster.isMaster) { @@ -28,7 +28,7 @@ export default async function() { } } - if (cluster.isWorker || program.disableClustering) { + if (cluster.isWorker || envOption.disableClustering) { await workerMain(); } @@ -60,7 +60,7 @@ cluster.on('exit', worker => { }); // Display detail of unhandled promise rejection -if (!program.quiet) { +if (!envOption.quiet) { process.on('unhandledRejection', console.dir); } diff --git a/src/boot/master.ts b/src/boot/master.ts index d9cc7c16b..071b37b76 100644 --- a/src/boot/master.ts +++ b/src/boot/master.ts @@ -11,7 +11,7 @@ import Logger from '@/services/logger'; import loadConfig from '@/config/load'; import { Config } from '@/config/types'; import { lessThan } from '@/prelude/array'; -import { program } from '../argv'; +import { envOption } from '../env'; import { showMachineInfo } from '@/misc/show-machine-info'; import { initDb } from '../db/postgre'; @@ -25,7 +25,7 @@ const logger = new Logger('core', 'cyan'); const bootLogger = logger.createSubLogger('boot', 'magenta', false); function greet() { - if (!program.quiet) { + if (!envOption.quiet) { //#region Misskey logo const v = `v${meta.version}`; console.log(' _____ _ _ '); @@ -73,13 +73,13 @@ export async function masterMain() { bootLogger.succ('Misskey initialized'); - if (!program.disableClustering) { + if (!envOption.disableClustering) { await spawnWorkers(config.clusterLimit); } bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true); - if (!program.noDaemons) { + if (!envOption.noDaemons) { require('../daemons/server-stats').default(); require('../daemons/queue-stats').default(); require('../daemons/janitor').default(); diff --git a/src/client/account.ts b/src/client/account.ts index 6e26ac1f7..a3fe082a2 100644 --- a/src/client/account.ts +++ b/src/client/account.ts @@ -1,9 +1,10 @@ import { del, get, set } from '@client/scripts/idb-proxy'; import { reactive } from 'vue'; import { apiUrl } from '@client/config'; -import { waiting } from '@client/os'; +import { waiting, api, popup, popupMenu, success } from '@client/os'; import { unisonReload, reloadChannel } from '@client/scripts/unison-reload'; import { showSuspendedDialog } from './scripts/show-suspended-dialog'; +import { i18n } from './i18n'; // TODO: 他のタブと永続化されたstateを同期 @@ -129,6 +130,77 @@ export async function login(token: Account['token'], redirect?: string) { unisonReload(); } +export async function openAccountMenu(ev: MouseEvent) { + function showSigninDialog() { + popup(import('@client/components/signin-dialog.vue'), {}, { + done: res => { + addAccount(res.id, res.i); + success(); + }, + }, 'closed'); + } + + function createAccount() { + popup(import('@client/components/signup-dialog.vue'), {}, { + done: res => { + addAccount(res.id, res.i); + switchAccountWithToken(res.i); + }, + }, 'closed'); + } + + async function switchAccount(account: any) { + const storedAccounts = await getAccounts(); + const token = storedAccounts.find(x => x.id === account.id).token; + switchAccountWithToken(token); + } + + function switchAccountWithToken(token: string) { + login(token); + } + + const storedAccounts = await getAccounts().then(accounts => accounts.filter(x => x.id !== $i.id)); + const accountsPromise = api('users/show', { userIds: storedAccounts.map(x => x.id) }); + + const accountItemPromises = storedAccounts.map(a => new Promise(res => { + accountsPromise.then(accounts => { + const account = accounts.find(x => x.id === a.id); + if (account == null) return res(null); + res({ + type: 'user', + user: account, + action: () => { switchAccount(account); } + }); + }); + })); + + popupMenu([...[{ + type: 'link', + text: i18n.locale.profile, + to: `/@${ $i.username }`, + avatar: $i, + }, null, ...accountItemPromises, { + icon: 'fas fa-plus', + text: i18n.locale.addAccount, + action: () => { + popupMenu([{ + text: i18n.locale.existingAccount, + action: () => { showSigninDialog(); }, + }, { + text: i18n.locale.createAccount, + action: () => { createAccount(); }, + }], ev.currentTarget || ev.target); + }, + }, { + type: 'link', + icon: 'fas fa-users', + text: i18n.locale.manageAccounts, + to: `/settings/accounts`, + }]], ev.currentTarget || ev.target, { + align: 'left' + }); +} + // このファイルに書きたくないけどここに書かないと何故かVeturが認識しない declare module '@vue/runtime-core' { interface ComponentCustomProperties { diff --git a/src/client/components/abuse-report-window.vue b/src/client/components/abuse-report-window.vue index 266c0d566..21a19385a 100644 --- a/src/client/components/abuse-report-window.vue +++ b/src/client/components/abuse-report-window.vue @@ -25,7 +25,7 @@ diff --git a/src/client/components/debobigego/range.vue b/src/client/components/debobigego/range.vue new file mode 100644 index 000000000..26fb0f37c --- /dev/null +++ b/src/client/components/debobigego/range.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/src/client/components/debobigego/select.vue b/src/client/components/debobigego/select.vue new file mode 100644 index 000000000..7a31371af --- /dev/null +++ b/src/client/components/debobigego/select.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/client/components/form/suspense.vue b/src/client/components/debobigego/suspense.vue similarity index 87% rename from src/client/components/form/suspense.vue rename to src/client/components/debobigego/suspense.vue index d04dc0762..e59e0ba12 100644 --- a/src/client/components/form/suspense.vue +++ b/src/client/components/debobigego/suspense.vue @@ -1,15 +1,15 @@