diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..730647b08 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,7 @@ +contact_links: + - name: 👪 Misskey Forum + url: https://forum.misskey.io/ + about: Ask questions and share knowledge + - name: 💬 Misskey official Discord + url: https://discord.gg/Wp8gVStHW3 + about: Chat freely about Misskey diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ba46dfdc7..30b804f0b 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,21 +1,29 @@ diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 7e02ba39f..c6e5329c2 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -35,6 +35,8 @@ jobs: node-version: ${{ matrix.node-version }} - name: Install dependencies run: yarn install + - name: Check yarn.lock + run: git diff --exit-code yarn.lock - name: Copy Configure run: cp .circleci/misskey/*.yml .config - name: Build diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fc982beb..f6d782c51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,29 @@ --> +## 12.88.0 (2021/08/17) + +### Features +- ノートの翻訳機能を追加 + - 有効にするには、サーバー管理者がDeepLの無料アカウントを登録し、取得した認証キーを「インスタンス設定 > その他 > DeepL Auth Key」に設定する必要があります。 +- Misskey更新時にダイアログを表示するように +- ジョブキューウィジェットに警報音を鳴らす設定を追加 + +### Improvements +- ブロックの挙動を改修 + - ブロックされたユーザーがブロックしたユーザーに対してアクション出来ないようになりました。詳細はドキュメントをご確認ください。 +- UIデザインの調整 +- データベースのインデックスを最適化 +- Proxy使用時にKeep-Aliveをサポート +- DNSキャッシュでネガティブキャッシュをサポート +- 依存関係の更新 + +### Bugfixes +- タッチ操作でウィンドウを閉じることができない問題を修正 +- Renoteされた時刻が投稿された時刻のように表示される問題を修正 +- コントロールパネルでファイルを削除した際の表示を修正 +- ActivityPub: 長いユーザーの名前や自己紹介の対応 + ## 12.87.0 (2021/08/12) ### Improvements diff --git a/Dockerfile b/Dockerfile index db879b6db..1e8584551 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,9 +18,7 @@ RUN apk add --no-cache \ nasm \ pkgconfig \ python3 \ - zlib-dev \ - vips-dev \ - vips + zlib-dev COPY package.json yarn.lock .yarnrc ./ RUN yarn install @@ -31,8 +29,7 @@ FROM base AS runner RUN apk add --no-cache \ ffmpeg \ - tini \ - vips + tini ENTRYPOINT ["/sbin/tini", "--"] diff --git a/assets/client/sounds/syuilo/queue-jammed.mp3 b/assets/client/sounds/syuilo/queue-jammed.mp3 new file mode 100644 index 000000000..ae749e253 --- /dev/null +++ b/assets/client/sounds/syuilo/queue-jammed.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de74f557d6f003945db689e9c1f56fc2c2154236edd8f713d70512cde86a3b44 +size 351466 diff --git a/cypress.json b/cypress.json new file mode 100644 index 000000000..f2c02689e --- /dev/null +++ b/cypress.json @@ -0,0 +1,3 @@ +{ + "baseUrl": "http://localhost" +} diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 000000000..02e425437 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/cypress/integration/basic.js b/cypress/integration/basic.js new file mode 100644 index 000000000..69d59bc2c --- /dev/null +++ b/cypress/integration/basic.js @@ -0,0 +1,69 @@ +describe('Basic', () => { + before(() => { + cy.request('POST', '/api/reset-db'); + }); + + beforeEach(() => { + cy.reload(true); + }); + + it('successfully loads', () => { + cy.visit('/'); + }); + + it('setup instance', () => { + cy.visit('/'); + + cy.get('[data-cy-admin-username] input').type('admin'); + + cy.get('[data-cy-admin-password] input').type('admin1234'); + + cy.get('[data-cy-admin-ok]').click(); + }); + + it('signup', () => { + cy.visit('/'); + + cy.get('[data-cy-signup]').click(); + + cy.get('[data-cy-signup-username] input').type('alice'); + + cy.get('[data-cy-signup-password] input').type('alice1234'); + + cy.get('[data-cy-signup-password-retype] input').type('alice1234'); + + cy.get('[data-cy-signup-submit]').click(); + }); + + it('signin', () => { + cy.visit('/'); + + cy.get('[data-cy-signin]').click(); + + cy.get('[data-cy-signin-username] input').type('alice'); + + // Enterキーでサインインできるかの確認も兼ねる + cy.get('[data-cy-signin-password] input').type('alice1234{enter}'); + }); + + it('note', () => { + cy.visit('/'); + + //#region TODO: この辺はUI操作ではなくAPI操作でログインする + cy.get('[data-cy-signin]').click(); + + cy.get('[data-cy-signin-username] input').type('alice'); + + // Enterキーでサインインできるかの確認も兼ねる + cy.get('[data-cy-signin-password] input').type('alice1234{enter}'); + //#endregion + + cy.get('[data-cy-open-post-form]').click(); + + cy.get('[data-cy-post-form-text]').type('Hello, Misskey!'); + + cy.get('[data-cy-open-post-form-submit]').click(); + + // TODO: 投稿した文字列が画面内にあるか(=タイムラインに流れてきたか)のテスト + }); +}); diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 000000000..59b2bab6e --- /dev/null +++ b/cypress/plugins/index.js @@ -0,0 +1,22 @@ +/// +// *********************************************************** +// This example plugins/index.js can be used to load plugins +// +// You can change the location of this file or turn off loading +// the plugins file with the 'pluginsFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/plugins-guide +// *********************************************************** + +// This function is called when a project is opened or re-opened (e.g. due to +// the project's config changing) + +/** + * @type {Cypress.PluginConfig} + */ +// eslint-disable-next-line no-unused-vars +module.exports = (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config +} diff --git a/cypress/support/commands.js b/cypress/support/commands.js new file mode 100644 index 000000000..119ab03f7 --- /dev/null +++ b/cypress/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) diff --git a/cypress/support/index.js b/cypress/support/index.js new file mode 100644 index 000000000..d68db96df --- /dev/null +++ b/cypress/support/index.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 59aac7e33..1f9afbdc2 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -1,14 +1,14 @@ --- _lang_: "Deutsch" headlineMisskey: "Ein durch Notizen verbundenes Netzwerk" -introMisskey: "Willkommen! Misskey ist eine dezentralisierte Open-Source Microblogging-Platform.\nVerfasse \"Notizen\" um mitzuteilen, was gerade passiert oder um Ereignisse mit Anderen zu teilen. 📡\nMit \"Reaktionen\" kannst du außerdem schnell deine Gefühle über Notizen anderer Benutzer zum Ausdruck bringen. 👍\nErforsche eine neue Welt! 🚀" -monthAndDay: "{day}/{month}" +introMisskey: "Willkommen! Misskey ist eine dezentralisierte Open-Source Microblogging-Platform.\nVerfasse „Notizen“ um mitzuteilen, was gerade passiert oder um Ereignisse mit anderen zu teilen. 📡\nMit „Reaktionen“ kannst du außerdem schnell deine Gefühle über Notizen anderer Benutzer zum Ausdruck bringen. 👍\nEine neue Welt wartet auf dich! 🚀" +monthAndDay: "{day}.{month}." search: "Suchen" notifications: "Benachrichtigungen" username: "Benutzername" password: "Passwort" forgotPassword: "Passwort vergessen" -fetchingAsApObject: "Wird aus dem Fediverse angefragt..." +fetchingAsApObject: "Wird aus dem Fediverse angefragt …" ok: "OK" gotIt: "Verstanden!" cancel: "Abbrechen" @@ -25,10 +25,10 @@ profile: "Profil" timeline: "Chronik" noAccountDescription: "Dieser Nutzer hat seine Profilbeschreibung noch nicht ausgefüllt." login: "Anmelden" -loggingIn: "Du wirst angemeldet..." +loggingIn: "Du wirst angemeldet …" logout: "Abmelden" signup: "Registrieren" -uploading: "Wird hochgeladen..." +uploading: "Wird hochgeladen …" save: "Speichern" users: "Benutzer" addUser: "Benutzer hinzufügen" @@ -63,7 +63,7 @@ import: "Import" export: "Export" files: "Dateien" download: "Herunterladen" -driveFileDeleteConfirm: "Möchtest du die Datei \"{name}\" wirklich löschen? Die zugehörige Notiz wird ebenso verschwinden." +driveFileDeleteConfirm: "Möchtest du die Datei „{name}“ wirklich löschen? Die zugehörige Notiz wird ebenso verschwinden." unfollowConfirm: "Möchtest du {name} nicht mehr folgen?" exportRequested: "Du hast einen Export angefragt. Dies kann etwas Zeit in Anspruch nehmen. Sobald der Export abgeschlossen ist, wird er deiner Drive hinzugefügt." importRequested: "Du hast einen Import angefragt. Dies kann etwas Zeit in Anspruch nehmen." @@ -80,7 +80,7 @@ error: "Fehler" somethingHappened: "Ein Fehler ist aufgetreten" retry: "Wiederholen" pageLoadError: "Laden der Seite fehlgeschlagen." -pageLoadErrorDescription: "Dieser Fehler wird meist durch Netzwerkfehler oder den Browser-Cache verursacht. Versuche bitte den Browser-Cache zu leeren und es nach kurzer Zeit noch einmal zu probieren." +pageLoadErrorDescription: "Dieser Fehler wird meist durch Netzwerkfehler oder den Browser-Cache verursacht. Bitte leere den Cache oder versuche es nach einiger Zeit erneut." enterListName: "Name der Liste eingeben" privacy: "Privatsphäre" makeFollowManuallyApprove: "Follow-Anfragen benötigen Bestätigung" @@ -105,7 +105,7 @@ sensitive: "NSFW" add: "Hinzufügen" reaction: "Reaktionen" reactionSettingDescription: "Wähle die Reaktionen aus, die in der Reaktionsauswahl angezeigt werden sollen." -reactionSettingDescription2: "Ziehe zum Anordnen, Klicke zum Löschen, Drücke \"+\" zum Hinzufügen" +reactionSettingDescription2: "Ziehe zum Anordnen, klicke zum Löschen, drücke + zum Hinzufügen" rememberNoteVisibility: "Notizsichtbarkeit merken" attachCancel: "Anhang entfernen" markAsSensitive: "Als NSFW markieren" @@ -129,14 +129,14 @@ editWidgetsExit: "Fertig" customEmojis: "Benutzerdefinierte Emojis" emoji: "Emojis" emojis: "Emojis" -emojiName: "Emojiname" +emojiName: "Emoji-Name" emojiUrl: "Emoji-URL" addEmoji: "Emoji hinzufügen" settingGuide: "Empfohlene Einstellung" cacheRemoteFiles: "Dateien von fremden Instanzen im Cache speichern" cacheRemoteFilesDescription: "Ist diese Einstellung deaktiviert, so werden Dateien fremder Instanzen direkt von dort geladen. Hierdurch wird Speicherplatz auf dem Server gespart, aber durch fehlende Generierung von Vorschaubildern mehr Bandbreite verwendet." flagAsBot: "Als Bot markieren" -flagAsBotDescription: "Aktiviere diese Option, falls dieses Benutzerkonto durch ein Programm gesteuert wird. Falls aktiviert, agiert es als Flag für andere Entwickler zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lässt Misskey's interne Systeme dieses Benutzerkonto als Bot behandeln." +flagAsBotDescription: "Aktiviere diese Option, falls dieses Benutzerkonto durch ein Programm gesteuert wird. Falls aktiviert, agiert es als Flag für andere Entwickler zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lässt Misskeys interne Systeme dieses Benutzerkonto als Bot behandeln." flagAsCat: "Als Katze markieren" flagAsCatDescription: "Aktiviere diese Option, um dieses Benutzerkonto als Katze zu markieren." autoAcceptFollowed: "Follow-Anfragen von Benutzern, denen du folgst, automatisch akzeptieren" @@ -196,7 +196,7 @@ noteDeleteConfirm: "Möchtest du diese Notiz wirklich löschen?" pinLimitExceeded: "Es können nicht noch mehr Notizen angeheftet werden" intro: "Misskey Installation abgeschlossen! Lass uns nun ein Administratorkonto erstellen." done: "Fertig" -processing: "In Bearbeitung..." +processing: "In Bearbeitung …" preview: "Vorschau" default: "Standard" noCustomEmojis: "Keine benutzerdefinierten Emojis vorhanden" @@ -227,8 +227,8 @@ announcements: "Ankündigungen" imageUrl: "Bild-URL" remove: "Löschen" removed: "Erfolgreich gelöscht" -removeAreYouSure: "Möchtest du \"{x}\" wirklich entfernen?" -deleteAreYouSure: "Möchtest du \"{x}\" wirklich löschen?" +removeAreYouSure: "Möchtest du „{x}“ wirklich entfernen?" +deleteAreYouSure: "Möchtest du „{x}“ wirklich löschen?" resetAreYouSure: "Wirklich zurücksetzen?" saved: "Gespeichert" messaging: "Chat" @@ -240,7 +240,7 @@ uploadFromUrlDescription: "URL der hochzuladenden Datei" uploadFromUrlRequested: "Upload angefordert" uploadFromUrlMayTakeTime: "Es kann eine Weile dauern, bis das Hochladen abgeschlossen ist." explore: "Erkunden" -games: "Misskey Spiele" +games: "Misskey-Spiele" messageRead: "Gelesen" noMoreHistory: "Kein weiterer Verlauf vorhanden" startMessaging: "Neuen Chat erstellen" @@ -256,14 +256,14 @@ birthday: "Geburtstag" yearsOld: "{age} Jahre alt" registeredDate: "Registrationsdatum" location: "Ort" -theme: "Farbthemen" -themeForLightMode: "Farbthema, das im Hellmodus genutzt wird" -themeForDarkMode: "Farbthema, das im Dunkelmodus genutzt wird" +theme: "Farbschema" +themeForLightMode: "Helles Farbschema" +themeForDarkMode: "Dunkles Farbschema" light: "Hell" dark: "Dunkel" -lightThemes: "Helle Farbthemen" -darkThemes: "Dunkle Farbthemen" -syncDeviceDarkMode: "Dunkelmodus mit den Einstellungen deines Gerätes synchronisieren" +lightThemes: "Helle Farbschemata" +darkThemes: "Dunkle Farbschemata" +syncDeviceDarkMode: "Einstellung deines Geräts übernehmen" drive: "Drive" fileName: "Dateiname" selectFile: "Datei auswählen" @@ -293,7 +293,7 @@ whenServerDisconnected: "Bei Verbindungsverlust zum Server" disconnectedFromServer: "Verbindung zum Server wurde getrennt" reload: "Aktualisieren" doNothing: "Ignorieren" -reloadConfirm: "Möchtest du die Chronik aktualisieren?" +reloadConfirm: "Seite neu laden?" watch: "Beobachten" unwatch: "Nicht mehr beobachten" accept: "Akzeptieren" @@ -302,10 +302,10 @@ normal: "Normal" instanceName: "Name der Instanz" instanceDescription: "Beschreibung der Instanz" maintainerName: "Betreiber" -maintainerEmail: "Betreiber-Email" +maintainerEmail: "Betreiber-E-Mail" tosUrl: "URL der Nutzungsbedingungen" -thisYear: "Dieses Jahr" -thisMonth: "Dieser Monat" +thisYear: "Jahr" +thisMonth: "Monat" today: "Heute" dayX: "{day}" monthX: "{month}" @@ -522,7 +522,7 @@ scratchpadDescription: "Die Testumgebung bietet eine Umgebung für AiScript-Expe output: "Ausgabe" script: "Skript" disablePagesScript: "AiScript auf Seiten deaktivieren" -updateRemoteUser: "Informationen über Benutzer fremder Instanzen aktualisieren" +updateRemoteUser: "Benutzerinformationen aktualisieren" deleteAllFiles: "Alle Dateien löschen" deleteAllFilesConfirm: "Möchtest du wirklich alle Dateien löschen?" removeAllFollowing: "Allen gefolgten Benutzern entfolgen" @@ -715,7 +715,7 @@ inChannelSearch: "In Kanal suchen" useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen" typingUsers: "{users} ist/sind am schreiben..." jumpToSpecifiedDate: "Zu bestimmtem Datum springen" -showingPastTimeline: "Momentan wird eine alte Chronik angezeigt" +showingPastTimeline: "Es wird eine alte Chronik angezeigt" clear: "Zurückkehren" markAllAsRead: "Alle als gelesen markieren" goBack: "Zurück" @@ -772,6 +772,11 @@ searchResult: "Suchergebnisse" hashtags: "Hashtags" troubleshooting: "Problembehandlung" useBlurEffect: "Weichzeichnungseffekt in der Benutzeroberfläche verwenden" +learnMore: "Mehr erfahren" +misskeyUpdated: "Misskey wurde aktualisiert!" +whatIsNew: "Änderungen anzeigen" +translate: "Übersetzen" +translatedFrom: "Aus {x} übersetzt" _docs: continueReading: "Mehr lesen" features: "Funktionen" @@ -793,7 +798,7 @@ _gallery: unlike: "\"Gefällt mir\" entfernen" _email: _follow: - title: "ist dir gefolgt" + title: "Du hast einen neuen Follower" _receiveFollowRequest: title: "Du hast eine Follow-Anfrage erhalten" _plugin: @@ -1047,7 +1052,7 @@ _time: _tutorial: title: "Wie du Misskey verwendest" step1_1: "Willkommen!" - step1_2: "Diese Seite ist die \"Chronik\". Sie zeigt dir deine geschrieben \"Notizen\" sowie die aller Benutzer, denen du \"folgst\", in chronologischer Reihenfolge." + step1_2: "Diese Seite ist die „Chronik“. Sie zeigt dir deine geschrieben „Notizen“ sowie die aller Benutzer, denen du „folgst“, in chronologischer Reihenfolge." step1_3: "Deine Chronik sollte momentan leer sein, da du bis jetzt noch keine Notizen geschrieben hast und auch noch keinen Benutzern folgst." step2_1: "Lass uns zuerst dein Profil vervollständigen, bevor du Notizen schreibst oder jemandem folgst." step2_2: "Informationen darüber, was für eine Person du bist, macht es anderen leichter zu wissen, ob sie deine Notizen sehen wollen und ob sie dir folgen möchten." @@ -1056,7 +1061,7 @@ _tutorial: step3_3: "Fülle das Fenster aus und drücke auf den Knopf oben rechts zum Senden." step3_4: "Fällt dir nichts ein, das du schreiben möchtest? Versuch's mit \"Hallo Misskey!\"" step4_1: "Fertig mit dem Senden deiner ersten Notiz?" - step4_2: "Falls deine Notiz nun auf deiner Chronik auftaucht, hast du alles richtig gemacht." + step4_2: "Falls deine Notiz nun in deiner Chronik auftaucht, hast du alles richtig gemacht." step5_1: "Lass uns nun deiner Chronik etwas mehr Leben einhauchen, indem du einigen anderen Benutzern folgst." step5_2: "{featured} zeigt dir beliebte Notizen dieser Instanz. In {explore} kannst du beliebte Benutzer finden. Schau dort, ob du Benutzer findest, die dich interessieren." step5_3: "Klicke zum Anzeigen des Profils eines Benutzers auf dessen Profilbild und dann auf den \"Folgen\"-Knopf, um diesem zu folgen." diff --git a/locales/en-US.yml b/locales/en-US.yml index 94e374c8d..24569eeec 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -772,6 +772,11 @@ searchResult: "Search results" hashtags: "Hashtags" troubleshooting: "Troubleshooting" useBlurEffect: "Use blur effects in the UI" +learnMore: "Learn more" +misskeyUpdated: "Misskey has been updated!" +whatIsNew: "Show changes" +translate: "Translate" +translatedFrom: "Translated from {x}" _docs: continueReading: "Read more" features: "Features" diff --git a/locales/eo-UY.yml b/locales/eo-UY.yml index 69beb9ab1..15575c753 100644 --- a/locales/eo-UY.yml +++ b/locales/eo-UY.yml @@ -1,7 +1,7 @@ --- _lang_: "Esperanto" -headlineMisskey: "Reto ligiĝanta per notoj" -introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentriza mikrobloga servo.\nKreu \"noto\"n por kunhavu tion ke nun okazas, aŭ por dissendu pri vi📡\nPer la funkcio \"reago\" vi ankaŭ povas rapide esprimi vian senton pri ĉies noto👍\nVolu esplori nova mondo🚀" +headlineMisskey: "Reto ligata per notoj" +introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza mikrobloga servo.\nKreu \"noto\"n por diskonigi tion ke nun okazas, aŭ por dissendu pri vi📡\nPer la funkcio \"reago\" vi ankaŭ povas rapide esprimi vian senton pri ĉies noto👍\nVolu esplori nova mondo🚀" monthAndDay: "{day}-a/{month}" search: "Serĉi" notifications: "Sciigoj" @@ -10,10 +10,10 @@ password: "Pasvorto" forgotPassword: "Ĉu vi forgesis pasvorton?" fetchingAsApObject: "Informpetado de Fediverso..." ok: "Akcepteble" -gotIt: "Mi konprenas!" +gotIt: "Mi komprenas" cancel: "Nuligi" enterUsername: "Entajpu uzantnomon" -renotedBy: "Renoton faras {user}" +renotedBy: "Renoto farita de {user}" noNotes: "Neniu noto!" noNotifications: "Vi ne havas sciigojn." instance: "Ekzemplo" @@ -44,7 +44,7 @@ copyContent: "Kopii enhavon" copyLink: "Kopii ligilon" delete: "Forviŝi" deleteAndEdit: "Forigi kaj redakti" -deleteAndEditConfirm: "Ĉu vi certas, ke vi volas forigi kaj redakti la noton? Ĉiuj reagoj, renotoj, kaj respondoj ankaŭ foriĝos." +deleteAndEditConfirm: "Ĉu vi certas, ke vi volas forigi kaj redakti la noton? Ankaŭ ĉiuj reagoj, renotoj, kaj respondoj al ĝi foriĝos." addToList: "Aldoni al la listo" sendMessage: "Sendi mesaĝon" copyUsername: "Kopii uzantnomon" @@ -52,12 +52,13 @@ searchUser: "Serĉi uzanton" reply: "Respondi" loadMore: "Vidu pli" showMore: "Vidi pli" -youGotNewFollower: "Vin eksekvis" -receiveFollowRequest: "Eksekvopeton riceviĝis." -followRequestAccepted: "La eksekvopeto akceptiĝis." +youGotNewFollower: "sksekvis vin" +receiveFollowRequest: "Peto de sekvado estas ricevita" +followRequestAccepted: "La peto de sekvado akceptita" mention: "Mencioj" mentions: "Al vi" -importAndExport: "Importaĵo / Eksportaĵo" +directNotes: "Rektaj notoj" +importAndExport: "Importi/eksporti" import: "Importi" export: "Eksporti" files: "Dosieroj" @@ -70,7 +71,7 @@ note: "Elsendi noto" notes: "Notoj" following: "Sekvatoj" followers: "Sekvantoj" -followsYou: "Vin sekvas " +followsYou: "Sekvas vin" createList: "Kreii liston" error: "Eraro" somethingHappened: "Problemo okazis." @@ -78,9 +79,9 @@ retry: "Reprovi" enterListName: "Entajpu nomon de la listo" privacy: "Privateco" follow: "Sekvi" -followRequest: "Peti akcepti de vi eksekvi" -followRequests: "Eksekvopetoj" -unfollow: "Ne plu sekvi" +followRequest: "Peti de sekvado" +followRequests: "Petoj de sekvado" +unfollow: "Malsekvi" enterEmoji: "Entajpu emoĵion" renote: "Fari renoton" unrenote: "Malfari renoton" @@ -95,7 +96,7 @@ clickToShow: "Klaku por malkaŝu" sensitive: "Enhavo ne estas deca por laborejo (NSFW)" add: "Aldoni" reaction: "Reagoj" -enterFileName: "Entajpu dosiernomon" +enterFileName: "Entajpu nomon de dosiero" mute: "Silentigi" unmute: "Malsilentigi" block: "Bloki" @@ -115,7 +116,7 @@ customEmojis: "Personecigitaj emoĵioj" emoji: "Emoĵio" emojis: "Emoĵio" emojiName: "Nomo de emoĵio" -emojiUrl: "URL de la bildo de emoĵio" +emojiUrl: "URL de la emoĵio" addEmoji: "Aldoni emoĵion" settingGuide: "Rekomendaj agordoj" cacheRemoteFiles: "Havi staplon por transaj dosieroj" @@ -124,16 +125,20 @@ flagAsCat: "Tiu uzanto estas kato" addAccount: "Aldoni konton" showOnRemote: "Vidi sur la fora ekzemplo" general: "Ĝenerala" +wallpaper: "Ekranfonoj" +setWallpaper: "Apliki ekranfonon" +removeWallpaper: "Forviŝi ekranfonon. " searchWith: "Serĉi: {q}" youHaveNoLists: "Vi ne havas listojn." followConfirm: "Ĉu vi certas ke vi volas sekvi {name}'(o)n?" selectUser: "Elekti uzanton" annotation: "Komentarioj" -federation: "Konfederacio" +federation: "Kunfederaĵo" instances: "Ekzemplo" perHour: "Po horo" perDay: "Po tago" blockThisInstance: "Bloki tiu ekzemplo" +version: "Versio" withNFiles: "{n} dosiero(j)" disk: "Diskilo" instanceInfo: "Informo pri la ekzemplo" @@ -147,61 +152,86 @@ noUsers: "Sen uzantoj" editProfile: "Redakti profilon" noteDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la noton?" pinLimitExceeded: "Vi ne plu povas alpingli noton." +processing: "Traktado..." noCustomEmojis: "Neniu emoĵio" -federating: "Konfederado" +federating: "Kunfederado" blocked: "Blokata" +all: "Ĉiuj" subscribing: "Abonita" +publishing: "Dissendado" notResponding: "Alvokato ne disponeblas" -instanceFollowing: "Sekvatoj sur la ekzemplo" +instanceFollowing: "Sekvatoj el la ekzemplo" instanceFollowers: "Sekvantoj el la ekzemplo" instanceUsers: "Uzantoj de la ekzemplo" changePassword: "Ŝanĝi pasvorton" +security: "Sekureco" currentPassword: "Aktuala pasvorto" newPassword: "Nova pasvorto" newPasswordRetype: "Reentajpu la novan pasvorton" attachFile: "Aldoni dosieron" more: "Plu!" +featured: "Maksimumi" usernameOrUserId: "Uzantnomo aŭ identigilo de uzanto" noSuchUser: "Neniuj uzantoj trovitaj." +lookup: "Informpeti" +announcements: "Novaĵoj" imageUrl: "URL de bildo" remove: "Forigi" removed: "Forviŝis" removeAreYouSure: "Ĉu vi certas ke vi volas forigi \"{x}\"'(o)n?" deleteAreYouSure: "Ĉu vi certas ke vi volas forviŝi \"{x}\"'(o)n?" +saved: "Konservita" messaging: "Retbabili" upload: "Alŝuti" -fromDrive: "De la diskingo" +fromDrive: "De la disko" fromUrl: "De URL" uploadFromUrl: "Alŝuti de URL" -uploadFromUrlDescription: "URL de la dosiero kiun vi volu alŝuti" +uploadFromUrlDescription: "URL de la dosiero kiun vi volas alŝuti" +explore: "Esplori" games: "Ludoj sur Misskey" messageRead: "Legita" startMessaging: "Komenci babiladon" +nUsersRead: "Legita de {n} homoj" tos: "Kondiĉoj de uzado" start: "Komenciĝi" home: "Hejmo" remoteUserCaution: "Ĉi tiu Infomoj estas ne tute ekzakta pro distanca uzanto." +activity: "Aktiveco" images: "Bildoj" -birthday: "Naskiĝtago" +birthday: "Naskiĝdato" registeredDate: "Registriĝdato" -drive: "Diskingo" +location: "Loko" +theme: "Koloraro" +light: "Luma" +dark: "Malluma" +drive: "Disko" fileName: "Dosiernomo" selectFile: "Elekti dosieron" selectFiles: "Elekti dosieron" +selectFolder: "Elekti dosierujon" +selectFolders: "Elekti dosierujon" renameFile: "Alinomi la dosieron" folderName: "Nomo de la dosierujo" +createFolder: "Krei dosierujon" renameFolder: "Alinomi la dosierujon" deleteFolder: "Forviŝi dosierujon" addFile: "Aldoni dosieron" -emptyDrive: "La diskingo malplenas." +emptyDrive: "La disko malplenas" +emptyFolder: "La dosierujo malplenas" unableToDelete: "Ne forigebla" -inputNewFileName: "Entajpu nova dosiernomon" +inputNewFileName: "Entajpu nova nomon de la dosiero" inputNewFolderName: "Entajpu nova nomon de la dosierujo" hasChildFilesOrFolders: "La dosierujo ne estas forviŝebla, ĉar ĝi ne malplenas." copyUrl: "Kopii URL" rename: "Alinomi" avatar: "Ikono" +banner: "Standardo" nsfw: "Enhavo ne estas deca por laborejo (NSFW)" +reload: "Reŝargi" +watch: "Observi" +unwatch: "Malobservi" +accept: "Permesi" +normal: "Normala" instanceName: "Nomo de la ekzemplo" maintainerName: "Nomo de la administranto" maintainerEmail: "Retpoŝto de la administranto" @@ -212,15 +242,24 @@ today: "Hodiaŭ" dayX: "{day}-a" monthX: "{month}" yearX: "La jaro {year}" +pages: "Paĝoj" connectService: "Konekti" disconnectService: "Farkonektiĝi" -driveCapacityPerLocalAccount: "Volumo de miskej-diskingo po unu loka uzanto" -driveCapacityPerRemoteAccount: "Volumo de miskej-diskingo po unu transa uzanto" -iconUrl: "URL de la ikono (retpaĝsimbolo, ktp.)" +enableGlobalTimeline: "Ebligi mallokan templinion" +registration: "Registri" +driveCapacityPerLocalAccount: "Volumo de disko po unu loka uzanto" +driveCapacityPerRemoteAccount: "Volumo de disko po unu transa uzanto" +iconUrl: "URL de la ikono (retpaĝsimbolo, ktp)" +bannerUrl: "URL de standardo" +backgroundImageUrl: "URL de fona bildo" +basicInfo: "Baza informo" pinnedUsers: "Alpinglita uzanto" +pinnedPages: "Alpinglitaj paĝoj" pinnedNotes: "Pinglita noto" +antennas: "Antenoj" name: "Nomo" withFileAntenna: "Nur kun aldonaĵo" +withReplies: "Inkluzive respondoj" notesAndReplies: "Kun respondoj" withFiles: "Kun aldonaĵo" silence: "Mutigi" @@ -231,53 +270,98 @@ recentlyUpdatedUsers: "Uzantoj kiu lastatempe faris noton" recentlyRegisteredUsers: "Nove aniĝintaj uzantoj" popularTags: "Popularaj kradvortoj" userList: "Listoj" +about: "Informoj" aboutMisskey: "Pri Misskey" +administrator: "Administranto" +moderator: "Moderigisto" +securityKey: "Sekureca ŝlosilo" securityKeyName: "Nomo de la ŝlosilo" +lastUsed: "Plej malnove uzita" passwordLessLogin: "Ensaluti sen pasvorto" resetPassword: "Restarigi pasvorton" newPasswordIs: "La nova pasvorto estas {password}." +share: "Diskonigi" +notFound: "Ne trovita" cacheClear: "Malplenigi staplon" help: "Manlibro de uzado" inputMessageHere: "Entajpu masaĝo tie ĉi" +close: "Fermi" +group: "Grupo" +groups: "Grupoj" +createGroup: "Krei grupon" groupName: "Grupa nomo" +members: "Membroj" messagingWithUser: "Mesaĝado kun uzanto" -messagingWithGroup: "Mesaĝi kun grupo" +messagingWithGroup: "Mesaĝado kun grupo" +title: "Titolo" +text: "Teksto" +enable: "Ebligi" +next: "Sekve" noteOf: "Noto de {user}" noMessagesYet: "Neniu mesaĝo" newMessageExists: "Vi ricevis novan mesaĝon." onlyOneFileCanBeAttached: "Vi povas aldoni nur unu dosieron po unu mesaĝo." invitationCode: "Kodo de invito" -uiLanguage: "Lingvo de la interfaco" +or: "Aŭ" +language: "Lingvo" +uiLanguage: "Lingvo de la fasado" +aboutX: "Pri {x}" +useOsNativeEmojis: "Oni uzas la emoĵioj de la denaska sistemo" +youHaveNoGroups: "Neniuj grupoj" +category: "Kategorio" tags: "Etikedoj" createAccount: "Krei konton" existingAccount: "Ekzista konto" -noFollowRequests: "Vi ne havas eksekvopetojn." +fontSize: "Tipara grando" +noFollowRequests: "Vi ne havas peto de sekvado" openImageInNewTab: "Fermi la bildon en nova tablo" +dashboard: "Stirpanelo" local: "Loka" remote: "Transa" +total: "Entute" +clientSettings: "Agordoj de kliento" accountSettings: "Agordoj de Konto" numberOfDays: "Nombro de tagoj" hideThisNote: "Kaŝi tiun noton" objectStorageBaseUrl: "Baza URL" +objectStorageRegion: "Regiono" +objectStorageUseSSL: "Oni uzas SSL" +serverLogs: "Servila protokolo" deleteAll: "Forviŝi ĉiujn" +sounds: "Sonoj" +listen: "Aŭdi" +none: "Neniu" showInPage: "Vidi en paĝo" deleteAllFiles: "Forviŝi ĉiujn dosierojn" deleteAllFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn viajn dosierojn?" userSilenced: "Tiu uzanto estas mutigata." +menu: "Menuo" deletedNote: "Forviŝita noto" invisibleNote: "Malpublika noto" poll: "Balotujo" +useCw: "Kaŝi enhavo" +themeEditor: "Redaktilo de koloraroj" +author: "Aŭtoro" +plugins: "Kromaĵoj" +deck: "Kartaro" +medium: "Meza" +small: "Malgranda" edit: "Redakti" emailServer: "Retpoŝta servilo" email: "Retpoŝto" emailAddress: "Retpoŝta adreso" +smtpConfig: "Agordoj de la servilo SMTP" smtpUser: "Uzantnomo" smtpPass: "Pasvorto" wordMute: "Silentigo de vortoj" userSaysSomething: "{name} parolis ion" display: "Vidi" +copy: "Kopii" database: "Datumbazo" channel: "Kanalo" +create: "Krei" +notificationSetting: "Agordoj de sciigoj" +useGlobalSetting: "Oni uzas malloka agordo" fileIdOrUrl: "Dosiera identigilo aŭ URL" abuseReports: "Signali" reportAbuse: "Signali" @@ -285,45 +369,89 @@ reportAbuseOf: "Signali {name}'(o)n" send: "Sendi" openInNewTab: "Malfermi en nova langeto" editTheseSettingsMayBreakAccount: "Redakti tiujn agordojn estas eble damaĝi konton." +public: "Publika" i18nInfo: "Misskey estas tradukata en diversaj lingvoj far volontuloj. Oni povas kontribui por la tradukado ĉe {link}." +accountInfo: "Kontaj Informoj" +notesCount: "Numero de notoj" +repliesCount: "Numero de respondoj senditaj" +renotesCount: "Numero de renotoj kiun vi sendis" +repliedCount: "Numero de respondoj ricevitaj" +renotedCount: "Numero de renotoj kiun vi ricevis" followingCount: "Numero de sekvatoj" followersCount: "Numero de sekvantoj" +sentReactionsCount: "Numero de sentitaj reagoj" +receivedReactionsCount: "Numero de ricevitaj reagoj" yes: "Jes" no: "Ne" -driveFilesCount: "Numero de dosieroj en la diskingo" +driveFilesCount: "Numero de dosieroj sur la disko" +notSet: "Ne elektita" noteFavoritesCount: "Numero de la preferataj notoj" -makeExplorable: "Igi videbla konto sur la paĝo \"Esplorado\"" -showTitlebar: "Montri titolobredon" +contact: "Kontakto" +makeExplorable: "Videbligi konton sur la paĝo \"Esplori\"" +duplicate: "Duobligi" +left: "Maldekstra" +center: "Centra" +showTitlebar: "Montri titola stango" clearCache: "Malplenigi staplon" onlineUsersCount: "{n} uzanto(j) estas surlinea" nUsers: "{n} uzanto(j)" +nNotes: "{n} notoj" +myTheme: "Miaj koloraroj" +backgroundColor: "Fona koloro" +textColor: "Teksto" saveAs: "Konservi kiel…" +value: "Valoro" createdAt: "Kreita je" updatedAt: "Laste ĝisdatigita" deleteConfirm: "Ĉu certas forviŝi?" closeAccount: "Forigi konton" +currentVersion: "Nuna versio" +latestVersion: "Plej nova versio" +youAreRunningUpToDateClient: "Vi uzas la plej novan version de via kliento." +newVersionOfClientAvailable: "Nova versio de via kliento estas disponebla." +inUse: "Uzata" editCode: "Redakti kodon" emailNotification: "Sciigoj per retpoŝto" publish: "Publikigi" inChannelSearch: "Serĉi en kanalo" -useReactionPickerForContextMenu: "Malfermu reago-elektilon per dekstro-kliki" +useReactionPickerForContextMenu: "Oni malfermas reago-elektilon per dekstro-kliki" typingUsers: "{users} estas entajpanta(j)..." +info: "Informoj" +unknown: "Nekonata" online: "Surkonektita" offline: "Forkonektita" instanceBlocking: "Blokado de ekzemplo" selectAccount: "Elekti konton" user: "Uzanto" accounts: "Kontoj" -global: "Konfederacia" +high: "Alta" +middle: "Meza" +low: "Malalta" +customCss: "Uzantula CSS" +global: "Malloka" sent: "Sendi" +received: "Ricevita" +searchResult: "Serĉorezultoj" hashtags: "Kradvorto" +learnMore: "Lernu pli" +translate: "Traduki" +translatedFrom: "Tradukita el {x}" +_docs: + continueReading: "Legi plu" + features: "Funkcioj" _gallery: liked: "Ŝatitaj notoj" + like: "Ŝati" _email: _follow: - title: "Vin eksekvis" + title: "Vi estas eksekvita" _receiveFollowRequest: - title: "Vi ricevis eksekvopeton." + title: "Vi ricevis peton de sekvado" +_registry: + key: "Ŝlosilo" + keys: "Ŝlosiloj" + domain: "Nomregno" + createKey: "Krei ŝlosilon" _aboutMisskey: about: "Misskey estas malfermitkoda programo evoluigata de syuilo ekde la 2014." contributors: "Precipaj kontribuantoj" @@ -335,6 +463,10 @@ _mfm: mention: "Mencioj" hashtag: "Kradvorto" url: "URL" + link: "Ligilo" + bold: "Grasa" + small: "Malgrande" + center: "Centrigi" inlineCode: "Kodo (en linio)" blockCode: "Kodo (bloko)" inlineMath: "Formulo (en linio)" @@ -342,6 +474,12 @@ _mfm: quote: "Citi" emoji: "Personecigitaj emoĵioj" search: "Serĉi" + flip: "Inversa" + x2: "Granda" + x3: "Grandega" + x4: "Pli grandega" +_reversi: + total: "Entute" _instanceTicker: none: "Ne montri" remote: "Montri al transaj uzantoj" @@ -349,30 +487,39 @@ _instanceTicker: _channel: create: "Krei kanalon" edit: "Redakti kanalon" - following: "Sekvata" + following: "Sekvante" + usersCount: "{n} partoprenanto(j)" _menuDisplay: hide: "Kaŝi" _wordMute: - muteWords: "Silentigataj vortoj" + muteWords: "Kaŝigitaj vortoj" mutedNotes: "Silentigataj notoj" _theme: code: "Kodo de koloraro" + darken: "Malbrileco" + lighten: "Brileco" keys: + bg: "Fono" + navBg: "Fono de flanka stango" hashtag: "Kradvorto" mention: "Mencioj" renote: "Fari renoton" + buttonBg: "Fono de butono" + driveFolderBg: "Fono de dosierujo de la disko" _sfx: note: "Nova noto" noteMy: "Mia noto" notification: "Sciigoj" - chat: "Retbabilejo" - chatBg: "Retbabilejo (BG)" + chat: "Retbabili" + chatBg: "Retbabili (BG)" antenna: "Ricevo de anteno" channel: "Sciigoj de kanalo" _ago: + future: "Futuro" + justNow: "Ĵus" secondsAgo: "Antaŭ {n} sekundoj" minutesAgo: "Antaŭ {n} minutoj" - hoursAgo: "Antaŭ {n} horoj" + hoursAgo: "Antaŭ {n} horo(j)" daysAgo: "Antaŭ {n} tagoj" weeksAgo: "Antaŭ {n} semajnoj" monthsAgo: "Antaŭ {n} monatoj" @@ -385,17 +532,17 @@ _time: _tutorial: title: "Uzado de Misskey" step1_1: "Bonvenon." - step7_2: "Se vi volus scii pli pri Miskejon, volu rigardi la fakon {help}." - step7_3: "Do, bonvolu amuziĝi Miskejon🚀" + step7_2: "Se vi volas scii pli pri Misskey, rigardu la fakon {help}." + step7_3: "Do, bonvolu amuziĝi Misskey'on🚀" _permissions: "read:blocks": "Vidi la liston de uzantoj kiun vi blokas" "write:blocks": "Redakti vian liston de blokataj uzantoj" - "read:drive": "Operacio por legi la informon de dosiero en via diskingo de Miskejo" - "write:drive": "Ĉia operacio por skribi, forviŝi, aŭ alimaniere ŝanĝi la informon de dosiero en via diskingo de Miskejo" + "read:drive": "Operacio por legi la informon de dosiero en via disko de Misskey" + "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 preferatoj" - "read:following": "Vidi tion kion vi sekvas" - "write:following": "Sekvi kaj/aŭ malsekvi alian uzanton" - "read:messaging": "Vidi via retbabilado" + "read:following": "Vidi tiun kiun vi sekvas" + "write:following": "Sekvi aŭ malsekvi alian uzanton" + "read:messaging": "Vidi vian retbabiladon" "read:mutes": "Vidi vian liston de silentigoj" "write:mutes": "Redakti vian liston de silentigoj" "write:notes": "Krei / Forviŝi noton" @@ -406,7 +553,8 @@ _permissions: "read:page-likes": "Vidi ŝatojn de paĝo" "read:channels": "Vidi kanalojn" _antennaSources: - homeTimeline: "Notoj far uzantoj sekvataj de vi" + all: "Ĉiuj notoj" + homeTimeline: "Notoj far uzantoj, kiujn vi sekvas" _weekday: sunday: "dimanĉo" monday: "lundo" @@ -419,15 +567,17 @@ _widgets: notifications: "Sciigoj" timeline: "Templinio" clock: "Horloĝo" - federation: "Konfederacio" + activity: "Aktiveco" + federation: "Kunfederaĵo" slideshow: "Bildoprezento" + button: "Butono" onlineUsers: "Surkonektita uzanto" _cw: show: "Vidu pli" files: "{count} dosiero(j)" _poll: choiceN: "Balotilo {n}" - noMore: "Oni ne plu povas aldoni." + noMore: "Oni ne povas aldoni pli." infinite: "Neniam" deadlineTime: "hor" votesCount: "{n} balotiloj" @@ -438,11 +588,11 @@ _visibility: home: "Hejmo" homeDescription: "Elsendi nur sur la hejmtemplinio" followers: "Sekvantoj" - followersDescription: "Elsendi nur al sekvantoj al mi" + followersDescription: "Nur al sekvantoj al mi" localOnly: "Nur loka" localOnlyDescription: "Ne montri al transaj uzantoj" _postForm: - replyPlaceholder: "Respondado al tiu noto..." + replyPlaceholder: "Respondi al tiu noto..." quotePlaceholder: "Citado tiun noton..." channelPlaceholder: "Sendi sur la kanalo" _profile: @@ -450,16 +600,21 @@ _profile: username: "Uzantnomo" metadataEdit: "Redakti kromaj informoj" changeAvatar: "Ŝanĝi profilbildon" + changeBanner: "Ŝanĝi standardon" _exportOrImport: + allNotes: "Ĉiuj notoj" followingList: "Sekvataj" muteList: "Silentigoj" blockingList: "Blokado" userLists: "Listoj" +_charts: + federationInstancesTotal: "Tuta numero de kunfederantaj ekzemploj" + filesTotal: "Tuta numero de dosieroj" _timelines: home: "Hejmo" local: "Loka" social: "Sociala" - global: "Konfederacia" + global: "Malloka" _rooms: translate: "Movi" chooseImage: "Elekti bildon" @@ -472,18 +627,26 @@ _pages: editThisPage: "Redakti la paĝon" viewPage: "Vidi via paĝojn" my: "Miaj paĝoj" + featured: "Ravaĵoj" content: "Blokado de paĝo" url: "URL de paĝo" + alignCenter: "Centrigi" chooseBlock: "Aldoni blokon" blocks: - image: "Bildoj" + image: "Bildo" + button: "Butono" _post: canvasId: "Kanvasa identigilo" + _numberInput: + text: "Titolo" _canvas: id: "Kanvasa identigilo" _note: id: "Identigilo de noto" + _counter: + text: "Titolo" _button: + text: "Titolo" _action: _pushEvent: event: "Nomo de la evento" @@ -511,21 +674,23 @@ _notification: fileUploaded: "La dosiero sukcese alŝutiĝis." youGotPoll: "{name} balotis" youGotMessagingMessageFromUser: "{name} sentis mesaĝon al vi." - youWereFollowed: "Vin eksekvis" - youReceivedFollowRequest: "Vi ricevis eksekvopeton." - yourFollowRequestAccepted: "Via eksekvopeto estas akceptita." + youGotMessagingMessageFromGroup: "Retbabilan mesaĝon oni sendis al la grupo {name}" + youWereFollowed: "sksekvis vin" + youReceivedFollowRequest: "Vi ricevis peton de sekvado" + yourFollowRequestAccepted: "Via peto por eksekvu estas akceptita." _types: follow: "Sekvatoj" mention: "Mencioj" renote: "Fari renoton" quote: "Citi" reaction: "Reagoj" - receiveFollowRequest: "Eksekvopeto ricevita" - followRequestAccepted: "Eksekvopeto akceptiĝis." + receiveFollowRequest: "Ricevita peton de sekvado" + followRequestAccepted: "Peto por eksekvu akceptita" _deck: profile: "Agordaro" _columns: notifications: "Sciigoj" tl: "Templinio" + antenna: "Antenoj" list: "Listoj" mentions: "Al vi" diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 4a95aae42..9b77a750e 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -91,11 +91,11 @@ followRequests: "Demandes d’abonnement" unfollow: "Se désabonner" followRequestPending: "Demande d'abonnement en attente de confirmation" enterEmoji: "Insérer un émoji" -renote: "Partager" -unrenote: "Annuler le partage" -renoted: "Republié !" -cantRenote: "Ce message ne peut pas être republié." -cantReRenote: "Impossible de repartager un partage." +renote: "Renoter" +unrenote: "Annuler la Renote" +renoted: "Renoté !" +cantRenote: "Ce message ne peut pas être renoté." +cantReRenote: "Impossible de renoter une Renote." quote: "Citer" pinnedNote: "Note épinglée" pinned: "Épingler sur le profil" @@ -638,9 +638,9 @@ manageAccessTokens: "Gérer les jetons d'accès" accountInfo: " Informations du compte " notesCount: "Nombre de notes" repliesCount: "Nombre de réponses envoyées" -renotesCount: "Nombre de notes repartagées" +renotesCount: "Nombre de notes que vous avez renotées" repliedCount: "Nombre de réponses reçues" -renotedCount: "Nombre de Renotes" +renotedCount: "Nombre de vos notes renotées" followingCount: "Nombre de comptes suivis" followersCount: "Nombre d'abonnés" sentReactionsCount: "Nombre de réactions envoyées" @@ -767,14 +767,22 @@ customCssWarn: "Utilisez cette fonctionnalité uniquement si vous savez exacteme global: "Global" squareAvatars: "Avatars carrés" sent: "Envoyer" +searchResult: "Résultats de la recherche" hashtags: "Hashtags" troubleshooting: "Résolution de problèmes" +useBlurEffect: "Utiliser des effets de flou dans l'interface" +learnMore: "Plus d'informations" +misskeyUpdated: "Misskey a été mis à jour !" +whatIsNew: "Voir les derniers changements" +translate: "Traduire" +translatedFrom: "Traduit depuis {x}" _docs: continueReading: "Lire plus" features: "Fonctionnalités" generalTopics: "Sujets généraux" advancedTopics: "Sujets avancés" admin: "Gestion" + translateWarn: "Ceci est une traduction dont le contenu peut différer du texte original." _ad: back: "Retour" reduceFrequencyOfThisAd: "Voir cette publicité moins souvent" @@ -988,7 +996,7 @@ _theme: hashtag: "Hashtags" mention: "Mentionner" mentionMe: "Mentions (Moi)" - renote: "Partager" + renote: "Renoter" modalBg: "Modal d'arrière-plan" divider: "Séparateur" scrollbarHandle: "Poignée de la barre de navigation" diff --git a/locales/id-ID.yml b/locales/id-ID.yml index 6b98b43ca..236bd01ac 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -767,9 +767,21 @@ customCssWarn: "Pengaturan ini seharusnya digunakan jika kamu tahu cara kerjanya global: "Global" squareAvatars: "Tampilkan avatar sebagai persegi" sent: "Kirim" +received: "Diterima" +searchResult: "Hasil Penelusuran" hashtags: "Tagar" +troubleshooting: "Penyelesaian Masalah" +useBlurEffect: "Gunakan efek blur pada antarmuka" +learnMore: "Pelajari lebih lanjut" +misskeyUpdated: "Misskey telah dimutakhirkan!" +whatIsNew: "Lihat perubahan pemutakhiran" _docs: + continueReading: "Baca lebih lanjut" + features: "Fitur" + generalTopics: "Topik umum" + advancedTopics: "Topik tingkat lanjut" admin: "Manajemen" + translateWarn: "Ini merupakan dokumen terjemahan. Konten di dalamnya kemungkinan dapat berbeda dari yang aslinya." _ad: back: "Kembali" reduceFrequencyOfThisAd: "Tampilkan iklan ini lebih sedikit" @@ -868,6 +880,8 @@ _mfm: blurDescription: "Konten dapat diburamkan dengan efek ini. Konten dapat ditampilkan dengan jelas dengan melayangkan kursor tetikus di atasnya." font: "Font" fontDescription: "Setel font yang ditampilkan untuk konten." + rainbow: "Pelangi" + rainbowDescription: "Membuat konten muncul dalam warna pelangi." _reversi: reversi: "Reversi" gameSettings: "Pengaturan permainan" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index be4792401..7499523b0 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -773,6 +773,10 @@ hashtags: "ハッシュタグ" troubleshooting: "トラブルシューティング" useBlurEffect: "UIにぼかし効果を使用" learnMore: "詳しく" +misskeyUpdated: "Misskeyが更新されました!" +whatIsNew: "更新情報を見る" +translate: "翻訳" +translatedFrom: "{x}から翻訳" _docs: continueReading: "続きを読む" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index 80ac48a76..e230594ac 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -7,6 +7,7 @@ search: "探す" notifications: "通知" username: "ユーザー名" password: "パスワード" +forgotPassword: "パスワード忘れてん" fetchingAsApObject: "今ちと連合に照会しとるで" ok: "OKや" gotIt: "ほい" @@ -139,6 +140,7 @@ flagAsBotDescription: "もしこのアカウントがプログラムによって flagAsCat: "Catやで" flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?" autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく" +addAccount: "アカウントを追加" loginFailed: "ログインに失敗してしもうた…" showOnRemote: "リモートで見る" general: "全般" @@ -278,6 +280,7 @@ emptyDrive: "ドライブにはなんも残っとらん" emptyFolder: "ふぉろだーにはなんも残っとらん" unableToDelete: "消そうおもってんけどな、あかんかったわ" inputNewFileName: "今度のファイル名は何にするん?" +inputNewDescription: "新しいキャプションを入力しましょ" inputNewFolderName: "今度のフォルダ名は何にするん?" circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーや。" hasChildFilesOrFolders: "このフォルダ、まだなんか入っとるから消されへん" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index c4cc84caf..99fc0ba6f 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -770,8 +770,13 @@ sent: "전송" received: "수신" searchResult: "검색 결과" hashtags: "해시태그" -troubleshooting: "트러블 슈팅" +troubleshooting: "문제 해결" useBlurEffect: "UI에 흐림 효과 사용" +learnMore: "자세히" +misskeyUpdated: "Misskey가 업데이트 되었습니다!" +whatIsNew: "패치 정보 보기" +translate: "번역" +translatedFrom: "{x}에서 번역" _docs: continueReading: "계속 읽기" features: "기능" diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index b9cfe6f2c..a6e759cc4 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -772,6 +772,9 @@ searchResult: "Результаты поиска" hashtags: "Хэштег" troubleshooting: "Разрешение проблем" useBlurEffect: "Размытие в интерфейсе" +learnMore: "Подробнее" +misskeyUpdated: "Misskey обновился!" +whatIsNew: "Что новенького?" _docs: continueReading: "Читать подробнее" features: "Возможности" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index afe364d4e..aad08d1b4 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -773,6 +773,10 @@ hashtags: "话题标签" troubleshooting: "故障排除" useBlurEffect: "在UI上使用模糊效果" learnMore: "更多信息" +misskeyUpdated: "Misskey更新完成!" +whatIsNew: "显示更新信息" +translate: "翻译" +translatedFrom: "从 {x} 翻译" _docs: continueReading: "继续阅读" features: "特性" diff --git a/migration/1629004542760-chart-reindex.ts b/migration/1629004542760-chart-reindex.ts new file mode 100644 index 000000000..c3d09f51b --- /dev/null +++ b/migration/1629004542760-chart-reindex.ts @@ -0,0 +1,182 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class chartReindex1629004542760 implements MigrationInterface { + name = 'chartReindex1629004542760' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DELETE FROM "__chart__active_users" a USING "__chart__active_users" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__drive" a USING "__chart__drive" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__federation" a USING "__chart__federation" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__hashtag" a USING "__chart__hashtag" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__instance" a USING "__chart__instance" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__network" a USING "__chart__network" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__notes" a USING "__chart__notes" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__per_user_drive" a USING "__chart__per_user_drive" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__per_user_following" a USING "__chart__per_user_following" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__per_user_notes" a USING "__chart__per_user_notes" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__per_user_reaction" a USING "__chart__per_user_reaction" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__test_grouped" a USING "__chart__test_grouped" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__test_unique" a USING "__chart__test_unique" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DELETE FROM "__chart__users" a USING "__chart__users" b WHERE a.id < b.id AND ((a.group IS NULL AND b.group IS NULL) OR a.group = b.group) AND a.date = b.date;`); + await queryRunner.query(`DROP INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc"`); + await queryRunner.query(`DROP INDEX "IDX_00ed5f86db1f7efafb1978bf21"`); + await queryRunner.query(`DROP INDEX "IDX_9a3ed15a30ab7e3a37702e6e08"`); + await queryRunner.query(`DROP INDEX "IDX_13565815f618a1ff53886c5b28"`); + await queryRunner.query(`DROP INDEX "IDX_7a170f67425e62a8fabb76c872"`); + await queryRunner.query(`DROP INDEX "IDX_3313d7288855ec105b5bbf6c21"`); + await queryRunner.query(`DROP INDEX "IDX_36cb699c49580d4e6c2e6159f9"`); + await queryRunner.query(`DROP INDEX "IDX_76e87c7bfc5d925fcbba405d84"`); + await queryRunner.query(`DROP INDEX "IDX_dd907becf76104e4b656659e6b"`); + await queryRunner.query(`DROP INDEX "IDX_07747a1038c05f532a718fe1de"`); + await queryRunner.query(`DROP INDEX "IDX_99a7d2faaef84a6f728d714ad6"`); + await queryRunner.query(`DROP INDEX "IDX_25a97c02003338124b2b75fdbc"`); + await queryRunner.query(`DROP INDEX "IDX_6b8f34a1a64b06014b6fb66824"`); + await queryRunner.query(`DROP INDEX "IDX_da8a46ba84ca1d8bb5a29bfb63"`); + await queryRunner.query(`DROP INDEX "IDX_39ee857ab2f23493037c6b6631"`); + await queryRunner.query(`DROP INDEX "IDX_a1efd3e0048a5f2793a47360dc"`); + await queryRunner.query(`DROP INDEX "IDX_7b5da130992ec9df96712d4290"`); + await queryRunner.query(`DROP INDEX "IDX_0a905b992fecd2b5c3fb98759e"`); + await queryRunner.query(`DROP INDEX "IDX_42eb716a37d381cdf566192b2b"`); + await queryRunner.query(`DROP INDEX "IDX_7036f2957151588b813185c794"`); + await queryRunner.query(`DROP INDEX "IDX_f09d543e3acb16c5976bdb31fa"`); + await queryRunner.query(`DROP INDEX "IDX_5f86db6492274e07c1a3cdf286"`); + await queryRunner.query(`DROP INDEX "IDX_e496ca8096d28f6b9b509264dc"`); + await queryRunner.query(`DROP INDEX "IDX_30bf67687f483ace115c5ca642"`); + await queryRunner.query(`DROP INDEX "IDX_7af07790712aa3438ff6773f3b"`); + await queryRunner.query(`DROP INDEX "IDX_4b3593098b6edc9c5afe36b18b"`); + await queryRunner.query(`DROP INDEX "IDX_b77d4dd9562c3a899d9a286fcd"`); + await queryRunner.query(`DROP INDEX "IDX_84234bd1abb873f07329681c83"`); + await queryRunner.query(`DROP INDEX "IDX_55bf20f366979f2436de99206b"`); + await queryRunner.query(`DROP INDEX "IDX_5048e9daccbbbc6d567bb142d3"`); + await queryRunner.query(`DROP INDEX "IDX_f7bf4c62059764c2c2bb40fdab"`); + await queryRunner.query(`DROP INDEX "IDX_8cf3156fd7a6b15c43459c6e3b"`); + await queryRunner.query(`DROP INDEX "IDX_229a41ad465f9205f1f5703291"`); + await queryRunner.query(`DROP INDEX "IDX_0c641990ecf47d2545df4edb75"`); + await queryRunner.query(`DROP INDEX "IDX_234dff3c0b56a6150b95431ab9"`); + await queryRunner.query(`DROP INDEX "IDX_b14489029e4b3aaf4bba5fb524"`); + await queryRunner.query(`DROP INDEX "IDX_437bab3c6061d90f6bb65fd2cc"`); + await queryRunner.query(`DROP INDEX "IDX_bbfa573a8181018851ed0b6357"`); + await queryRunner.query(`DROP INDEX "IDX_a0cd75442dd10d0643a17c4a49"`); + await queryRunner.query(`DROP INDEX "IDX_b070a906db04b44c67c6c2144d"`); + await queryRunner.query(`DROP INDEX "IDX_d41cce6aee1a50bfc062038f9b"`); + await queryRunner.query(`DROP INDEX "IDX_a319e5dbf47e8a17497623beae"`); + await queryRunner.query(`DROP INDEX "IDX_845254b3eaf708ae8a6cac3026"`); + await queryRunner.query(`DROP INDEX "IDX_ed9b95919c672a13008e9487ee"`); + await queryRunner.query(`DROP INDEX "IDX_337e9599f278bd7537fe30876f"`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_9a3ed15a30ab7e3a37702e6e08" ON "__chart__active_users" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_60c5c6e7e538c09aa274ecd1cf" ON "__chart__active_users" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_3313d7288855ec105b5bbf6c21" ON "__chart__drive" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_ceab80a6729f8e2e6f5b8a1a3d" ON "__chart__drive" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_dd907becf76104e4b656659e6b" ON "__chart__federation" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_eddfed8fb40305a04c6f941050" ON "__chart__federation" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_25a97c02003338124b2b75fdbc" ON "__chart__hashtag" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_53a3604b939e2b479eb2cfaac8" ON "__chart__hashtag" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_39ee857ab2f23493037c6b6631" ON "__chart__instance" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_8111b817b9818c04d7eb8475b1" ON "__chart__instance" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_0a905b992fecd2b5c3fb98759e" ON "__chart__network" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_2082327b2699ce924fa654afc5" ON "__chart__network" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_f09d543e3acb16c5976bdb31fa" ON "__chart__notes" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_e60c358aaced5aab8900a4af31" ON "__chart__notes" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_30bf67687f483ace115c5ca642" ON "__chart__per_user_drive" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a9a806d466b314f253a1a611c4" ON "__chart__per_user_drive" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_b77d4dd9562c3a899d9a286fcd" ON "__chart__per_user_following" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_dabbb38a51ab86ee3cab291326" ON "__chart__per_user_following" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_5048e9daccbbbc6d567bb142d3" ON "__chart__per_user_notes" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_583a157ed0cf0ed1b5ec2a833f" ON "__chart__per_user_notes" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_229a41ad465f9205f1f5703291" ON "__chart__per_user_reaction" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_3b7697a96f522d0478972e6d6f" ON "__chart__per_user_reaction" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_b14489029e4b3aaf4bba5fb524" ON "__chart__test_grouped" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_da522b4008a9f5d7743b87ad55" ON "__chart__test_grouped" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a0cd75442dd10d0643a17c4a49" ON "__chart__test_unique" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_16effb2e888f6763673b579f80" ON "__chart__test_unique" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a319e5dbf47e8a17497623beae" ON "__chart__test" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_dab383a36f3c9db4a0c9b02cf3" ON "__chart__test" ("date") WHERE "group" IS NULL`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_337e9599f278bd7537fe30876f" ON "__chart__users" ("date", "group") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_66feba81e1795d176d06c0b1e6" ON "__chart__users" ("date") WHERE "group" IS NULL`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "IDX_66feba81e1795d176d06c0b1e6"`); + await queryRunner.query(`DROP INDEX "IDX_337e9599f278bd7537fe30876f"`); + await queryRunner.query(`DROP INDEX "IDX_dab383a36f3c9db4a0c9b02cf3"`); + await queryRunner.query(`DROP INDEX "IDX_a319e5dbf47e8a17497623beae"`); + await queryRunner.query(`DROP INDEX "IDX_16effb2e888f6763673b579f80"`); + await queryRunner.query(`DROP INDEX "IDX_a0cd75442dd10d0643a17c4a49"`); + await queryRunner.query(`DROP INDEX "IDX_da522b4008a9f5d7743b87ad55"`); + await queryRunner.query(`DROP INDEX "IDX_b14489029e4b3aaf4bba5fb524"`); + await queryRunner.query(`DROP INDEX "IDX_3b7697a96f522d0478972e6d6f"`); + await queryRunner.query(`DROP INDEX "IDX_229a41ad465f9205f1f5703291"`); + await queryRunner.query(`DROP INDEX "IDX_583a157ed0cf0ed1b5ec2a833f"`); + await queryRunner.query(`DROP INDEX "IDX_5048e9daccbbbc6d567bb142d3"`); + await queryRunner.query(`DROP INDEX "IDX_dabbb38a51ab86ee3cab291326"`); + await queryRunner.query(`DROP INDEX "IDX_b77d4dd9562c3a899d9a286fcd"`); + await queryRunner.query(`DROP INDEX "IDX_a9a806d466b314f253a1a611c4"`); + await queryRunner.query(`DROP INDEX "IDX_30bf67687f483ace115c5ca642"`); + await queryRunner.query(`DROP INDEX "IDX_e60c358aaced5aab8900a4af31"`); + await queryRunner.query(`DROP INDEX "IDX_f09d543e3acb16c5976bdb31fa"`); + await queryRunner.query(`DROP INDEX "IDX_2082327b2699ce924fa654afc5"`); + await queryRunner.query(`DROP INDEX "IDX_0a905b992fecd2b5c3fb98759e"`); + await queryRunner.query(`DROP INDEX "IDX_8111b817b9818c04d7eb8475b1"`); + await queryRunner.query(`DROP INDEX "IDX_39ee857ab2f23493037c6b6631"`); + await queryRunner.query(`DROP INDEX "IDX_53a3604b939e2b479eb2cfaac8"`); + await queryRunner.query(`DROP INDEX "IDX_25a97c02003338124b2b75fdbc"`); + await queryRunner.query(`DROP INDEX "IDX_eddfed8fb40305a04c6f941050"`); + await queryRunner.query(`DROP INDEX "IDX_dd907becf76104e4b656659e6b"`); + await queryRunner.query(`DROP INDEX "IDX_ceab80a6729f8e2e6f5b8a1a3d"`); + await queryRunner.query(`DROP INDEX "IDX_3313d7288855ec105b5bbf6c21"`); + await queryRunner.query(`DROP INDEX "IDX_60c5c6e7e538c09aa274ecd1cf"`); + await queryRunner.query(`DROP INDEX "IDX_9a3ed15a30ab7e3a37702e6e08"`); + await queryRunner.query(`DROP INDEX "IDX_a9021cc2e1feb5f72d3db6e9f5"`); + await queryRunner.query(`DROP INDEX "IDX_f22169eb10657bded6d875ac8f"`); + await queryRunner.query(`DROP INDEX "IDX_c8cc87bd0f2f4487d17c651fbf"`); + await queryRunner.query(`DROP INDEX "IDX_754499f9b2642336433769518d"`); + await queryRunner.query(`DROP INDEX "IDX_315c779174fe8247ab324f036e"`); + await queryRunner.query(`DROP INDEX "IDX_c5d46cbfda48b1c33ed852e21b"`); + await queryRunner.query(`CREATE INDEX "IDX_337e9599f278bd7537fe30876f" ON "__chart__users" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_ed9b95919c672a13008e9487ee" ON "__chart__users" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_845254b3eaf708ae8a6cac3026" ON "__chart__users" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_a319e5dbf47e8a17497623beae" ON "__chart__test" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_d41cce6aee1a50bfc062038f9b" ON "__chart__test" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_b070a906db04b44c67c6c2144d" ON "__chart__test" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_a0cd75442dd10d0643a17c4a49" ON "__chart__test_unique" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_bbfa573a8181018851ed0b6357" ON "__chart__test_unique" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_437bab3c6061d90f6bb65fd2cc" ON "__chart__test_unique" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_b14489029e4b3aaf4bba5fb524" ON "__chart__test_grouped" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_234dff3c0b56a6150b95431ab9" ON "__chart__test_grouped" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_0c641990ecf47d2545df4edb75" ON "__chart__test_grouped" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_229a41ad465f9205f1f5703291" ON "__chart__per_user_reaction" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_8cf3156fd7a6b15c43459c6e3b" ON "__chart__per_user_reaction" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_f7bf4c62059764c2c2bb40fdab" ON "__chart__per_user_reaction" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_5048e9daccbbbc6d567bb142d3" ON "__chart__per_user_notes" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_55bf20f366979f2436de99206b" ON "__chart__per_user_notes" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_84234bd1abb873f07329681c83" ON "__chart__per_user_notes" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_b77d4dd9562c3a899d9a286fcd" ON "__chart__per_user_following" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_4b3593098b6edc9c5afe36b18b" ON "__chart__per_user_following" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_7af07790712aa3438ff6773f3b" ON "__chart__per_user_following" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_30bf67687f483ace115c5ca642" ON "__chart__per_user_drive" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_e496ca8096d28f6b9b509264dc" ON "__chart__per_user_drive" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_5f86db6492274e07c1a3cdf286" ON "__chart__per_user_drive" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_f09d543e3acb16c5976bdb31fa" ON "__chart__notes" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_7036f2957151588b813185c794" ON "__chart__notes" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_42eb716a37d381cdf566192b2b" ON "__chart__notes" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_0a905b992fecd2b5c3fb98759e" ON "__chart__network" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_7b5da130992ec9df96712d4290" ON "__chart__network" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_a1efd3e0048a5f2793a47360dc" ON "__chart__network" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_39ee857ab2f23493037c6b6631" ON "__chart__instance" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_da8a46ba84ca1d8bb5a29bfb63" ON "__chart__instance" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_6b8f34a1a64b06014b6fb66824" ON "__chart__instance" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_25a97c02003338124b2b75fdbc" ON "__chart__hashtag" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_99a7d2faaef84a6f728d714ad6" ON "__chart__hashtag" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_07747a1038c05f532a718fe1de" ON "__chart__hashtag" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_dd907becf76104e4b656659e6b" ON "__chart__federation" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_76e87c7bfc5d925fcbba405d84" ON "__chart__federation" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_36cb699c49580d4e6c2e6159f9" ON "__chart__federation" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_3313d7288855ec105b5bbf6c21" ON "__chart__drive" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_7a170f67425e62a8fabb76c872" ON "__chart__drive" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_13565815f618a1ff53886c5b28" ON "__chart__drive" ("date") `); + await queryRunner.query(`CREATE INDEX "IDX_9a3ed15a30ab7e3a37702e6e08" ON "__chart__active_users" ("date", "group") `); + await queryRunner.query(`CREATE INDEX "IDX_00ed5f86db1f7efafb1978bf21" ON "__chart__active_users" ("group") `); + await queryRunner.query(`CREATE INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc" ON "__chart__active_users" ("date") `); + } + +} diff --git a/migration/1629024377804-deepl-integration.ts b/migration/1629024377804-deepl-integration.ts new file mode 100644 index 000000000..639f947c7 --- /dev/null +++ b/migration/1629024377804-deepl-integration.ts @@ -0,0 +1,14 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class deeplIntegration1629024377804 implements MigrationInterface { + name = 'deeplIntegration1629024377804' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "meta" ADD "deeplAuthKey" character varying(128)`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "deeplAuthKey"`); + } + +} diff --git a/package.json b/package.json index 1db104477..1f7d570f5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo ", - "version": "12.87.0", + "version": "12.88.0", "codename": "indigo", "repository": { "type": "git", @@ -11,6 +11,7 @@ "private": true, "scripts": { "start": "node ./index.js", + "start:test": "cross-env NODE_ENV=test node ./index.js", "init": "npm run migrate", "ormconfig": "node ./built/ormconfig.js", "migrate": "ts-node ./node_modules/typeorm/cli.js migration:run", @@ -26,6 +27,9 @@ "clean": "gulp clean", "cleanall": "gulp cleanall", "lint": "tslint 'src/**/*.ts'", + "cy:open": "cypress open", + "cy:run": "cypress run", + "e2e": "start-server-and-test start:test http://localhost cy:run", "test": "cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha", "format": "gulp format" }, @@ -101,7 +105,7 @@ "@types/websocket": "1.0.4", "@types/ws": "7.4.7", "@typescript-eslint/parser": "4.29.1", - "@vue/compiler-sfc": "3.2.2", + "@vue/compiler-sfc": "3.2.3", "abort-controller": "3.0.0", "apexcharts": "3.27.3", "autobind-decorator": "2.4.0", @@ -112,12 +116,14 @@ "blurhash": "1.1.3", "broadcast-channel": "3.7.0", "bull": "3.26.0", + "cacheable-lookup": "6.0.0", "cafy": "15.2.1", "cbor": "8.0.0", "chalk": "4.1.2", "chart.js": "2.9.4", "cli-highlight": "2.1.11", "commander": "7.2.0", + "compare-versions": "3.6.0", "concurrently": "6.2.0", "content-disposition": "0.5.3", "core-js": "3.16.1", @@ -142,10 +148,9 @@ "gulp-terser": "2.0.1", "gulp-tslint": "8.1.4", "hard-source-webpack-plugin": "0.13.1", + "hpagent": "0.1.2", "html-minifier": "4.0.0", - "http-proxy-agent": "4.0.1", "http-signature": "1.3.5", - "https-proxy-agent": "5.0.0", "idb-keyval": "5.1.3", "insert-text-at-cursor": "0.3.0", "is-root": "2.1.0", @@ -167,7 +172,6 @@ "koa-slow": "2.1.0", "koa-views": "7.0.1", "langmap": "0.0.16", - "lookup-dns-cache": "2.1.0", "markdown-it": "12.2.0", "markdown-it-anchor": "7.1.0", "matter-js": "0.17.1", @@ -238,7 +242,7 @@ "uuid": "8.3.2", "v-debounce": "0.1.2", "vanilla-tilt": "1.7.1", - "vue": "3.2.2", + "vue": "3.2.3", "vue-color": "2.8.1", "vue-json-pretty": "1.8.1", "vue-loader": "16.5.0", @@ -259,6 +263,8 @@ "@types/chai": "4.2.16", "@types/fluent-ffmpeg": "2.1.17", "chai": "4.3.4", - "cross-env": "7.0.3" + "cross-env": "7.0.3", + "cypress": "8.2.0", + "start-server-and-test": "1.13.1" } } diff --git a/src/@types/lookup-dns-cache.d.ts b/src/@types/lookup-dns-cache.d.ts deleted file mode 100644 index bae9df5fa..000000000 --- a/src/@types/lookup-dns-cache.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare module 'lookup-dns-cache' { - import { LookupOneOptions, LookupAllOptions, LookupOptions, LookupAddress } from 'dns'; - - function lookup(hostname: string, family: number, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void; - function lookup(hostname: string, options: LookupOneOptions, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void; - function lookup(hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException | null, addresses: LookupAddress[]) => void): void; - function lookup(hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException | null, address: string | LookupAddress[], family: number) => void): void; - function lookup(hostname: string, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void): void; -} diff --git a/src/argv.ts b/src/argv.ts index ae6396129..8e00bcf47 100644 --- a/src/argv.ts +++ b/src/argv.ts @@ -18,7 +18,7 @@ program 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.quiet = true; if (process.env.NODE_ENV === 'test') program.noDaemons = true; export { program }; diff --git a/src/client/components/date-separated-list.vue b/src/client/components/date-separated-list.vue index 7a4cc5ef9..fa0b6d669 100644 --- a/src/client/components/date-separated-list.vue +++ b/src/client/components/date-separated-list.vue @@ -93,13 +93,13 @@ export default defineComponent({ }); return h(this.$store.state.animation ? TransitionGroup : 'div', this.$store.state.animation ? { - class: 'sqadhkmv' + (this.noGap ? ' noGap _block' : ''), + class: 'sqadhkmv' + (this.noGap ? ' noGap' : ''), name: 'list', tag: 'div', 'data-direction': this.direction, 'data-reversed': this.reversed ? 'true' : 'false', } : { - class: 'sqadhkmv' + (this.noGap ? ' noGap _block' : ''), + class: 'sqadhkmv' + (this.noGap ? ' noGap' : ''), }, { default: renderChildren }); diff --git a/src/client/components/global/loading.vue b/src/client/components/global/loading.vue index 9b810f0a1..7bde53c12 100644 --- a/src/client/components/global/loading.vue +++ b/src/client/components/global/loading.vue @@ -1,5 +1,5 @@ @@ -18,7 +18,12 @@ export default defineComponent({ type: Boolean, required: false, default: true - } + }, + mini: { + type: Boolean, + required: false, + default: false + }, } }); @@ -38,6 +43,8 @@ export default defineComponent({ text-align: center; cursor: wait; + --size: 48px; + &.colored { color: var(--accent); } @@ -45,19 +52,12 @@ export default defineComponent({ &.inline { display: inline; padding: 0; + --size: 32px; + } - > .ring:after { - width: 32px; - height: 32px; - } - - > .ring { - &:before, - &:after { - width: 32px; - height: 32px; - } - } + &.mini { + padding: 16px; + --size: 32px; } > .ring { @@ -70,8 +70,8 @@ export default defineComponent({ content: " "; display: block; box-sizing: border-box; - width: 48px; - height: 48px; + width: var(--size); + height: var(--size); border-radius: 50%; border: solid 4px; } diff --git a/src/client/components/note-detailed.vue b/src/client/components/note-detailed.vue index d60105292..e7f116d1f 100644 --- a/src/client/components/note-detailed.vue +++ b/src/client/components/note-detailed.vue @@ -1,6 +1,6 @@