diff --git a/.dockerignore b/.dockerignore index 7cef84d94..9ed558a25 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,6 +2,7 @@ .github .travis .vscode +.config Dockerfile build/ built/ diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 000000000..1c6ad343e --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,32 @@ +name: Publish Docker image + +on: + release: + types: [published] + 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: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.gitignore b/.gitignore index 0786295cf..f8baa4384 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,10 @@ /node_modules report.*.json +# Cypress +cypress/screenshots +cypress/videos + # config /.config/* !/.config/example.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bf00b64e..f8331854c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,28 @@ --> +## 12.91.0 (2021/09/22) + +### Improvements +- ActivityPub: リモートユーザーのDeleteアクティビティに対応 +- ActivityPub: add resolver check for blocked instance +- ActivityPub: deliverキューのメモリ使用量を削減 +- API: 管理者用アカウント削除APIを実装(/admin/accounts/delete) + - リモートユーザーの削除も可能に +- アカウントが凍結された場合に、凍結された旨を表示してからログアウトするように +- 凍結されたアカウントにログインしようとしたときに、凍結されている旨を表示するように +- リスト、アンテナタイムラインを個別ページとして分割 +- UIの改善 +- MFMにsparklesエフェクトを追加 +- 非ログイン自は更新ダイアログを出さないように +- クライアント起動時、アップデートが利用可能な場合エラー表示およびダイアログ表示しないように + +### Bugfixes +- アカウントデータのエクスポート/インポート処理ができない問題を修正 +- アンテナの既読が付かない問題を修正 +- popupで設定ページを表示すると、アカウントの削除ページにアクセスすることができない問題を修正 +- "問題が発生しました"ウィンドウを開くと☓ボタンがなくて閉じれない問題を修正 + ## 12.90.1 (2021/09/05) ### Bugfixes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ca0a841cc..72a7dc4b1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,42 +1,44 @@ # Contribution guide -**[✨ English version available](/docs/CONTRIBUTING.en.md)** +We're glad you're interested in contributing Misskey! In this document you will find the information you need to contribute to the project. -プロジェクトに興味を持っていただきありがとうございます! このドキュメントでは、プロジェクトに貢献する際に必要な情報をまとめています。 +**ℹ️ Important:** This project uses Japanese as its major language, **but you do not need to translate and write the Issues/PRs in Japanese.** +Also, you might receive comments on your Issue/PR in Japanese, but you do not need to reply to them in Japanese as well.\ +The accuracy of translation into Japanese is not high, so it will be easier for us to understand if you write it in the original language. +It will also allow the reader to use the translation tool of their preference if necessary. ## Issues -Issueを作成する前に、以下をご確認ください: -- 重複を防ぐため、既に同様の内容のIssueが作成されていないか検索してから新しいIssueを作ってください。 -- Issueを質問に使わないでください。 - - Issueは、要望、提案、問題の報告にのみ使用してください。 - - 質問は、[Misskey Forum](https://forum.misskey.io/)や[Discord](https://discord.gg/Wp8gVStHW3)でお願いします。 +Before creating an issue, please check the following: +- To avoid duplication, please search for similar issues before creating a new issue. +- Do not use Issues as a question. + - Issues should only be used to feature requests, suggestions, and report problems. + - Please ask questions in the [Misskey Forum](https://forum.misskey.io/) or [Discord](https://discord.gg/Wp8gVStHW3). -## 実装をする前に -機能追加やバグ修正をしたいときは、まずIssueで設計、方針をレビューしてもらいましょう(無い場合は作ってください)。このステップがないと、せっかく実装してもPRがマージされない可能性が高くなります。 +## Before implementation +When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented. -また、実装に取り掛かるときは当該Issueに自分をアサインしてください(自分でできない場合は他メンバーに自分をアサインしてもらうようお願いしてください)。 -自分が実装するという意思表示をすることで、作業がバッティングするのを防ぎます。 +Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work. -## PRの作成 -PRありがとうございます! PRを作成する前に、以下をご確認ください: -- 可能であればタイトルに、以下で示すようなPRの種類が分かるキーワードをプリフィクスしてください。 - - `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` など - - また、PRの粒度が適切であることを確認してください。ひとつのPRに複数の種類の変更や関心を含めることは避けてください。 -- このPRによって解決されるIssueがある場合は、そのIssueへの参照を本文内に含めてください。 -- [`CHANGELOG.md`](/CHANGELOG.md)に変更点を追記してください。リファクタリングなど、利用者に影響を与えない変更についてはこの限りではありません。 -- この変更により新たに作成、もしくは更新すべきドキュメントがないか確認してください。 -- 機能追加やバグ修正をした場合は、可能であればテストケースを追加してください。 -- テスト、Lintが通っていることを予め確認してください。 - - `npm run test`、`npm run lint`でぞれぞれ実施可能です。[詳細](#testing) -- UIに変更がある場合はスクリーンショットを本文内に添付してください。 - -ご協力ありがとうございます🤗 - -## ブランチ +## Well-known branches - **`master`** branch is tracking the latest release and used for production purposes. - **`develop`** branch is where we work for the next release. - - PRを作成するときは、基本的にこのブランチに向けてください。 + - When you create a PR, basically target it to this branch. - **`l10n_develop`** branch is reserved for localization management. +## Creating a PR +Thank you for your PR! Before creating a PR, please check the following: +- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below. + - `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc + - Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR. +- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text. +- Please add the summary of the changes to [`CHANGELOG.md`](/CHANGELOG.md). However, this is not necessary for changes that do not affect the users, such as refactoring. +- Check if there are any documents that need to be created or updated due to this change. +- If you have added a feature or fixed a bug, please add a test case if possible. +- Please make sure that tests and Lint are passed in advance. + - You can run it with `npm run test` and `npm run lint`. [See more info](#testing) +- If this PR includes UI changes, please attach a screenshot in the text. + +Thanks for your cooperation 🤗 + ## Localization (l10n) Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management. You can improve our translations with your Crowdin account. diff --git a/README.md b/README.md index 816765af6..0aae1b332 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,12 @@ Related projects - [misskey.js](https://github.com/misskey-dev/misskey.js) - Misskey SDK for JavaScript - [mfm.js](https://github.com/misskey-dev/mfm.js) - MFM parser +Sponsors +---------------------------------------------------------------- +
+ RSS3 +
+ :heart: Backers ---------------------------------------------------------------- diff --git a/assets/client/sparkle-spritesheet.png b/assets/client/sparkle-spritesheet.png new file mode 100644 index 000000000..0defccaf0 Binary files /dev/null and b/assets/client/sparkle-spritesheet.png differ diff --git a/cypress/integration/basic.js b/cypress/integration/basic.js index 69d59bc2c..182f70ff6 100644 --- a/cypress/integration/basic.js +++ b/cypress/integration/basic.js @@ -1,10 +1,14 @@ -describe('Basic', () => { - before(() => { - cy.request('POST', '/api/reset-db'); +describe('Before setup instance', () => { + beforeEach(() => { + cy.request('POST', '/api/reset-db').as('reset'); + cy.get('@reset').its('status').should('equal', 204); + cy.reload(true); }); - beforeEach(() => { - cy.reload(true); + afterEach(() => { + // テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。 + // waitを入れることでそれを防止できる + cy.wait(1000); }); it('successfully loads', () => { @@ -14,56 +18,172 @@ describe('Basic', () => { it('setup instance', () => { cy.visit('/'); + cy.intercept('POST', '/api/admin/accounts/create').as('signup'); + 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(); + + // なぜか動かない + //cy.wait('@signup').should('have.property', 'response.statusCode'); + cy.wait('@signup'); + }); +}); + +describe('After setup instance', () => { + beforeEach(() => { + cy.request('POST', '/api/reset-db').as('reset'); + cy.get('@reset').its('status').should('equal', 204); + cy.reload(true); + + // インスタンス初期セットアップ + cy.request('POST', '/api/admin/accounts/create', { + username: 'admin', + password: 'pass', + }).its('body').as('admin'); + + cy.get('@admin'); + }); + + afterEach(() => { + // テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。 + // waitを入れることでそれを防止できる + cy.wait(1000); + }); + + it('successfully loads', () => { + cy.visit('/'); }); it('signup', () => { - cy.visit('/'); + cy.visit('/'); + + cy.intercept('POST', '/api/signup').as('signup'); 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(); + + cy.wait('@signup'); + }); +}); + +describe('After user signup', () => { + beforeEach(() => { + cy.request('POST', '/api/reset-db').as('reset'); + cy.get('@reset').its('status').should('equal', 204); + cy.reload(true); + + // インスタンス初期セットアップ + cy.request('POST', '/api/admin/accounts/create', { + username: 'admin', + password: 'pass', + }).its('body').as('admin'); + + cy.get('@admin').then(() => { + // ユーザー作成 + cy.request('POST', '/api/signup', { + username: 'alice', + password: 'alice1234', + }).its('body').as('alice'); + }); + + cy.get('@alice'); + }); + + afterEach(() => { + // テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。 + // waitを入れることでそれを防止できる + cy.wait(1000); + }); + + it('successfully loads', () => { + cy.visit('/'); }); it('signin', () => { - cy.visit('/'); + cy.visit('/'); + + cy.intercept('POST', '/api/signin').as('signin'); 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}'); + + cy.wait('@signin'); + }); + + it('suspend', function() { + cy.request('POST', '/api/admin/suspend-user', { + i: this.admin.token, + userId: this.alice.id, + }); + + cy.visit('/'); + + cy.get('[data-cy-signin]').click(); + cy.get('[data-cy-signin-username] input').type('alice'); + cy.get('[data-cy-signin-password] input').type('alice1234{enter}'); + + cy.contains('アカウントが凍結されています'); + }); +}); + +describe('After user singed in', () => { + beforeEach(() => { + cy.request('POST', '/api/reset-db').as('reset'); + cy.get('@reset').its('status').should('equal', 204); + cy.reload(true); + + // インスタンス初期セットアップ + cy.request('POST', '/api/admin/accounts/create', { + username: 'admin', + password: 'pass', + }).its('body').as('admin'); + + cy.get('@admin').then(() => { + // ユーザー作成 + cy.request('POST', '/api/signup', { + username: 'alice', + password: 'alice1234', + }).its('body').as('alice'); + }); + + cy.get('@alice').then(() => { + cy.visit('/'); + + cy.intercept('POST', '/api/signin').as('signin'); + + cy.get('[data-cy-signin]').click(); + cy.get('[data-cy-signin-username] input').type('alice'); + cy.get('[data-cy-signin-password] input').type('alice1234{enter}'); + + cy.wait('@signin').as('signedIn'); + }); + + cy.get('@signedIn'); + }); + + afterEach(() => { + // テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。 + // waitを入れることでそれを防止できる + cy.wait(1000); + }); + + it('successfully loads', () => { + cy.visit('/'); }); 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: 投稿した文字列が画面内にあるか(=タイムラインに流れてきたか)のテスト + cy.contains('Hello, Misskey!'); }); }); diff --git a/docker-compose.yml b/docker-compose.yml index df648d291..717b756c7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,6 +15,7 @@ services: - external_network volumes: - ./files:/misskey/files + - ./.config:/misskey/.config:ro redis: restart: always diff --git a/docs/CONTRIBUTING.en.md b/docs/CONTRIBUTING.en.md deleted file mode 100644 index 21f2b591f..000000000 --- a/docs/CONTRIBUTING.en.md +++ /dev/null @@ -1,66 +0,0 @@ -# Contribution guide -:v: Thanks for your contributions :v: - -**ℹ️ Important:** This project uses Japanese as its major language, **but you do not need to translate and write the Issues/PRs in Japanese.** -Also, you might receive comments on your Issue/PR in Japanese, but you do not need to reply to them in Japanese as well.\ -The accuracy of translation into Japanese is not high, so it will be easier for us to understand if you write it in the original language. -It will also allow the reader to use the translation tool of their preference if necessary. - -## Issues -Before creating an issue, please check the following: -- To avoid duplication, please search for similar issues before creating a new issue. -- Do not use Issues as a question. - - Issues should only be used to feature requests, suggestions, and report problems. - - Please ask questions in the [Misskey Forum](https://forum.misskey.io/) or [Discord](https://discord.gg/Wp8gVStHW3). - -## Before implementation -When you want to add a feature or fix a bug, first have the design and policy reviewed in an Issue (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented. - -Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work. - -## Well-known branches -- **`master`** branch is tracking the latest release and used for production purposes. -- **`develop`** branch is where we work for the next release. - - When you create a PR, basically target it to this branch. -- **`l10n_develop`** branch is reserved for localization management. - -## Creating a PR -Thank you for your PR! Before creating a PR, please check the following: -- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below. - - `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc - - Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR. -- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text. -- Please add the summary of the changes to [`CHANGELOG.md`](/CHANGELOG.md). However, this is not necessary for changes that do not affect the users, such as refactoring. -- Check if there are any documents that need to be created or updated due to this change. -- If you have added a feature or fixed a bug, please add a test case if possible. -- Please make sure that tests and Lint are passed in advance. - - You can run it with `npm run test` and `npm run lint`. [See more info](#testing) -- If this PR includes UI changes, please attach a screenshot in the text. - -Thanks for your cooperation 🤗 - -## Localization (l10n) -Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management. -You can improve our translations with your Crowdin account. -Your changes in Crowdin are automatically submitted as a PR (with the title "New Crowdin translations") to the repository. -The owner [@syuilo](https://github.com/syuilo) merges the PR into the develop branch before the next release. - -If your language is not listed in Crowdin, please open an issue. - -![Crowdin](https://d322cqt584bo4o.cloudfront.net/misskey/localized.svg) - -## Testing -- Test codes are located in [`/test`](/test). - -### Run test -``` -npm run test -``` - -#### Run specify test -``` -npx cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" npx mocha test/foo.ts --require ts-node/register -``` - -### e2e tests -TODO diff --git a/docs/push-docker-hub.ja.md b/docs/push-docker-hub.ja.md new file mode 100644 index 000000000..923e4c16e --- /dev/null +++ b/docs/push-docker-hub.ja.md @@ -0,0 +1,28 @@ +GitHub Actionsを使用してDocker Hubへpushする方法 +================================================================ + +[/.github/workflows/docker.yml](/.github/workflows/docker.yml) に +GitHub ActionによりDocker Hubへpushするワークフローが記述されています。 + +オリジナルリポジトリでは、リリースされたタイミングで `latest`, `<リリース名>` それぞれのタグでDocker Hubにpushされます。 +※ Docker Hub に`<ブランチ名>`のようなタグがあるかもしれませんが、こちらは自動push対象ではありません。 + +Fork先でこのワークフローを実行すると失敗します。 + +以下では、Fork先で自分のDocker Hubリポジトリにpushするようにする方法を記述します。 + +## 自分のDocker Hubリポジトリにpushするように設定する方法 + +1. Docker Hubでリポジトリを作成します。 +2. ワークフローファイルの [images](https://github.com/misskey-dev/misskey/blob/53f3b779bf16abcda4f6e026c51384f3b8fbcc62/.github/workflows/docker.yml#L20) を作成したリポジトリに置き換えます。 +3. GitHubにて [暗号化されたシークレット](https://docs.github.com/ja/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository) を作成します。 + 作成が必要なのは `DOCKER_USERNAME` と `DOCKER_PASSWORD` で、それぞれDocker Hubのユーザーとパスワードになります。 + +## pushする方法 + +上記設定によりリリース時に自動的にDocker Hubにpushされるようになります。 +具体的には、GitHubのリリース機能でリリースしたタイミングで `latest`, `<リリース名>` それぞれのタグでDocker Hubにpushされます。 + +また、GitHub上から手動でpushすることも出来ます。 +それを行うには、Actions => Publish Docker image => Run workflow からbranchを選択してワークフローを実行します。 +ただし、この場合作成されるタグは`<ブランチ名>`になります。 diff --git a/locales/de-DE.yml b/locales/de-DE.yml index c5ce70dd6..8f7a4c24e 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -529,6 +529,8 @@ removeAllFollowing: "Allen gefolgten Benutzern entfolgen" removeAllFollowingDescription: "Dies entfolgt allen Benutzerkonten von {host}. Bitte führe dies durch, falls diese Instanz z.B. nicht mehr existiert." userSuspended: "Dieser Benutzer wurde gesperrt." userSilenced: "Dieser Benutzer wurde instanzweit stummgeschaltet." +yourAccountSuspendedTitle: "Dieses Benutzerkonto ist gesperrt" +yourAccountSuspendedDescription: "Dieses Benutzerkonto wurde gesperrt, da es gegen die Nutzungsbedingungen dieses Servers verstoßen hat. Trete mit dem Betreiber in Kontakt, falls du weitere Details erfahren möchtest. Bitte erstelle kein neues Benutzerkonto." menu: "Menü" divider: "Trenner" addItem: "Element hinzufügen" @@ -748,7 +750,7 @@ switch: "Wechseln" noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert." noBotProtectionWarning: "Bot-Schutz ist nicht konfiguriert." configure: "Konfigurieren" -postToGallery: "Beitrag zu Galerie hinzufügen" +postToGallery: "Neuen Galerie-Beitrag erstellen" gallery: "Galerie" recentPosts: "Neue Beiträge" popularPosts: "Beliebte Beiträge" @@ -874,19 +876,19 @@ _mfm: flip: "Spiegelung" flipDescription: "Inhalt horizontal oder vertikal gespiegelt anzeigen." jelly: "Animation (Dehnen)" - jellyDescription: "Verleiht eine sich dehnende Animation." + jellyDescription: "Verleiht dem Inhalt eine sich dehnende Animation." tada: "Animation (Tada)" tadaDescription: "Verleiht eine Animation mit \"Tada!\"-Gefühl" jump: "Animation (Sprung)" - jumpDescription: "Verleiht eine springende Animation." + jumpDescription: "Verleiht dem Inhalt eine springende Animation." bounce: "Animation (Federn)" - bounceDescription: "Verleiht eine federnde Animation." + bounceDescription: "Verleiht dem Inhalt eine federnde Animation." shake: "Animation (Zittern)" - shakeDescription: "Verleiht eine zitternde Animation." + shakeDescription: "Verleiht dem Inhalt eine zitternde Animation." twitch: "Animation (Zucken)" - twitchDescription: "Verleiht eine sehr stark zuckende Animation." + twitchDescription: "Verleiht dem Inhalt eine sehr stark zuckende Animation." spin: "Animation (Rotieren)" - spinDescription: "Verleiht eine rotierende Animation." + spinDescription: "Verleiht dem Inhalt eine rotierende Animation." x2: "Groß" x2Description: "Inhalte größer anzeigen." x3: "Sehr groß" @@ -1125,6 +1127,10 @@ _permissions: "write:user-groups": "Benutzergruppen bearbeiten oder löschen" "read:channels": "Kanäle lesen" "write:channels": "Kanäle bedienen" + "read:gallery": "Beiträge deiner Galerie lesen" + "write:gallery": "Deine Galerie bearbeiten" + "read:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge lesen" + "write:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge bearbeiten" _auth: shareAccess: "Möchtest du \"{name}\" authorisieren, auf dieses Benuzerkonto zugreifen zu können?" shareAccessAsk: "Bist du dir sicher, dass du diese Anwendung authorisieren möchtest, auf dein Benutzerkonto zugreifen zu können?" diff --git a/locales/en-US.yml b/locales/en-US.yml index 5d33e35f5..4e843ce06 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 is happening now, or to share it 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 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! 🚀" monthAndDay: "{month}/{day}" search: "Search" notifications: "Notifications" @@ -92,7 +92,7 @@ unfollow: "Unfollow" followRequestPending: "Pending follow request" enterEmoji: "Enter an emoji" renote: "Renote" -unrenote: "Take back Renote" +unrenote: "Take back renote" renoted: "Renoted." cantRenote: "This post can't be renoted." cantReRenote: "A renote can't be renoted." @@ -136,7 +136,7 @@ settingGuide: "Recommended settings" cacheRemoteFiles: "Cache remote files" cacheRemoteFilesDescription: "When this setting is disabled, remote files are loaded directly from the remote instance. Disabling this will decrease storage usage, but increase traffic, as thumbnails will not be generated." flagAsBot: "Mark this account as as bot" -flagAsBotDescription: "Enable this option if this account is controlled by a program. If enabled, it will act as flag for other developers to prevent endless interaction chains with other bots and adjust Misskey's internal systems to treat this account as a bot." +flagAsBotDescription: "Enable this option if this account is controlled by a program. If enabled, it will act as a flag for other developers to prevent endless interaction chains with other bots and adjust Misskey's internal systems to treat this account as a bot." flagAsCat: "Mark this account as a cat" flagAsCatDescription: "Enable this option to mark this account as a cat." autoAcceptFollowed: "Automatically approve follow requests from users you're following" @@ -199,7 +199,7 @@ done: "Done" processing: "Processing..." preview: "Preview" default: "Default" -noCustomEmojis: "There are no emojis" +noCustomEmojis: "There are no emoji" noJobs: "There are no jobs" federating: "Federating" blocked: "Blocked" @@ -213,7 +213,7 @@ instanceFollowers: "Followers of instance" instanceUsers: "Users of this instance" changePassword: "Change password" security: "Security" -retypedNotMatch: "The inputs does not match." +retypedNotMatch: "The inputs do not match." currentPassword: "Current password" newPassword: "New password" newPasswordRetype: "Retype new password" @@ -429,7 +429,7 @@ invitationCode: "Invitation code" checking: "Checking..." available: "Available" unavailable: "Not available" -usernameInvalidFormat: "You can use upper- and lowercase letters, numbers as well as underscores." +usernameInvalidFormat: "You can use upper- and lowercase letters, numbers, and underscores." tooShort: "Too short" tooLong: "Too long" weakPassword: "Weak password" @@ -445,7 +445,7 @@ language: "Language" uiLanguage: "User interface language" groupInvited: "You've been invited to a group" aboutX: "About {x}" -useOsNativeEmojis: "Use OS native Emojis" +useOsNativeEmojis: "Use OS native Emoji" youHaveNoGroups: "You have no groups" joinOrCreateGroup: "Get invited to a group or create your own." noHistory: "No history available" @@ -482,7 +482,7 @@ objectStorageBaseUrlDesc: "URL used as reference. Specify the URL of your CDN or objectStorageBucket: "Bucket" objectStorageBucketDesc: "Please specify the bucket name used at your provider." objectStoragePrefix: "Prefix" -objectStoragePrefixDesc: "Files will stored under directories with this prefix." +objectStoragePrefixDesc: "Files will be stored under directories with this prefix." objectStorageEndpoint: "Endpoint" objectStorageEndpointDesc: "Leave this empty if you are using AWS S3, otherwise specify the endpoint as '' or ':', depending on the service you are using." objectStorageRegion: "Region" @@ -529,6 +529,8 @@ removeAllFollowing: "Unfollow all followed users" removeAllFollowingDescription: "Executing this unfollows all accounts from {host}. Please run this if the instance e.g. no longer exists." userSuspended: "This user has been suspended." userSilenced: "This user has been silenced." +yourAccountSuspendedTitle: "This account is suspended" +yourAccountSuspendedDescription: "This account has been suspended due to breaking the server's terms of services or similar. Contact the administrator if you would like to know a more detailed reason. Please do not create a new account." menu: "Menu" divider: "Divider" addItem: "Add Item" @@ -606,7 +608,7 @@ useGlobalSettingDesc: "If turned on, your account's notification settings will b other: "Other" regenerateLoginToken: "Regenerate login token" regenerateLoginTokenDescription: "Regenerate the token used internally during login. Normally this action is not necessary. If regenerated, all devices will be logged out." -setMultipleBySeparatingWithSpace: "You can set multiple by separating them with spaces." +setMultipleBySeparatingWithSpace: "Separate multiple entries with spaces." fileIdOrUrl: "File-ID or URL" chatOpenBehavior: "Behavior of the chat window when opened" behavior: "Behavior" @@ -649,7 +651,7 @@ pollVotesCount: "Number of sent poll votes" pollVotedCount: "Number of received poll votes" yes: "Yes" no: "No" -driveFilesCount: "Number of drive files" +driveFilesCount: "Number of Drive files" driveUsage: "Drive space usage" noCrawle: "Reject crawler indexing" noCrawleDescription: "Ask search engines to not index your profile page, notes, Pages, etc." @@ -657,7 +659,7 @@ lockedAccountInfo: "Unless you set your note visiblity to \"Followers only\", yo alwaysMarkSensitive: "Mark as NSFW by default" loadRawImages: "Load original images instead of showing thumbnails" disableShowingAnimatedImages: "Don't play animated images" -verificationEmailSent: "A verification email has been sent. Please access the included link to complete verification." +verificationEmailSent: "A verification email has been sent. Please follow the included link to complete verification." notSet: "Not set" emailVerified: "Email has been verified" noteFavoritesCount: "Number of favorite notes" @@ -688,7 +690,7 @@ sendErrorReportsDescription: "When turned on, detailed error information will be myTheme: "My theme" backgroundColor: "Background color" accentColor: "Accent color" -textColor: "Textfarbe" +textColor: "Text color" saveAs: "Save as..." advanced: "Advanced" value: "Value" @@ -724,7 +726,7 @@ fullView: "Full view" quitFullView: "Exit full view" addDescription: "Add description" userPagePinTip: "You can display notes here by selecting \"Pin to profile\" from the menu of individual notes." -notSpecifiedMentionWarning: "This note contains mentions of users not included as recipient" +notSpecifiedMentionWarning: "This note contains mentions of users not included as recipients" info: "About" userInfo: "User information" unknown: "Unknown" @@ -748,7 +750,7 @@ switch: "Switch" noMaintainerInformationWarning: "Maintainer information is not configured." noBotProtectionWarning: "Bot protection is not configured." configure: "Configure" -postToGallery: "Post to Gallery" +postToGallery: "Create new gallery post" gallery: "Gallery" recentPosts: "Recent posts" popularPosts: "Popular posts" @@ -778,7 +780,7 @@ whatIsNew: "Show changes" translate: "Translate" 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 can not be changed later." +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" pubSub: "Pub/Sub Accounts" @@ -810,7 +812,7 @@ _gallery: my: "My Gallery" liked: "Liked Posts" like: "Like" - unlike: "Undo like" + unlike: "Remove like" _email: _follow: title: "You've got a new follower" @@ -850,11 +852,11 @@ _mfm: url: "URL" urlDescription: "URLs can be displayed." link: "Link" - linkDescription: "Specific parts of text can be displayed as an URL." + linkDescription: "Specific parts of text can be displayed as a URL." bold: "Bold" boldDescription: "Highlights letters by making them thicker." small: "Small" - smallDescription: "Displays contents small and thin." + smallDescription: "Displays content small and thin." center: "Center" centerDescription: "Displays content centered." inlineCode: "Code (In-line)" @@ -866,7 +868,7 @@ _mfm: blockMath: "Math (Block)" blockMathDescription: "Display multi-line Math formulas (KaTeX) in a block" quote: "Quote" - quoteDescription: "Displays content as quote." + quoteDescription: "Displays content as a quote." emoji: "Custom Emoji" emojiDescription: "By surrounding a custom emoji name with colons, custom emoji can be displayed." search: "Search" @@ -896,9 +898,11 @@ _mfm: blur: "Blur" blurDescription: "Content can be blurred via this effect. It will be displayed clearly when hovered over." font: "Font" - fontDescription: "Sets the font to display contents in." + fontDescription: "Sets the font to display content in." rainbow: "Rainbow" rainbowDescription: "Makes the content appear in rainbow colors." + sparkle: "Sparkle" + sparkleDescription: "Gives content a sparkling particle effect." _reversi: reversi: "Reversi" gameSettings: "Game settings" @@ -958,8 +962,8 @@ _menuDisplay: _wordMute: muteWords: "Muted words" muteWordsDescription: "Separate with spaces for an AND condition or with line breaks for an OR condition." - muteWordsDescription2: "Surround keywords by slashes to use regular expressions." - softDescription: "Hides notes fulfilling the set conditions from the timeline." + muteWordsDescription2: "Surround keywords with slashes to use regular expressions." + softDescription: "Hide notes that fulfil the set conditions from the timeline." hardDescription: "Prevents notes fulfilling the set conditions from being added to the timeline. In addition, these notes will not be added to the timeline even if the conditions are changed." soft: "Soft" hard: "Hard" @@ -1017,7 +1021,7 @@ _theme: divider: "Divider" scrollbarHandle: "Scrollbar handle" scrollbarHandleHover: "Scrollbar handle (Hover)" - dateLabelFg: "Text of date labels" + dateLabelFg: "Date label text" infoBg: "Information background" infoFg: "Information text" infoWarnBg: "Warning background" @@ -1090,19 +1094,19 @@ _tutorial: _2fa: alreadyRegistered: "You have already registered a 2-factor authentication device." registerDevice: "Register a new device" - registerKey: "Register a new Security Key" + registerKey: "Register a security key" step1: "First, install an authentication app (such as {a} or {b}) on your device." step2: "Then, scan the QR code displayed on this screen." step3: "Enter the token provided by your app to finish setup." - step4: "From now, any future login attempts will ask for such a login token." - securityKeyInfo: "Besides fingerprint or PIN authentication, you can also setup authentication via hardware security keys that support FIDO2 to further secure your login process." + step4: "From now on, any future login attempts will ask for such a login token." + securityKeyInfo: "Besides fingerprint or PIN authentication, you can also setup authentication via hardware security keys that support FIDO2 to further secure your account." _permissions: "read:account": "View your account information" "write:account": "Edit your account information" "read:blocks": "View your list of blocked users" "write:blocks": "Edit your list of blocked users" - "read:drive": "Access your drive files and folders" - "write:drive": "Edit or delete your drive files and folders" + "read:drive": "Access your Drive files and folders" + "write:drive": "Edit or delete your Drive files and folders" "read:favorites": "View your list of favorites" "write:favorites": "Edit your list of favorites" "read:following": "View information on who you follow" @@ -1125,6 +1129,10 @@ _permissions: "write:user-groups": "Edit or delete your user groups" "read:channels": "Read your channels" "write:channels": "Modify your channels" + "read:gallery": "View your gallery" + "write:gallery": "Edit your gallery" + "read:gallery-likes": "View list of liked gallery posts" + "write:gallery-likes": "Edit list of liked gallery posts" _auth: shareAccess: "Would you like to authorize \"{name}\" to access this account?" shareAccessAsk: "Are you sure you want to authorize this application to access your account?" @@ -1327,23 +1335,23 @@ _rooms: doll-ai: "Ai doll" banknote: "Pile of money" _pages: - newPage: "Create a page" - editPage: "Edit this page" + newPage: "Create a new Page" + editPage: "Edit this Page" readPage: "Source view activated" created: "Page successfully created" updated: "Page successfully edited" deleted: "Page successfully deleted" pageSetting: "Page settings" - nameAlreadyExists: "The specified page URL already exists" - invalidNameTitle: "The specified page URL is invalid" - invalidNameText: "Make sure the page title is not empty" - editThisPage: "Edit this page" + nameAlreadyExists: "The specified Page URL already exists" + invalidNameTitle: "The specified Page URL is invalid" + invalidNameText: "Make sure the Page title is not empty" + editThisPage: "Edit this Page" viewSource: "View source" - viewPage: "View your pages" + viewPage: "View your Pages" like: "Like" - unlike: "Undo like" - my: "My pages" - liked: "Liked pages" + unlike: "Remove like" + my: "My Pages" + liked: "Liked Pages" featured: "Featured" inspector: "Inspector" contents: "Contents" @@ -1353,10 +1361,10 @@ _pages: url: "Page URL" summary: "Page summary" alignCenter: "Center elements" - hideTitleWhenPinned: "Hide page title when pinned to profile" + hideTitleWhenPinned: "Hide Page title when pinned to profile" font: "Font" fontSerif: "Serif" - fontSansSerif: "Sans serif" + fontSansSerif: "Sans Serif" eyeCatchingImageSet: "Set thumbnail" eyeCatchingImageRemove: "Delete thumbnail" chooseBlock: "Add a block" @@ -1571,7 +1579,7 @@ _pages: seedRandomPick: "Randomly choose from list (with seed)" _seedRandomPick: arg1: "Seed" - arg2: "Liste" + arg2: "List" DRPWPM: "Randomly choose from weighted list (Changes once a day for each user)" _DRPWPM: arg1: "Text list" @@ -1651,8 +1659,8 @@ _deck: columnMargin: "Margin between columns" columnHeaderHeight: "Column header height" addColumn: "Add column" - swapLeft: "Swap to left" - swapRight: "Swap to right" + swapLeft: "Swap left" + swapRight: "Swap right" swapUp: "Swap with above" swapDown: "Swap with below" stackLeft: "Stack on left column" diff --git a/locales/eo-UY.yml b/locales/eo-UY.yml index 9ebd9b1d8..fbc1aa31e 100644 --- a/locales/eo-UY.yml +++ b/locales/eo-UY.yml @@ -1,19 +1,19 @@ --- _lang_: "Esperanto" -headlineMisskey: "Reto ligata per notoj" -introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza mikrobloga servo.\nKreu \"noto\"n por diskonigu ke nun okazas, aŭ por dissendu pri vi. 📡\nPer la funkcio \"reago\", vi ankaŭ povas rapide esprimi vian senton pri ĉies noto. 👍\nEsploru novan mondon. 🚀" +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}" search: "Serĉi" notifications: "Sciigoj" username: "Uzantnomo" password: "Pasvorto" forgotPassword: "Ĉu vi forgesis pasvorton?" -fetchingAsApObject: "Informpetado de Fediverso..." +fetchingAsApObject: "Informpetado de kunfederaĵo…" ok: "Akcepteble" gotIt: "Mi komprenas" cancel: "Nuligi" enterUsername: "Entajpu uzantnomon" -renotedBy: "Renoto farita de {user}" +renotedBy: "Noto plusendita de {user}" noNotes: "Neniu noto!" noNotifications: "Vi ne havas sciigojn." instance: "Nodo" @@ -23,12 +23,12 @@ otherSettings: "Aliaj agordoj" openInWindow: "Malfermi en nova fenestro" profile: "Profilo" timeline: "Templinio" -noAccountDescription: "Tiu uzanto ne skribis biografieton" +noAccountDescription: "Ĉi tiu uzanto ne skribis vivpriskribon." login: "Ensaluti" -loggingIn: "Ensalutado..." +loggingIn: "Ensalutado…" logout: "Elsaluti" -signup: "Krei konton" -uploading: "Alŝutado..." +signup: "Registriĝi" +uploading: "Alŝutado…" save: "Konservi" users: "Uzantoj" addUser: "Aldoni uzanton" @@ -36,6 +36,7 @@ favorite: "Preferi" favorites: "Preferataĵ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" unpin: "Depingli" @@ -43,7 +44,7 @@ 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? Ankaŭ ĉiuj reagoj, renotoj, kaj respondoj al ĝi foriĝos." +deleteAndEditConfirm: "Ĉu vi certas, ke vi volas forigi kaj redakti la noton? Kun tio foriĝos reagoj, plusendaĵoj, kaj respondoj ĉiuj de ĝi." addToList: "Aldoni al listo" sendMessage: "Sendi mesaĝon" copyUsername: "Kopii uzantnomon" @@ -51,7 +52,7 @@ searchUser: "Serĉi uzanton" reply: "Respondi" loadMore: "Vidu pli" showMore: "Vidi pli" -youGotNewFollower: "sksekvis vin" +youGotNewFollower: "eksekvis vin" receiveFollowRequest: "Peto de sekvado estas ricevita" followRequestAccepted: "La peto de sekvado akceptita" mention: "Mencioj" @@ -62,32 +63,33 @@ import: "Importi" export: "Eksporti" files: "Dosieroj" download: "Elŝuti" -driveFileDeleteConfirm: "Ĉu vi certas, ke vi volas forviŝi la dosieron \"{name}\"? Ankaŭ notoj kiuj enhavas ĝin forviŝiĝos." +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?" lists: "Listoj" noLists: "Neniu listo" -note: "Elsendi noto" +note: "Notoj" notes: "Notoj" following: "Sekvatoj" followers: "Sekvantoj" followsYou: "Sekvas vin" -createList: "Kreii liston" +createList: "Krei liston" manageLists: "Administri liston" error: "Eraro" -somethingHappened: "Problemo okazis." -retry: "Reprovi" +somethingHappened: "Problemo okazis" +retry: "Provi denove" enterListName: "Entajpu nomon de la listo" privacy: "Privateco" +defaultNoteVisibility: "Implicitaĵo de videbleco" follow: "Sekvi" followRequest: "Peti de sekvado" followRequests: "Petoj de sekvado" -unfollow: "Malsekvi" +unfollow: "Ne plu sekvi" enterEmoji: "Entajpu emoĵion" -renote: "Fari renoton" -unrenote: "Malfari renoton" -renoted: "Renoto fariĝis." -cantRenote: "Tiu noto ne estas resendebla." -cantReRenote: "Renotoj ne estas renotebla." +renote: "Plusendi la noton" +unrenote: "Malfari plusendadon" +renoted: "Sukcese plusendita" +cantRenote: "Oni ne povas plusendi la noton." +cantReRenote: "Plusendado ne estas plusendebla." quote: "Citi" pinnedNote: "Alpinglita noto" pinned: "Alpingli al la profilo" @@ -96,7 +98,7 @@ clickToShow: "Klaku por malkaŝu" sensitive: "Enhavo ne estas deca por laborejo (NSFW)" add: "Aldoni" reaction: "Reagoj" -rememberNoteVisibility: "Rememori la videblecon de la noto laste sendita" +rememberNoteVisibility: "Rememoru la videblecon de la noto laste sendita" attachCancel: "Deigi aldonaĵon" markAsSensitive: "Troviĝi NSFW" unmarkAsSensitive: "Ne troviĝi NSFW" @@ -123,11 +125,11 @@ emojiName: "Nomo de emoĵio" emojiUrl: "URL de la emoĵio" addEmoji: "Aldoni emoĵion" settingGuide: "Agordaj rekomendoj" -cacheRemoteFiles: "Havi staplon de transaj dosieroj" +cacheRemoteFiles: "Stapli transajn dosierojn" flagAsBot: "Agordo por robota uzanto" flagAsCat: "Agordo de katiĝa uzanto" addAccount: "Aldoni konton" -showOnRemote: "Vidi sur la fora nodo" +showOnRemote: "Vidi ĉe la surloka nodo" general: "Ĝenerala" wallpaper: "Ekranfonoj" setWallpaper: "Apliki ekranfonon" @@ -135,17 +137,28 @@ 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" selectUser: "Elekti uzanton" +recipient: "Ricevonto" annotation: "Komentarioj" federation: "Kunfederaĵo" -instances: "Nodo" +instances: "Nodoj" +latestRequestSentAt: "Lastatempa sendo" +latestRequestReceivedAt: "Lastatempa ricevo" +latestStatus: "Laŭstato" perHour: "Po horo" perDay: "Po tago" -blockThisInstance: "Bloki tiun nodon" +blockThisInstance: "Bloki la nodon" +operations: "Agoj" +software: "Programaro" version: "Versio" +metadata: "Metadatumoj" withNFiles: "{n} dosiero(j)" +monitor: "Monitoro" +network: "Reto" disk: "Diskilo" instanceInfo: "Informoj pri la nodo" +statistics: "Statistikoj" clearCachedFiles: "Malplenigi la staplon" clearCachedFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn transajn dosierojn en la staplo?" blockedInstances: "Blokitaj nodoj" @@ -156,7 +169,9 @@ noUsers: "Sen uzantoj" editProfile: "Redakti profilon" noteDeleteConfirm: "Ĉu vi certas ke vi volas forviŝi la noton?" pinLimitExceeded: "Vi povas alpingli ne pli noton." -processing: "Prilaborado..." +done: "Fini" +processing: "Prilaborado…" +preview: "Antaŭmontro" noCustomEmojis: "Neniu emoĵio" federating: "Nun kunfederanta" blocked: "Blokita" @@ -165,11 +180,12 @@ all: "Ĉiuj" subscribing: "Abonata" publishing: "Al kiu dissendas" notResponding: "Alvokato ne disponeblas" -instanceFollowing: "Sekvatoj el la nodo" +instanceFollowing: "Sekvatoj en la nodo" instanceFollowers: "Sekvantoj el la nodo" -instanceUsers: "Uzantoj de ĉi tiu nodo" +instanceUsers: "Uzantoj de tiu ĉi nodo" changePassword: "Ŝanĝi pasvorton" security: "Sekureco" +retypedNotMatch: "Enigitoj ne estas konformaj." currentPassword: "Aktuala pasvorto" newPassword: "Nova pasvorto" newPasswordRetype: "Reentajpu la novan pasvorton" @@ -191,7 +207,7 @@ upload: "Alŝuti" fromDrive: "De la disko" fromUrl: "De URL" uploadFromUrl: "Alŝuti de URL" -uploadFromUrlDescription: "URL de la dosiero kiun vi volas alŝuti" +uploadFromUrlDescription: "URL de dosiero kiun vi volas alŝuti" explore: "Esplori" games: "Miskiaj Ludoj" messageRead: "Legita" @@ -200,7 +216,7 @@ nUsersRead: "Legita de {n} homoj" tos: "Kondiĉoj de uzado" start: "Komenciĝi" home: "Hejma" -remoteUserCaution: "Tiu infomoj estas ne tute ekzakta pro distanca uzanto." +remoteUserCaution: "Ĉi tiuj infomoj ne estas tute ekzaktaj pro transa uzanto." activity: "Aktiveco" images: "Bildoj" birthday: "Naskiĝdato" @@ -238,6 +254,7 @@ unwatch: "Malobservi" accept: "Permesi" normal: "Normala" instanceName: "Nomo de la nodo" +instanceDescription: "Mempriskribo de la nodo " maintainerName: "Nomo de la administranto" maintainerEmail: "Retpoŝto de la administranto" tosUrl: "URL de kondiĉoj de uzado" @@ -253,6 +270,8 @@ disconnectService: "Farkonektiĝi" enableLocalTimeline: "Ebligi lokan templinion" enableGlobalTimeline: "Ebligi mallokan templinion" registration: "Registri" +enableRegistration: "Ebligi novan uzanton registriĝon" +invite: "Inviti" driveCapacityPerLocalAccount: "Volumo de disko po unu loka uzanto" driveCapacityPerRemoteAccount: "Volumo de disko po unu transa uzanto" iconUrl: "URL de la ikono (retpaĝsimbolo, ktp)" @@ -262,6 +281,12 @@ basicInfo: "Baza informo" pinnedUsers: "Alpinglita uzanto" pinnedPages: "Alpinglitaj paĝoj" pinnedNotes: "Alpinglita noto" +hcaptchaSiteKey: "Reteja ŝlosilo" +hcaptchaSecretKey: "Sekreta ŝlosilo" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Ebligi reCAPTCHA'on" +recaptchaSiteKey: "Reteja ŝlosilo" +recaptchaSecretKey: "Sekreta ŝlosilo" antennas: "Antenoj" manageAntennas: "Administri antenojn" name: "Nomo" @@ -278,13 +303,15 @@ unsilenceConfirm: "Ĉu vi certas ke vi volas malmutigi la uzanton?" popularUsers: "Popularaj uzantoj" recentlyUpdatedUsers: "Uzantoj kiuj lastatempe sendis noton" recentlyRegisteredUsers: "Novaliĝintaj uzantoj" -exploreUsersCount: "Tiuj estas {count} uzantoj" +recentlyDiscoveredUsers: "Lastatempe trovitaj uzantoj" +exploreUsersCount: "Tio estas {count} uzantoj" exploreFediverse: "Esplori la Fediverson" popularTags: "Popularaj kradvortoj" userList: "Listoj" about: "Informoj" aboutMisskey: "Pri Misskey" administrator: "Administranto" +twoStepAuthentication: "Dua-faktora aŭtentiko" moderator: "Kontrolisto" nUsersMentioned: "{n} uzanto(j) menciis" securityKey: "Sekureca ŝlosilo" @@ -302,6 +329,7 @@ close: "Fermi" group: "Grupo" groups: "Grupoj" createGroup: "Krei grupon" +invites: "Inviti" groupName: "Grupa nomo" members: "Membroj" messagingWithUser: "Babili private" @@ -310,21 +338,31 @@ title: "Titolo" text: "Teksto" enable: "Ebligi" next: "Sekve" +retype: "Retajpu" noteOf: "Noto de {user}" +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." +signinRequired: "Bonvolu ensaluti" +invitations: "Inviti" invitationCode: "Kodo de invito" +unavailable: "Ne disponebla" +passwordMatched: "Konforma" +passwordNotMatched: "Nekonforma" or: "Aŭ" language: "Lingvo" -uiLanguage: "Lingvo de la fasado" +uiLanguage: "Lingvo de fasado" aboutX: "Pri {x}" useOsNativeEmojis: "Oni uzas la emoĵioj de la denaska sistemo" youHaveNoGroups: "Neniuj grupoj" +doing: "Traktado..." category: "Kategorio" tags: "Etikedoj" createAccount: "Krei konton" existingAccount: "Ekzista konto" +regenerate: "Regeneri" fontSize: "Tipara grando" noFollowRequests: "Vi ne havas peto de sekvado" openImageInNewTab: "Fermi la bildon en nova tablo" @@ -332,10 +370,11 @@ dashboard: "Stirpanelo" local: "Loka" remote: "Transa" total: "Entute" +appearance: "Eksteraĵo" clientSettings: "Agordoj de kliento" -accountSettings: "Agordoj de Konto" +accountSettings: "Agordoj de konto" numberOfDays: "Nombro de tagoj" -hideThisNote: "Kaŝi tiun noton" +hideThisNote: "Kaŝi la noton" objectStorageBaseUrl: "Baza URL" objectStorageRegion: "Regiono" objectStorageUseSSL: "Oni uzas SSL" @@ -346,11 +385,29 @@ sounds: "Sonoj" listen: "Aŭdi" none: "Neniu" showInPage: "Vidi en paĝo" +popout: "Superigi" +volume: "Laŭteco" +masterVolume: "Baza laŭteco" +chooseEmoji: "Elekti emoĵion" +recentUsed: "Lastatempaj uzitaj" +install: "Instali" +uninstall: "Malinstali" +installedApps: "Instalita programo" +nothing: "Neniu" +installedDate: "Dato de instalado" +lastUsedDate: "Lastfoje uzita je" +state: "Stato" +sort: "Ordigado" +output: "Elmeto" +script: "Skripto" +disablePagesScript: "Malebligi AiScripto en la paĝoj" deleteAllFiles: "Forviŝi ĉiujn dosierojn" -deleteAllFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn viajn dosierojn?" +deleteAllFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn dosierojn?" userSuspended: "Ĉi tiu uzanto estas flostigita." userSilenced: "Ĉi tiu uzanto estas mutigita." menu: "Menuo" +addItem: "Aldoni novaĵon" +rooms: "Ĉambro" deletedNote: "Forviŝita noto" invisibleNote: "Malpublika noto" visibility: "Videbleco" @@ -358,20 +415,25 @@ poll: "Balotujo" useCw: "Kaŝi enhavo" enablePlayer: "Vidi videon" disablePlayer: "Fermi videon" +expandTweet: "Disvolvi pepon" themeEditor: "Redaktilo de koloraroj" description: "Priskribe" describeFile: "Priskribi la bildon" +enterFileDescription: "Priskribu" author: "Aŭtoro" manage: "Administro" plugins: "Kromaĵoj" deck: "Kartaro" +width: "Larĝeco" +height: "Alteco" medium: "Meza" small: "Malgranda" edit: "Redakti" emailServer: "Retpoŝta servilo" email: "Retpoŝto" emailAddress: "Retpoŝta adreso" -smtpConfig: "Agordoj de la servilo SMTP" +smtpConfig: "Agordoj de SMTP servilo" +smtpHost: "Gastiganto" smtpPort: "Pordo" smtpUser: "Uzantnomo" smtpPass: "Pasvorto" @@ -380,35 +442,46 @@ userSaysSomething: "{name} parolis ion" makeActive: "Aktivigi" display: "Vidi" copy: "Kopii" +overview: "Resumo" database: "Datumbazo" channel: "Kanalo" create: "Krei" notificationSetting: "Agordoj de sciigoj" useGlobalSetting: "Oni uzas malloka agordo" fileIdOrUrl: "Dosiera identigilo aŭ URL" +sample: "Ekzemplo" abuseReports: "Signaloj" reportAbuse: "Signalo" reportAbuseOf: "Signali kontraŭ {name}'(o)" send: "Sendi" openInNewTab: "Malfermi en nova langeto" -editTheseSettingsMayBreakAccount: "Redakti tiujn agordojn estas eble damaĝi konton." +editTheseSettingsMayBreakAccount: "Redakti ĉi tiujn agordojn povas damaĝi vian konton." +instanceTicker: "Informoj pri la nodo kiu dissendas la noton" +random: "Hazarde" +system: "Sistemo" +desktop: "Labortablo" +createNew: "Krei novan" +optional: "Opciaj" 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" +notesCount: "La nombro de notoj" +repliesCount: "La nombro de respondoj senditaj" +renotesCount: "La nombro de notoj kiujn la uzanto plusendis" +repliedCount: "La nombro de respondoj ricevitaj" +renotedCount: "La nombro de uzantulaj notoj plusenditaj" +followingCount: "La nombro de sekvatoj" +followersCount: "La nombro de sekvantoj" +sentReactionsCount: "La nombro de la reagoj senditaj" +receivedReactionsCount: "La nombro de la reagoj ricevitaj" yes: "Jes" no: "Ne" -driveFilesCount: "Numero de dosieroj sur la disko" +driveFilesCount: "La nombro de la dosieroj ĉe la disko" notSet: "Ne elektita" -noteFavoritesCount: "Numero de la preferataj notoj" +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" contact: "Kontakto" makeExplorable: "Videbligi konton sur la paĝo \"Esplori\"" duplicate: "Duobligi" @@ -435,21 +508,25 @@ 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: "Oni malfermas reago-elektilon per dekstro-kliki" -typingUsers: "{users} estas entajpanta(j)..." +typingUsers: "{users} nun entajpas…" +clear: "Vakigi" +goBack: "Reiri antaŭ" addDescription: "Priskribi" info: "Informoj" -userInfo: "Informoj de uzanto" +userInfo: "La informoj de uzanto" unknown: "Nekonata" online: "Surkonektita" offline: "Forkonektita" -instanceBlocking: "Blokado de nodoj" +instanceBlocking: "Bloki specifajn nodojn" selectAccount: "Elekti konton" user: "Uzantoj" administration: "Administro" accounts: "Kontoj" +shareWithNote: "Kundividi en noto" +ads: "Reklamaĵo" +memo: "Memorigilo" high: "Alta" middle: "Meza" low: "Malalta" @@ -459,6 +536,7 @@ sent: "Sendi" received: "Ricevita" searchResult: "Serĉorezultoj" hashtags: "Kradvorto" +troubleshooting: "Problemsolvi" learnMore: "Lernu pli" translate: "Traduki" translatedFrom: "Tradukita el {x}" @@ -466,6 +544,8 @@ _docs: continueReading: "Legi plu" features: "Funkcioj" admin: "Administro" +_ad: + back: "Nuligi" _gallery: liked: "Ŝatitaj notoj" like: "Ŝati" @@ -485,7 +565,7 @@ _registry: _aboutMisskey: about: "Misskey estas malfermitkoda programo evoluigata de syuilo ekde la 2014." contributors: "Precipaj kontribuantoj" - allContributors: "Ĉiuj kontribuintoj" + allContributors: "Ĉiuj kontribuantoj" source: "Fontkodo" translation: "Traduki Misskey'on" patrons: "Mecenatoj" @@ -509,6 +589,7 @@ _mfm: x2: "Granda" x3: "Grandega" x4: "Pli grandega" + font: "Presliteraro" _reversi: total: "Entute" _instanceTicker: @@ -518,26 +599,34 @@ _instanceTicker: _channel: create: "Krei kanalon" edit: "Redakti kanalon" + setBanner: "Apliki standardan bildon" + removeBanner: "Forviŝi la standardan bildon" owned: "Posedaĵo" following: "Sekvante" usersCount: "{n} partoprenanto(j)" _menuDisplay: + top: "Supro" hide: "Kaŝi" _wordMute: muteWords: "Silentigitaj vortoj" + soft: "En kliento" + hard: "En servilo" mutedNotes: "Silentigitaj notoj" _theme: manage: "Administri kolorarojn" code: "Kodo de koloraro" description: "Priskribe" + color: "Koloro" darken: "Malbrileco" lighten: "Brileco" keys: bg: "Fono" navBg: "Fono de flanka stango" + link: "Ligilo" hashtag: "Kradvorto" mention: "Mencioj" - renote: "Renoto" + mentionMe: "Mencio al vi" + renote: "Noto plusendita" buttonBg: "Fono de butono" driveFolderBg: "Fono de dosierujo de la disko" messageBg: "Fono de retbabilejo" @@ -569,29 +658,33 @@ _tutorial: step1_1: "Bonvenon." step7_2: "Se vi volas scii pli pri Misskey, rigardu la fakon {help}." step7_3: "Do, bonvolu amuziĝi Misskey'on🚀" +_2fa: + registerKey: "Nove registri ŝlosilon" _permissions: - "write:account": "Redakti Informojn de via konto" + "read:account": "Legado de la informoj pri via konto" + "write:account": "Redatado de la informoj de via konto" "read:blocks": "Vidi vian liston de uzantoj blokitaj" - "write:blocks": "Redakti vian liston de uzantoj blokitaj" - "read:drive": "Operacio por legi la informon de dosiero en via disko de Misskey" + "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:following": "Vidi tiun kiun vi sekvas" + "read:following": "Vidi la infomaciojn pri tio, kion 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:messaging": "Retbabilejo" + "read:mutes": "Vidi vian liston de silentigitoj" + "write:mutes": "Redakti vian liston de silentigitoj" "write:notes": "Krei / Forviŝi noton" "read:notifications": "Vidi sciigojn" + "write:notifications": "Manipulado por viaj sciigoj" "read:reactions": "Vidi reagojn" "write:reactions": "Redakti viajn reagojn" - "read:pages": "Vidi via paĝojn" "read:page-likes": "Vidi ŝatojn de paĝo" "read:channels": "Vidi kanalojn" _antennaSources: all: "Ĉiuj notoj" - homeTimeline: "Notoj far uzantoj, kiujn vi sekvas" + homeTimeline: "Notoj far uzantoj kiujn vi sekvas" _weekday: sunday: "dimanĉo" monday: "lundo" @@ -622,21 +715,24 @@ _poll: vote: "Baloti" closed: "Oni jam balotis ĝin" _visibility: - publicDescription: "Via noto aperiĝos sur la templinio Malloka" + publicDescription: "Via noto estos videbla de ĉiuj uzantoj" home: "Hejma" - homeDescription: "Elsendi nur sur la templinio Hejmo" + homeDescription: "Dissendi nur sur hejma templinio" followers: "Sekvantoj" followersDescription: "Nur al sekvantoj al mi" specified: "Rekta" + specifiedDescription: "Publikigi nur al specifaj uzantoj" localOnly: "Nur loka" localOnlyDescription: "Ne montri al transaj uzantoj" _postForm: - replyPlaceholder: "Respondi al tiu noto..." - quotePlaceholder: "Citado tiun noton..." - channelPlaceholder: "Sendi sur la kanalo" + replyPlaceholder: "Respondi tiun noton…" + quotePlaceholder: "Citi tiun noton…" + channelPlaceholder: "Mencii en kanalo…" _profile: name: "Nomo" username: "Uzantnomo" + description: "Pri mi" + metadata: "Kromaj informoj" metadataEdit: "Redakti kromaj informoj" changeAvatar: "Ŝanĝi profilbildon" changeBanner: "Ŝanĝi standardon" @@ -644,14 +740,14 @@ _exportOrImport: allNotes: "Ĉiuj notoj" followingList: "Sekvataj uzantoj" muteList: "Silentigoj" - blockingList: "Blokitaj uzantoj" + blockingList: "Blokitoj" userLists: "Listoj" _charts: - federationInstancesTotal: "Tuta numero de nodoj kunfederantaj" - usersTotal: "Tuta numero de uzantoj" - activeUsers: "Numero de aktivaj uzantoj" - notesTotal: "Tuta numero de notoj" - filesTotal: "Tuta numero de dosieroj" + 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" + filesTotal: "La totala nombro de la dosieroj" _timelines: home: "Hejma" local: "Loka" @@ -661,17 +757,34 @@ _rooms: translate: "Movi" chooseImage: "Elekti bildon" _furnitures: + bed: "Lito" + low-table: "Malaltotablo" + desk: "Skribotablo" + chair: "Seĝo" + chair2: "Seĝo 2" + pc: "Komputilo" + eraser: "Skrapileto" + pencil: "Krajono" + pudding: "Flaŭno" + book: "Libro" + book2: "Libro 2" + piano: "Piano" + facial-tissue: "Tualetpaperejo" server: "Servilo" - moon: "La luno" + moon: "Luno" + monitor: "Monitoro" + keyboard: "Klavaro" + doll-ai: "Pupa Ai" _pages: + newPage: "Krei novan paĝon" editPage: "Redakti paĝon" - deleted: "La paĝo estas forigita." + deleted: "Oni forviŝis la paĝon." editThisPage: "Redakti la paĝon" - viewPage: "Vidi via paĝojn" + viewPage: "Vidi viajn paĝojn" my: "Miaj paĝoj" featured: "Ravaĵoj" contents: "Enhavo" - content: "Blokado de paĝo" + content: "Paĝo en bloko" url: "URL de paĝo" alignCenter: "Centrigi" chooseBlock: "Aldoni blokon" @@ -683,8 +796,9 @@ _pages: button: "Butono" _post: canvasId: "Kanvasa identigilo" - textInput: "Enigo el teksto" - textareaInput: "Enigo el teksto en multaj linioj" + textInput: "Enmeto el teksto" + textareaInput: "Enmeto el teksto en multaj linioj" + numberInput: "Nombra enmeto" _numberInput: text: "Titolo" _canvas: @@ -733,23 +847,29 @@ _pages: arg1: "Teksto" _splitStrByLine: arg1: "Teksto" + _fn: + slots: "Juntoj" + arg1: "Elmeto" + thereIsEmptySlot: "La junto {slot} estas malplena!" types: string: "Teksto" array: "Listoj" stringArray: "List de teksto" + emptySlot: "Malplena junto" + argVariables: "Eniga junto" _notification: fileUploaded: "La dosiero sukcese alŝutiĝis." - youRenoted: "Renoto farita de {name}" + youRenoted: "{name} plusendis" youGotPoll: "{name} balotis" youGotMessagingMessageFromUser: "{name} sentis mesaĝon al vi." youGotMessagingMessageFromGroup: "Retbabilan mesaĝon oni sendis al la grupo {name}" - youWereFollowed: "sksekvis vin" + youWereFollowed: "eksekvis vin" youReceivedFollowRequest: "Vi ricevis peton de sekvado" yourFollowRequestAccepted: "Via peto por sekvado estis akceptita." _types: follow: "Sekvatoj" mention: "Mencioj" - renote: "Fari renoton" + renote: "Notoj plusenditaj" quote: "Citi" reaction: "Reagoj" receiveFollowRequest: "Ricevita peton de sekvado" diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 7bb4f6976..c4fee0534 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -529,6 +529,7 @@ removeAllFollowing: "Retenir tous les abonnements" removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si l’instance n’existe plus." userSuspended: "Cet·te utilisateur·rice a été suspendu·e." userSilenced: "Cette utilisateur·trice a été mis·e en sourdine." +yourAccountSuspendedTitle: "Ce compte est suspendu" menu: "Menu" divider: "Séparateur" addItem: "Ajouter un élément" @@ -767,6 +768,7 @@ customCssWarn: "Utilisez cette fonctionnalité uniquement si vous savez exacteme global: "Global" squareAvatars: "Avatars carrés" sent: "Envoyer" +received: "Reçu" searchResult: "Résultats de la recherche" hashtags: "Hashtags" troubleshooting: "Résolution de problèmes" @@ -778,7 +780,12 @@ translate: "Traduire" translatedFrom: "Traduit depuis {x}" accountDeletionInProgress: "La suppression de votre compte est en cours" usernameInfo: "C'est un nom qui identifie votre compte sur l'instance de manière unique. Vous pouvez utiliser des lettres de l'alphabet (minuscules et majuscules), des chiffres (de 0 à 9), ou bien le tiret « _ ». Vous ne pourrez pas modifier votre nom d'utilisateur·rice par la suite." +aiChanMode: "Mode Ai" keepCw: "Garder le CW" +pubSub: "Comptes Pub/Sub" +lastCommunication: "Dernière communication" +resolved: "Résolu" +unresolved: "En attente" _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." @@ -1119,6 +1126,10 @@ _permissions: "write:user-groups": "Éditer les groupes des utilisateur·rice·s" "read:channels": "Lire les canaux" "write:channels": "Gérer les canaux" + "read:gallery": "Voir la galerie" + "write:gallery": "Éditer la galerie" + "read:gallery-likes": "Voir les mentions « J'aime » dans la galerie" + "write:gallery-likes": "Gérer les mentions « J'aime » dans la galerie" _auth: shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?" shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre compte?" @@ -1159,6 +1170,7 @@ _widgets: jobQueue: "File d’attente" serverMetric: "Statistiques du serveur" aiscript: "Console AiScript" + aichan: "Ai" _cw: hide: "Masquer" show: "Afficher plus …" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index e22f50668..f050ad4df 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -529,6 +529,8 @@ removeAllFollowing: "フォローを全解除" removeAllFollowingDescription: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。" userSuspended: "このユーザーは凍結されています。" userSilenced: "このユーザーはサイレンスされています。" +yourAccountSuspendedTitle: "アカウントが凍結されています" +yourAccountSuspendedDescription: "このアカウントは、サーバーの利用規約に違反したなどの理由により、凍結されています。詳細については管理者までお問い合わせください。新しいアカウントを作らないでください。" menu: "メニュー" divider: "分割線" addItem: "項目を追加" @@ -910,6 +912,8 @@ _mfm: fontDescription: "内容のフォントを指定することができます。" rainbow: "レインボー" rainbowDescription: "内容をレインボーにします。" + sparkle: "キラキラ" + sparkleDescription: "キラキラしたパーティクルのエフェクトを追加します。" _reversi: reversi: "リバーシ" @@ -1150,6 +1154,10 @@ _permissions: "write:user-groups": "ユーザーグループを操作する" "read:channels": "チャンネルを見る" "write:channels": "チャンネルを操作する" + "read:gallery": "ギャラリーを見る" + "write:gallery": "ギャラリーを操作する" + "read:gallery-likes": "ギャラリーのいいねを見る" + "write:gallery-likes": "ギャラリーのいいねを操作する" _auth: shareAccess: "「{name}」がアカウントにアクセスすることを許可しますか?" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index e230594ac..0767e60c8 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -245,7 +245,7 @@ messageRead: "もう読んだ" noMoreHistory: "これより過去の履歴はあらへんで" startMessaging: "チャットやるで" nUsersRead: "{n}人が読んでもうた" -agreeTo: "{0}はええで" +agreeTo: "{0}に同意したで" tos: "利用規約" start: "始める" home: "ホーム" @@ -346,7 +346,7 @@ antennaSource: "受信ソース(このソースは食われへん)" antennaKeywords: "受信キーワード" antennaExcludeKeywords: "除外キーワード" antennaKeywordsDescription: "スペースで区切ったるとAND指定で、改行で区切ったるとOR指定や" -notifyAntenna: "新しいノートを追加すんで" +notifyAntenna: "新しいノートを通知すんで" withFileAntenna: "なんか添付されたノートだけ" enableServiceworker: "ServiceWorkerをつこて" antennaUsersDescription: "ユーザー名を改行で区切ったってな" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 43e01fc2c..82c7c1a07 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -529,6 +529,8 @@ removeAllFollowing: "모든 팔로잉 해제" removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요." userSuspended: "이 계정은 정지된 상태입니다." userSilenced: "이 계정은 사일런스된 상태입니다." +yourAccountSuspendedTitle: "계정이 정지되었습니다" +yourAccountSuspendedDescription: "이 계정은 서버의 이용 약관을 위반하거나, 기타 다른 이유로 인해 정지되었습니다. 자세한 사항은 관리자에게 문의해 주십시오. 계정을 새로 생성하지 마십시오." menu: "메뉴" divider: "구분선" addItem: "항목 추가" @@ -779,6 +781,12 @@ translate: "번역" translatedFrom: "{x}에서 번역" accountDeletionInProgress: "계정 삭제 작업을 진행하고 있습니다" usernameInfo: "서버상에서 계정을 식별하기 위한 이름. 알파벳(a~z, A~Z), 숫자(0~9) 및 언더바(_)를 사용할 수 있습니다. 사용자명은 나중에 변경할 수 없습니다." +aiChanMode: "아이 모드" +keepCw: "CW 유지하기" +pubSub: "Pub/Sub 계정" +lastCommunication: "마지막 통신" +resolved: "해결됨" +unresolved: "해결되지 않음" _accountDelete: accountDelete: "계정 삭제" mayTakeTime: "계정 삭제는 서버에 부하를 가하기 때문에, 작성한 콘텐츠나 업로드한 파일의 수가 많으면 완료까지 시간이 걸릴 수 있습니다." @@ -1114,11 +1122,15 @@ _permissions: "read:pages": "페이지를 봅니다" "write:pages": "페이지를 수정합니다" "read:page-likes": "페이지의 좋아요를 확인합니다" - "write:page-likes": "페이지의 좋아요를 추가하거나 삭제합니다" + "write:page-likes": "페이지에 좋아요를 추가하거나 취소합니다" "read:user-groups": "유저 그룹을 조회합니다" "write:user-groups": "유저 그룹을 만들거나, 초대하거나, 이름을 변경하거나, 양도하거나, 삭제합니다" "read:channels": "채널을 보기" - "write:channels": "채널을 변경하기" + "write:channels": "채널을 추가하거나 삭제합니다" + "read:gallery": "갤러리를 봅니다" + "write:gallery": "갤러리를 추가하거나 삭제합니다" + "read:gallery-likes": "갤러리의 좋아요를 확인합니다" + "write:gallery-likes": "갤러리에 좋아요를 추가하거나 취소합니다" _auth: shareAccess: "\"{name}\" 이 계정에 접근하는 것을 허용하시겠습니까?" shareAccessAsk: "이 애플리케이션이 계정에 접근하는 것을 허용하시겠습니까?" @@ -1159,6 +1171,7 @@ _widgets: jobQueue: "작업 대기열" serverMetric: "서버 통계" aiscript: "AiScript 콘솔" + aichan: "아이" _cw: hide: "숨기기" show: "더 보기" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index dcc9226b7..00e5ffce4 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -529,6 +529,8 @@ removeAllFollowing: "取消所有关注" removeAllFollowingDescription: "取消{host}的所有关注者。当实例不存在时执行。" userSuspended: "该用户已被冻结。" userSilenced: "该用户已被禁言。" +yourAccountSuspendedTitle: "账户已被冻结" +yourAccountSuspendedDescription: "由于违反了服务器的服务条款或其他原因,该账户已被冻结。 您可以与管理员联系以了解更多信息。 请不要创建一个新的帐户。" menu: "菜单" divider: "分割线" addItem: "添加项目" @@ -779,8 +781,10 @@ translate: "翻译" translatedFrom: "从 {x} 翻译" accountDeletionInProgress: "正在删除账户" usernameInfo: "在服务器上唯一标识您的帐户的名称。您可以使用字母 (a ~ z, A ~ Z)、数字 (0 ~ 9) 和下划线 (_)。用户名以后不能更改。" +aiChanMode: "小蓝模式" keepCw: "保留CW" pubSub: "Pub/Sub账户" +lastCommunication: "最近通信" resolved: "已解决" unresolved: "未解决" _accountDelete: @@ -1123,6 +1127,10 @@ _permissions: "write:user-groups": "操作用户组" "read:channels": "查看频道" "write:channels": "管理频道" + "read:gallery": "浏览图库" + "write:gallery": "操作图库" + "read:gallery-likes": "读取喜欢的图片" + "write:gallery-likes": "操作喜欢的图片" _auth: shareAccess: "您要授权允许“{name}”访问您的帐户吗?" shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?" @@ -1163,7 +1171,7 @@ _widgets: jobQueue: "作业队列" serverMetric: "服务器监控" aiscript: "AiScript控制台" - aichan: "蓝" + aichan: "小蓝" _cw: hide: "隐藏" show: "查看更多" diff --git a/package.json b/package.json index 90914c76a..2d0c1cc5f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo ", - "version": "12.90.1", + "version": "12.91.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.3", + "@types/bull": "3.15.4", "@types/cbor": "6.0.0", "@types/dateformat": "3.0.1", "@types/escape-regexp": "0.0.0", @@ -55,7 +55,7 @@ "@types/gulp": "4.0.9", "@types/gulp-rename": "2.0.1", "@types/is-url": "1.2.30", - "@types/js-yaml": "4.0.2", + "@types/js-yaml": "4.0.3", "@types/jsdom": "16.2.13", "@types/jsonld": "1.5.6", "@types/katex": "0.11.1", @@ -64,16 +64,16 @@ "@types/koa-cors": "0.0.2", "@types/koa-favicon": "2.0.21", "@types/koa-logger": "3.1.1", - "@types/koa-mount": "4.0.0", + "@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.7", - "@types/markdown-it": "12.0.3", + "@types/koa__router": "8.0.8", + "@types/markdown-it": "12.2.1", "@types/matter-js": "0.17.5", "@types/mocha": "8.2.3", - "@types/node": "16.6.2", + "@types/node": "16.9.6", "@types/node-fetch": "2.5.12", "@types/nodemailer": "6.4.4", "@types/nprogress": "0.2.0", @@ -86,13 +86,13 @@ "@types/qrcode": "1.4.1", "@types/random-seed": "0.3.3", "@types/ratelimiter": "3.4.2", - "@types/redis": "2.8.31", + "@types/redis": "2.8.32", "@types/rename": "1.0.4", "@types/request-stats": "3.0.0", "@types/rimraf": "3.0.2", "@types/seedrandom": "2.4.28", - "@types/sharp": "0.28.5", - "@types/sinonjs__fake-timers": "6.0.3", + "@types/sharp": "0.29.2", + "@types/sinonjs__fake-timers": "6.0.4", "@types/speakeasy": "2.0.6", "@types/throttle-debounce": "2.1.0", "@types/tinycolor2": "1.4.3", @@ -103,19 +103,19 @@ "@types/webpack-stream": "3.2.12", "@types/websocket": "1.0.4", "@types/ws": "7.4.7", - "@typescript-eslint/parser": "4.29.2", - "@vue/compiler-sfc": "3.2.4", + "@typescript-eslint/parser": "4.31.2", + "@vue/compiler-sfc": "3.2.13", "abort-controller": "3.0.0", - "apexcharts": "3.27.3", + "apexcharts": "3.28.3", "autobind-decorator": "2.4.0", "autosize": "4.0.4", "autwh": "0.1.0", - "aws-sdk": "2.966.0", + "aws-sdk": "2.992.0", "bcryptjs": "2.4.3", "blurhash": "1.1.4", "broadcast-channel": "4.2.0", - "bull": "3.28.1", - "cacheable-lookup": "6.0.0", + "bull": "3.29.2", + "cacheable-lookup": "6.0.1", "cafy": "15.2.1", "cbor": "8.0.0", "chalk": "4.1.2", @@ -126,12 +126,12 @@ "concurrently": "6.2.1", "content-disposition": "0.5.3", "crc-32": "1.2.0", - "css-loader": "6.2.0", + "css-loader": "6.3.0", "cssnano": "5.0.8", "dateformat": "4.5.1", "escape-regexp": "0.0.1", "eslint": "7.32.0", - "eslint-plugin-vue": "7.16.0", + "eslint-plugin-vue": "7.18.0", "eventemitter3": "4.0.7", "feed": "4.2.2", "file-type": "16.5.3", @@ -156,7 +156,7 @@ "json5-loader": "4.0.1", "jsonld": "5.2.0", "jsrsasign": "8.0.20", - "katex": "0.13.13", + "katex": "0.13.18", "koa": "2.13.1", "koa-bodyparser": "4.3.0", "koa-favicon": "2.1.0", @@ -182,15 +182,15 @@ "parse5": "6.0.1", "pg": "8.7.1", "portscanner": "2.2.0", - "postcss": "8.3.6", + "postcss": "8.3.7", "postcss-loader": "6.1.1", - "prismjs": "1.24.1", + "prismjs": "1.25.0", "private-ip": "2.2.1", "probe-image-size": "7.2.1", "promise-limit": "2.7.0", "pug": "3.0.2", "punycode": "2.1.1", - "pureimage": "0.3.2", + "pureimage": "0.3.5", "qrcode": "1.4.4", "random-seed": "0.3.0", "ratelimiter": "3.4.1", @@ -204,53 +204,54 @@ "rimraf": "3.0.2", "rndstr": "1.0.0", "s-age": "1.1.2", - "sass": "1.38.0", + "sass": "1.42.1", "sass-loader": "12.1.0", "seedrandom": "3.0.5", - "sharp": "0.29.0", + "sharp": "0.29.1", "speakeasy": "2.0.0", "stringz": "2.1.0", - "style-loader": "3.2.1", + "style-loader": "3.3.0", "summaly": "2.4.1", "syslog-pro": "1.0.0", - "systeminformation": "5.8.0", + "systeminformation": "5.9.3", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", "three": "0.117.1", "throttle-debounce": "3.0.1", "tinycolor2": "1.4.2", "tmp": "0.2.1", - "ts-loader": "9.2.5", + "ts-loader": "9.2.6", "ts-node": "10.2.1", "tsc-alias": "1.3.9", - "tsconfig-paths": "3.10.1", + "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.3.5", + "typescript": "4.4.3", "ulid": "2.3.0", "uuid": "8.3.2", "v-debounce": "0.1.2", - "vue": "3.2.4", - "vue-loader": "16.5.0", + "vanilla-tilt": "1.7.2", + "vue": "3.2.13", + "vue-loader": "16.7.0", "vue-prism-editor": "2.0.0-alpha.2", "vue-router": "4.0.5", "vue-style-loader": "4.1.3", "vue-svg-loader": "0.17.0-beta.2", "vuedraggable": "4.0.1", "web-push": "3.4.5", - "webpack": "5.51.0", + "webpack": "5.53.0", "webpack-cli": "4.8.0", "websocket": "1.0.34", - "ws": "8.2.0", + "ws": "8.2.2", "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.3.0", - "start-server-and-test": "1.13.1" + "cypress": "8.4.1", + "start-server-and-test": "1.14.0" } } diff --git a/src/client/account.ts b/src/client/account.ts index e469bae5a..6e26ac1f7 100644 --- a/src/client/account.ts +++ b/src/client/account.ts @@ -3,6 +3,7 @@ import { reactive } from 'vue'; import { apiUrl } from '@client/config'; import { waiting } from '@client/os'; import { unisonReload, reloadChannel } from '@client/scripts/unison-reload'; +import { showSuspendedDialog } from './scripts/show-suspended-dialog'; // TODO: 他のタブと永続化されたstateを同期 @@ -82,17 +83,20 @@ function fetchAccount(token): Promise { i: token }) }) + .then(res => res.json()) .then(res => { - // When failed to authenticate user - if (res.status !== 200 && res.status < 500) { - return signout(); + if (res.error) { + if (res.error.id === 'a8c724b3-6e9c-4b46-b1a8-bc3ed6258370') { + showSuspendedDialog().then(() => { + signout(); + }); + } else { + signout(); + } + } else { + res.token = token; + done(res); } - - // Parse response - res.json().then(i => { - i.token = token; - done(i); - }); }) .catch(fail); }); diff --git a/src/client/components/global/avatar.vue b/src/client/components/global/avatar.vue index eea970ec9..395ed5d8c 100644 --- a/src/client/components/global/avatar.vue +++ b/src/client/components/global/avatar.vue @@ -73,6 +73,22 @@ export default defineComponent({ diff --git a/src/client/components/mfm.ts b/src/client/components/mfm.ts index c248f934d..a228ca4b8 100644 --- a/src/client/components/mfm.ts +++ b/src/client/components/mfm.ts @@ -8,6 +8,7 @@ import { concat } from '@client/../prelude/array'; import MkFormula from '@client/components/formula.vue'; import MkCode from '@client/components/code.vue'; import MkGoogle from '@client/components/google.vue'; +import MkSparkle from '@client/components/sparkle.vue'; import MkA from '@client/components/global/a.vue'; import { host } from '@client/config'; @@ -169,6 +170,19 @@ export default defineComponent({ style = this.$store.state.animatedMfm ? 'animation: mfm-rainbow 1s linear infinite;' : ''; break; } + case 'sparkle': { + if (!this.$store.state.animatedMfm) { + return genEl(token.children); + } + let count = token.props.args.count ? parseInt(token.props.args.count) : 10; + if (count > 100) { + count = 100; + } + const speed = token.props.args.speed ? parseFloat(token.props.args.speed) : 1; + return h(MkSparkle, { + count, speed, + }, genEl(token.children)); + } } if (style == null) { return h('span', {}, ['[', token.props.name, ...genEl(token.children), ']']); diff --git a/src/client/components/note-header.vue b/src/client/components/note-header.vue index 7758dea3a..80bfea9b0 100644 --- a/src/client/components/note-header.vue +++ b/src/client/components/note-header.vue @@ -3,10 +3,10 @@ - bot - - - +
bot
+
+
+
@@ -55,6 +55,7 @@ export default defineComponent({ white-space: nowrap; > .name { + flex-shrink: 1; display: block; margin: 0 .5em 0 0; padding: 0; @@ -81,17 +82,20 @@ export default defineComponent({ > .admin, > .moderator { + flex-shrink: 0; margin-right: 0.5em; color: var(--badge); } > .username { + flex-shrink: 9999999; margin: 0 .5em 0 0; overflow: hidden; text-overflow: ellipsis; } > .info { + flex-shrink: 0; margin-left: auto; font-size: 0.9em; diff --git a/src/client/components/page-window.vue b/src/client/components/page-window.vue index c83b040dd..fbc9f0b7f 100644 --- a/src/client/components/page-window.vue +++ b/src/client/components/page-window.vue @@ -8,7 +8,7 @@ @closed="$emit('closed')" >
diff --git a/src/client/components/signin.vue b/src/client/components/signin.vue index c051288d0..69f527b7d 100755 --- a/src/client/components/signin.vue +++ b/src/client/components/signin.vue @@ -54,6 +54,7 @@ import { apiUrl, host } from '@client/config'; import { byteify, hexify } from '@client/scripts/2fa'; import * as os from '@client/os'; import { login } from '@client/account'; +import { showSuspendedDialog } from '../scripts/show-suspended-dialog'; export default defineComponent({ components: { @@ -169,15 +170,7 @@ export default defineComponent({ this.signing = false; this.challengeData = res; return this.queryKey(); - }).catch(() => { - os.dialog({ - type: 'error', - text: this.$ts.signinFailed - }); - this.challengeData = null; - this.totpLogin = false; - this.signing = false; - }); + }).catch(this.loginFailed); } else { this.totpLogin = true; this.signing = false; @@ -190,14 +183,36 @@ export default defineComponent({ }).then(res => { this.$emit('login', res); this.onLogin(res); - }).catch(() => { + }).catch(this.loginFailed); + } + }, + + loginFailed(err) { + switch (err.id) { + case '6cc579cc-885d-43d8-95c2-b8c7fc963280': { os.dialog({ type: 'error', - text: this.$ts.loginFailed + title: this.$ts.loginFailed, + text: this.$ts.noSuchUser }); - this.signing = false; - }); + break; + } + case 'e03a5f46-d309-4865-9b69-56282d94e1eb': { + showSuspendedDialog(); + break; + } + default: { + os.dialog({ + type: 'error', + title: this.$ts.loginFailed, + text: JSON.stringify(err) + }); + } } + + this.challengeData = null; + this.totpLogin = false; + this.signing = false; }, resetPassword() { diff --git a/src/client/components/sparkle.vue b/src/client/components/sparkle.vue new file mode 100644 index 000000000..942412b44 --- /dev/null +++ b/src/client/components/sparkle.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/src/client/components/ui/folder.vue b/src/client/components/ui/folder.vue index 1f3593a74..eecf1d8be 100644 --- a/src/client/components/ui/folder.vue +++ b/src/client/components/ui/folder.vue @@ -99,7 +99,8 @@ export default defineComponent({ z-index: 10; position: sticky; top: var(--stickyTop, 0px); - background: var(--panel); + padding: var(--x-padding); + background: var(--x-header, var(--panel)); /* TODO panelの半透明バージョンをプログラマティックに作りたい background: var(--X17); -webkit-backdrop-filter: var(--blur, blur(8px)); diff --git a/src/client/components/ui/input.vue b/src/client/components/ui/input.vue index 05ce5d3e1..a916a0b03 100644 --- a/src/client/components/ui/input.vue +++ b/src/client/components/ui/input.vue @@ -245,7 +245,7 @@ export default defineComponent({ font-size: 1em; color: var(--fg); background: var(--panel); - border: solid 1px var(--inputBorder); + border: solid 0.5px var(--inputBorder); border-radius: 6px; outline: none; box-shadow: none; diff --git a/src/client/components/ui/menu.vue b/src/client/components/ui/menu.vue index d652d9b84..26b4b04b1 100644 --- a/src/client/components/ui/menu.vue +++ b/src/client/components/ui/menu.vue @@ -41,7 +41,7 @@ + + diff --git a/src/client/pages/emojis.category.vue b/src/client/pages/emojis.category.vue new file mode 100644 index 000000000..091c3f20a --- /dev/null +++ b/src/client/pages/emojis.category.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/src/client/pages/emojis.emoji.vue b/src/client/pages/emojis.emoji.vue new file mode 100644 index 000000000..3c9bb4deb --- /dev/null +++ b/src/client/pages/emojis.emoji.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/src/client/pages/emojis.vue b/src/client/pages/emojis.vue index 391aff829..8918de233 100644 --- a/src/client/pages/emojis.vue +++ b/src/client/pages/emojis.vue @@ -1,151 +1,36 @@ - diff --git a/src/client/pages/favorites.vue b/src/client/pages/favorites.vue index a2d61b98d..f13723c2d 100644 --- a/src/client/pages/favorites.vue +++ b/src/client/pages/favorites.vue @@ -22,7 +22,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.favorites, - icon: 'fas fa-star' + icon: 'fas fa-star', + bg: 'var(--bg)', }, pagination: { endpoint: 'i/favorites', diff --git a/src/client/pages/mfm-cheat-sheet.vue b/src/client/pages/mfm-cheat-sheet.vue index 95ddc1cbd..314b5e2a5 100644 --- a/src/client/pages/mfm-cheat-sheet.vue +++ b/src/client/pages/mfm-cheat-sheet.vue @@ -271,6 +271,16 @@
+
+
{{ $ts._mfm.sparkle }}
+
+

{{ $ts._mfm.sparkleDescription }}

+
+ + MFM +
+
+
@@ -294,7 +304,7 @@ export default defineComponent({ preview_hashtag: '#test', preview_url: `https://example.com`, preview_link: `[${this.$ts._mfm.dummy}](https://example.com)`, - preview_emoji: `:${this.$instance.emojis[0].name}:`, + preview_emoji: this.$instance.emojis.length ? `:${this.$instance.emojis[0].name}:` : `:emojiname:`, preview_bold: `**${this.$ts._mfm.dummy}**`, preview_small: `${this.$ts._mfm.dummy}`, preview_center: `
${this.$ts._mfm.dummy}
`, @@ -317,6 +327,7 @@ export default defineComponent({ preview_x4: `$[x4 🍮]`, preview_blur: `$[blur ${this.$ts._mfm.dummy}]`, preview_rainbow: `$[rainbow 🍮]`, + preview_sparkle: `$[sparkle 🍮]`, } }, }); diff --git a/src/client/pages/note.vue b/src/client/pages/note.vue index 7725ca14b..fe85d7364 100644 --- a/src/client/pages/note.vue +++ b/src/client/pages/note.vue @@ -1,37 +1,39 @@ @@ -63,12 +65,14 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: computed(() => this.note ? { title: this.$ts.note, + subtitle: new Date(this.note.createdAt).toLocaleString(), avatar: this.note.user, path: `/notes/${this.note.id}`, share: { title: this.$t('noteOf', { user: this.note.user.name }), text: this.note.text, }, + bg: 'var(--bg)', } : null), note: null, clips: null, @@ -149,52 +153,54 @@ export default defineComponent({ .fcuexfpr { background: var(--bg); - > .note { - > .main { - > .load { - min-width: 0; - margin: 0 auto; - border-radius: 999px; + > ._root { + > .note { + > .main { + > .load { + min-width: 0; + margin: 0 auto; + border-radius: 999px; - &.next { - margin-bottom: var(--margin); - } - - &.prev { - margin-top: var(--margin); - } - } - - > .note { - > .note { - border-radius: var(--radius); - background: var(--panel); - } - } - - > .clips { - > .title { - font-weight: bold; - padding: 12px; - } - - > .item { - display: block; - padding: 16px; - - > .description { - padding: 8px 0; + &.next { + margin-bottom: var(--margin); } - > .user { - $height: 32px; - padding-top: 16px; - border-top: solid 0.5px var(--divider); - line-height: $height; + &.prev { + margin-top: var(--margin); + } + } - > .avatar { - width: $height; - height: $height; + > .note { + > .note { + border-radius: var(--radius); + background: var(--panel); + } + } + + > .clips { + > .title { + font-weight: bold; + padding: 12px; + } + + > .item { + display: block; + padding: 16px; + + > .description { + padding: 8px 0; + } + + > .user { + $height: 32px; + padding-top: 16px; + border-top: solid 0.5px var(--divider); + line-height: $height; + + > .avatar { + width: $height; + height: $height; + } } } } diff --git a/src/client/pages/notifications.vue b/src/client/pages/notifications.vue index 633718a90..06f8ad3cb 100644 --- a/src/client/pages/notifications.vue +++ b/src/client/pages/notifications.vue @@ -21,6 +21,7 @@ export default defineComponent({ [symbols.PAGE_INFO]: { title: this.$ts.notifications, icon: 'fas fa-bell', + bg: 'var(--bg)', actions: [{ text: this.$ts.markAllAsRead, icon: 'fas fa-check', diff --git a/src/client/pages/settings/index.vue b/src/client/pages/settings/index.vue index e7e250602..3fb5f5f1e 100644 --- a/src/client/pages/settings/index.vue +++ b/src/client/pages/settings/index.vue @@ -86,7 +86,8 @@ export default defineComponent({ setup(props, context) { const indexInfo = { title: i18n.locale.settings, - icon: 'fas fa-cog' + icon: 'fas fa-cog', + bg: 'var(--bg)', }; const INFO = ref(indexInfo); const page = ref(props.initialPage); diff --git a/src/client/pages/settings/other.vue b/src/client/pages/settings/other.vue index 685795035..21b543904 100644 --- a/src/client/pages/settings/other.vue +++ b/src/client/pages/settings/other.vue @@ -26,7 +26,7 @@ BIOS CLI - {{ $ts.closeAccount }} + {{ $ts.closeAccount }} diff --git a/src/client/pages/timeline.vue b/src/client/pages/timeline.vue index f54549b98..9dda82462 100644 --- a/src/client/pages/timeline.vue +++ b/src/client/pages/timeline.vue @@ -1,31 +1,13 @@