Merge branch 'develop' into pr/ThatOneCalculator/8764
This commit is contained in:
commit
7ddfd049a4
234 changed files with 7586 additions and 783 deletions
36
.github/workflows/ok-to-test.yml
vendored
Normal file
36
.github/workflows/ok-to-test.yml
vendored
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
# If someone with write access comments "/ok-to-test" on a pull request, emit a repository_dispatch event
|
||||||
|
name: Ok To Test
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ok-to-test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# Only run for PRs, not issue comments
|
||||||
|
if: ${{ github.event.issue.pull_request }}
|
||||||
|
steps:
|
||||||
|
# Generate a GitHub App installation access token from an App ID and private key
|
||||||
|
# To create a new GitHub App:
|
||||||
|
# https://developer.github.com/apps/building-github-apps/creating-a-github-app/
|
||||||
|
# See app.yml for an example app manifest
|
||||||
|
- name: Generate token
|
||||||
|
id: generate_token
|
||||||
|
uses: tibdex/github-app-token@v1
|
||||||
|
with:
|
||||||
|
app_id: ${{ secrets.DEPLOYBOT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.DEPLOYBOT_PRIVATE_KEY }}
|
||||||
|
|
||||||
|
- name: Slash Command Dispatch
|
||||||
|
uses: peter-evans/slash-command-dispatch@v1
|
||||||
|
env:
|
||||||
|
TOKEN: ${{ steps.generate_token.outputs.token }}
|
||||||
|
with:
|
||||||
|
token: ${{ env.TOKEN }} # GitHub App installation access token
|
||||||
|
# token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} # PAT or OAuth token will also work
|
||||||
|
reaction-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-type: pull-request
|
||||||
|
commands: deploy
|
||||||
|
named-args: true
|
||||||
|
permission: write
|
95
.github/workflows/pr-preview-deploy.yml
vendored
Normal file
95
.github/workflows/pr-preview-deploy.yml
vendored
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
# Run secret-dependent integration tests only after /deploy approval
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, reopened, synchronize]
|
||||||
|
repository_dispatch:
|
||||||
|
types: [deploy-command]
|
||||||
|
|
||||||
|
name: Deploy preview environment
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# Repo owner has commented /deploy on a (fork-based) pull request
|
||||||
|
deploy-preview-environment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if:
|
||||||
|
github.event_name == 'repository_dispatch' &&
|
||||||
|
github.event.client_payload.slash_command.sha != '' &&
|
||||||
|
contains(github.event.client_payload.pull_request.head.sha, github.event.client_payload.slash_command.sha)
|
||||||
|
steps:
|
||||||
|
- uses: actions/github-script@v5
|
||||||
|
id: check-id
|
||||||
|
env:
|
||||||
|
number: ${{ github.event.client_payload.pull_request.number }}
|
||||||
|
job: ${{ github.job }}
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
result-encoding: string
|
||||||
|
script: |
|
||||||
|
const { data: pull } = await github.rest.pulls.get({
|
||||||
|
...context.repo,
|
||||||
|
pull_number: process.env.number
|
||||||
|
});
|
||||||
|
const ref = pull.head.sha;
|
||||||
|
|
||||||
|
const { data: checks } = await github.rest.checks.listForRef({
|
||||||
|
...context.repo,
|
||||||
|
ref
|
||||||
|
});
|
||||||
|
|
||||||
|
const check = checks.check_runs.filter(c => c.name === process.env.job);
|
||||||
|
|
||||||
|
return check[0].id;
|
||||||
|
|
||||||
|
- uses: actions/github-script@v5
|
||||||
|
env:
|
||||||
|
check_id: ${{ steps.check-id.outputs.result }}
|
||||||
|
details_url: ${{ github.server_url }}/${{ github.repository }}/runs/${{ github.run_id }}
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
script: |
|
||||||
|
await github.rest.checks.update({
|
||||||
|
...context.repo,
|
||||||
|
check_run_id: process.env.check_id,
|
||||||
|
status: 'in_progress',
|
||||||
|
details_url: process.env.details_url
|
||||||
|
});
|
||||||
|
|
||||||
|
# Check out merge commit
|
||||||
|
- name: Fork based /deploy checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: 'refs/pull/${{ github.event.client_payload.pull_request.number }}/merge'
|
||||||
|
|
||||||
|
# <insert integration tests needing secrets>
|
||||||
|
- name: Context
|
||||||
|
uses: okteto/context@latest
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.OKTETO_TOKEN }}
|
||||||
|
|
||||||
|
- name: Deploy preview environment
|
||||||
|
uses: ikuradon/deploy-preview@latest
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
name: pr-${{ github.event.client_payload.pull_request.number }}-syuilo
|
||||||
|
timeout: 15m
|
||||||
|
|
||||||
|
# Update check run called "integration-fork"
|
||||||
|
- uses: actions/github-script@v5
|
||||||
|
id: update-check-run
|
||||||
|
if: ${{ always() }}
|
||||||
|
env:
|
||||||
|
# Conveniently, job.status maps to https://developer.github.com/v3/checks/runs/#update-a-check-run
|
||||||
|
conclusion: ${{ job.status }}
|
||||||
|
check_id: ${{ steps.check-id.outputs.result }}
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
script: |
|
||||||
|
const { data: result } = await github.rest.checks.update({
|
||||||
|
...context.repo,
|
||||||
|
check_run_id: process.env.check_id,
|
||||||
|
status: 'completed',
|
||||||
|
conclusion: process.env.conclusion
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
21
.github/workflows/pr-preview-destroy.yml
vendored
Normal file
21
.github/workflows/pr-preview-destroy.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# file: .github/workflows/preview-closed.yaml
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- closed
|
||||||
|
|
||||||
|
name: Destroy preview environment
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
destroy-preview-environment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Context
|
||||||
|
uses: okteto/context@latest
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.OKTETO_TOKEN }}
|
||||||
|
|
||||||
|
- name: Destroy preview environment
|
||||||
|
uses: okteto/destroy-preview@latest
|
||||||
|
with:
|
||||||
|
name: pr-${{ github.event.number }}-syuilo
|
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
|
@ -98,7 +98,7 @@ jobs:
|
||||||
- name: ALSA Env
|
- name: ALSA Env
|
||||||
run: echo -e 'pcm.!default {\n type hw\n card 0\n}\n\nctl.!default {\n type hw\n card 0\n}' > ~/.asoundrc
|
run: echo -e 'pcm.!default {\n type hw\n card 0\n}\n\nctl.!default {\n type hw\n card 0\n}' > ~/.asoundrc
|
||||||
- name: Cypress run
|
- name: Cypress run
|
||||||
uses: cypress-io/github-action@v2
|
uses: cypress-io/github-action@v4
|
||||||
with:
|
with:
|
||||||
install: false
|
install: false
|
||||||
start: yarn start:test
|
start: yarn start:test
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
v16.0.0
|
v16.15.0
|
||||||
|
|
27
CHANGELOG.md
27
CHANGELOG.md
|
@ -10,14 +10,37 @@ You should also include the user name that made the change.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## 12.x.x (unreleased)
|
## 12.x.x (unreleased)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- Server: Add rate limit to i/notifications @tamaina
|
||||||
|
- Client: Improve files page of control panel @syuilo
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- Server: Fix GenerateVideoThumbnail failed @mei23
|
||||||
|
- Server: Ensure temp directory cleanup @Johann150
|
||||||
|
|
||||||
|
## 12.111.1 (2022/06/13)
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- some fixes of multiple notification read @tamaina
|
||||||
|
- some GenerateVideoThumbnail failed @Johann150
|
||||||
|
- Client: デッキでウィジェットの情報が保存されない問題を修正 @syuilo
|
||||||
|
- Client: ギャラリーの投稿を開こうとすると編集画面が表示される @futchitwo
|
||||||
|
|
||||||
|
## 12.111.0 (2022/06/11)
|
||||||
|
### Note
|
||||||
|
- Node.js 16.15.0 or later is required
|
||||||
|
|
||||||
### Improvements
|
### Improvements
|
||||||
- Supports Unicode Emoji 14.0 @mei23
|
- Supports Unicode Emoji 14.0 @mei23
|
||||||
- プッシュ通知を複数アカウント対応に #7667 @tamaina
|
- プッシュ通知を複数アカウント対応に #7667 @tamaina
|
||||||
- プッシュ通知にクリックやactionを設定 #7667 @tamaina
|
- プッシュ通知にクリックやactionを設定 #7667 @tamaina
|
||||||
- ドライブに画像ファイルをアップロードするときオリジナル画像を破棄してwebpublicのみ保持するオプション @tamaina
|
- ドライブに画像ファイルをアップロードするときオリジナル画像を破棄してwebpublicのみ保持するオプション @tamaina
|
||||||
- Server: always remove completed tasks of job queue @Johann150
|
- Server: always remove completed tasks of job queue @Johann150
|
||||||
|
- Client: アバターの設定で画像をクロップできるように @syuilo
|
||||||
- Client: make emoji stand out more on reaction button @Johann150
|
- Client: make emoji stand out more on reaction button @Johann150
|
||||||
- Client: display URL of QR code for TOTP registration @tamaina
|
- Client: display URL of QR code for TOTP registration @tamaina
|
||||||
|
- Client: render quote renote CWs as MFM @pixeldesu
|
||||||
- API: notifications/readは配列でも受け付けるように #7667 @tamaina
|
- API: notifications/readは配列でも受け付けるように #7667 @tamaina
|
||||||
- API: ユーザー検索で、クエリがusernameの条件を満たす場合はusernameもLIKE検索するように @tamaina
|
- API: ユーザー検索で、クエリがusernameの条件を満たす場合はusernameもLIKE検索するように @tamaina
|
||||||
- MFM: Allow speed changes in all animated MFMs @Johann150
|
- MFM: Allow speed changes in all animated MFMs @Johann150
|
||||||
|
@ -31,16 +54,14 @@ You should also include the user name that made the change.
|
||||||
|
|
||||||
### Bugfixes
|
### Bugfixes
|
||||||
- Server: keep file order of note attachement @Johann150
|
- Server: keep file order of note attachement @Johann150
|
||||||
- Server: fix caching @Johann150
|
|
||||||
- Server: await promises when following or unfollowing users @Johann150
|
|
||||||
- Server: fix missing foreign key for reports leading to reports page being unusable @Johann150
|
- Server: fix missing foreign key for reports leading to reports page being unusable @Johann150
|
||||||
- Server: fix internal in-memory caching @Johann150
|
- Server: fix internal in-memory caching @Johann150
|
||||||
- Server: use correct order of attachments on notes @Johann150
|
|
||||||
- Server: prevent crash when processing certain PNGs @syuilo
|
- Server: prevent crash when processing certain PNGs @syuilo
|
||||||
- Server: Fix unable to generate video thumbnails @mei23
|
- Server: Fix unable to generate video thumbnails @mei23
|
||||||
- Server: Fix `Cannot find module` issue @mei23
|
- Server: Fix `Cannot find module` issue @mei23
|
||||||
- Federation: Add rel attribute to host-meta @mei23
|
- Federation: Add rel attribute to host-meta @mei23
|
||||||
- Federation: add id for activitypub follows @Johann150
|
- Federation: add id for activitypub follows @Johann150
|
||||||
|
- Federation: use `source` instead of `_misskey_content` @Johann150
|
||||||
- Federation: ensure resolver does not fetch local resources via HTTP(S) @Johann150
|
- Federation: ensure resolver does not fetch local resources via HTTP(S) @Johann150
|
||||||
- Federation: correctly render empty note text @Johann150
|
- Federation: correctly render empty note text @Johann150
|
||||||
- Federation: Fix quote renotes containing no text being federated correctly @Johann150
|
- Federation: Fix quote renotes containing no text being federated correctly @Johann150
|
||||||
|
|
|
@ -66,6 +66,13 @@ Be willing to comment on the good points and not just the things you want fixed
|
||||||
- Are there any omissions or gaps?
|
- Are there any omissions or gaps?
|
||||||
- Does it check for anomalies?
|
- Does it check for anomalies?
|
||||||
|
|
||||||
|
## Deploy
|
||||||
|
The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment.
|
||||||
|
```
|
||||||
|
/deploy sha=<commit hash>
|
||||||
|
```
|
||||||
|
An actual domain will be assigned so you can test the federation.
|
||||||
|
|
||||||
## Merge
|
## Merge
|
||||||
For now, basically only @syuilo has the authority to merge PRs into develop because he is most familiar with the codebase.
|
For now, basically only @syuilo has the authority to merge PRs into develop because he is most familiar with the codebase.
|
||||||
However, minor fixes, refactoring, and urgent changes may be merged at the discretion of a contributor.
|
However, minor fixes, refactoring, and urgent changes may be merged at the discretion of a contributor.
|
||||||
|
@ -77,9 +84,9 @@ However, minor fixes, refactoring, and urgent changes may be merged at the discr
|
||||||
- Into `master` from `develop` branch.
|
- Into `master` from `develop` branch.
|
||||||
- The title must be in the format `Release: x.y.z`.
|
- The title must be in the format `Release: x.y.z`.
|
||||||
- `x.y.z` is the new version you are trying to release.
|
- `x.y.z` is the new version you are trying to release.
|
||||||
- Assign about 2~3 reviewers.
|
3. Deploy and perform a simple QA check. Also verify that the tests passed.
|
||||||
3. The release PR is approved, merge it.
|
4. Merge it.
|
||||||
4. Create a [release of GitHub](https://github.com/misskey-dev/misskey/releases)
|
5. Create a [release of GitHub](https://github.com/misskey-dev/misskey/releases)
|
||||||
- The target branch must be `master`
|
- The target branch must be `master`
|
||||||
- The tag name must be the version
|
- The tag name must be the version
|
||||||
|
|
||||||
|
|
12
cypress.config.ts
Normal file
12
cypress.config.ts
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import { defineConfig } from 'cypress'
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
e2e: {
|
||||||
|
// We've imported your old cypress plugins here.
|
||||||
|
// You may want to clean this up later by importing these.
|
||||||
|
setupNodeEvents(on, config) {
|
||||||
|
return require('./cypress/plugins/index.js')(on, config)
|
||||||
|
},
|
||||||
|
baseUrl: 'http://localhost:61812',
|
||||||
|
},
|
||||||
|
})
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
"baseUrl": "http://localhost:61812"
|
|
||||||
}
|
|
|
@ -1007,7 +1007,6 @@ _sfx:
|
||||||
antenna: "الهوائيات"
|
antenna: "الهوائيات"
|
||||||
channel: "إشعارات القنات"
|
channel: "إشعارات القنات"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "مجهول"
|
|
||||||
future: "المستقبَل"
|
future: "المستقبَل"
|
||||||
justNow: "اللحظة"
|
justNow: "اللحظة"
|
||||||
secondsAgo: "منذ {n} ثوانٍ"
|
secondsAgo: "منذ {n} ثوانٍ"
|
||||||
|
|
|
@ -831,11 +831,18 @@ themeColor: "থিমের রং"
|
||||||
size: "আকার"
|
size: "আকার"
|
||||||
numberOfColumn: "কলামের সংখ্যা"
|
numberOfColumn: "কলামের সংখ্যা"
|
||||||
searchByGoogle: "গুগল"
|
searchByGoogle: "গুগল"
|
||||||
|
instanceDefaultLightTheme: "ইন্সট্যান্সের ডিফল্ট লাইট থিম"
|
||||||
|
instanceDefaultDarkTheme: "ইন্সট্যান্সের ডিফল্ট ডার্ক থিম"
|
||||||
|
instanceDefaultThemeDescription: "অবজেক্ট ফরম্যাটে থিম কোড লিখুন"
|
||||||
|
mutePeriod: "মিউটের সময়কাল"
|
||||||
indefinitely: "অনির্দিষ্ট"
|
indefinitely: "অনির্দিষ্ট"
|
||||||
tenMinutes: "১০ মিনিট"
|
tenMinutes: "১০ মিনিট"
|
||||||
oneHour: "১ ঘণ্টা"
|
oneHour: "১ ঘণ্টা"
|
||||||
oneDay: "একদিন"
|
oneDay: "একদিন"
|
||||||
oneWeek: "এক সপ্তাহ"
|
oneWeek: "এক সপ্তাহ"
|
||||||
|
reflectMayTakeTime: "এটির কাজ দেখা যেতে কিছুটা সময় লাগতে পারে।"
|
||||||
|
failedToFetchAccountInformation: "অ্যাকাউন্টের তথ্য উদ্ধার করা যায়নি"
|
||||||
|
rateLimitExceeded: "রেট লিমিট ছাড়িয়ে গেছে "
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে"
|
used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে"
|
||||||
format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি"
|
format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি"
|
||||||
|
@ -1081,7 +1088,6 @@ _sfx:
|
||||||
antenna: "অ্যান্টেনাগুলি"
|
antenna: "অ্যান্টেনাগুলি"
|
||||||
channel: "চ্যানেলের বিজ্ঞপ্তি"
|
channel: "চ্যানেলের বিজ্ঞপ্তি"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "অজানা"
|
|
||||||
future: "ভবিষ্যৎ"
|
future: "ভবিষ্যৎ"
|
||||||
justNow: "এইমাত্র"
|
justNow: "এইমাত্র"
|
||||||
secondsAgo: "{n} সেকেন্ড আগে"
|
secondsAgo: "{n} সেকেন্ড আগে"
|
||||||
|
@ -1125,6 +1131,7 @@ _2fa:
|
||||||
registerKey: "সিকিউরিটি কী নিবন্ধন করুন"
|
registerKey: "সিকিউরিটি কী নিবন্ধন করুন"
|
||||||
step1: "প্রথমে, আপনার ডিভাইসে {a} বা {b} এর মতো একটি অথেনটিকেশন অ্যাপ ইনস্টল করুন৷"
|
step1: "প্রথমে, আপনার ডিভাইসে {a} বা {b} এর মতো একটি অথেনটিকেশন অ্যাপ ইনস্টল করুন৷"
|
||||||
step2: "এরপরে, অ্যাপের সাহায্যে প্রদর্শিত QR কোডটি স্ক্যান করুন।"
|
step2: "এরপরে, অ্যাপের সাহায্যে প্রদর্শিত QR কোডটি স্ক্যান করুন।"
|
||||||
|
step2Url: "ডেস্কটপ অ্যাপে, নিম্নলিখিত URL লিখুন:"
|
||||||
step3: "অ্যাপে প্রদর্শিত টোকেনটি লিখুন এবং আপনার কাজ শেষ।"
|
step3: "অ্যাপে প্রদর্শিত টোকেনটি লিখুন এবং আপনার কাজ শেষ।"
|
||||||
step4: "আপনাকে এখন থেকে লগ ইন করার সময়, এইভাবে টোকেন লিখতে হবে।"
|
step4: "আপনাকে এখন থেকে লগ ইন করার সময়, এইভাবে টোকেন লিখতে হবে।"
|
||||||
securityKeyInfo: "আপনি একটি হার্ডওয়্যার সিকিউরিটি কী ব্যবহার করে লগ ইন করতে পারেন যা FIDO2 বা ডিভাইসের ফিঙ্গারপ্রিন্ট সেন্সর বা পিন সমর্থন করে৷"
|
securityKeyInfo: "আপনি একটি হার্ডওয়্যার সিকিউরিটি কী ব্যবহার করে লগ ইন করতে পারেন যা FIDO2 বা ডিভাইসের ফিঙ্গারপ্রিন্ট সেন্সর বা পিন সমর্থন করে৷"
|
||||||
|
@ -1608,6 +1615,8 @@ _notification:
|
||||||
youReceivedFollowRequest: "অনুসরণ করার জন্য অনুরোধ পাওয়া গেছে"
|
youReceivedFollowRequest: "অনুসরণ করার জন্য অনুরোধ পাওয়া গেছে"
|
||||||
yourFollowRequestAccepted: "আপনার অনুসরণ করার অনুরোধ গৃহীত হয়েছে"
|
yourFollowRequestAccepted: "আপনার অনুসরণ করার অনুরোধ গৃহীত হয়েছে"
|
||||||
youWereInvitedToGroup: "আপনি একটি গ্রুপে আমন্ত্রিত হয়েছেন"
|
youWereInvitedToGroup: "আপনি একটি গ্রুপে আমন্ত্রিত হয়েছেন"
|
||||||
|
pollEnded: "পোলের ফলাফল দেখা যাবে"
|
||||||
|
emptyPushNotificationMessage: "আপডেট করা পুশ বিজ্ঞপ্তি"
|
||||||
_types:
|
_types:
|
||||||
all: "সকল"
|
all: "সকল"
|
||||||
follow: "অনুসরণ করা হচ্ছে"
|
follow: "অনুসরণ করা হচ্ছে"
|
||||||
|
@ -1617,11 +1626,13 @@ _notification:
|
||||||
quote: "উদ্ধৃতি"
|
quote: "উদ্ধৃতি"
|
||||||
reaction: "প্রতিক্রিয়া"
|
reaction: "প্রতিক্রিয়া"
|
||||||
pollVote: "পোলে ভোট আছে"
|
pollVote: "পোলে ভোট আছে"
|
||||||
|
pollEnded: "পোল শেষ"
|
||||||
receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ"
|
receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ"
|
||||||
followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ"
|
followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ"
|
||||||
groupInvited: "গ্রুপের আমন্ত্রনসমূহ"
|
groupInvited: "গ্রুপের আমন্ত্রনসমূহ"
|
||||||
app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি"
|
app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি"
|
||||||
_actions:
|
_actions:
|
||||||
|
followBack: "ফলো ব্যাক করেছে"
|
||||||
reply: "জবাব"
|
reply: "জবাব"
|
||||||
renote: "রিনোট"
|
renote: "রিনোট"
|
||||||
_deck:
|
_deck:
|
||||||
|
|
|
@ -134,6 +134,8 @@ _theme:
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Notes"
|
note: "Notes"
|
||||||
notification: "Notificacions"
|
notification: "Notificacions"
|
||||||
|
_2fa:
|
||||||
|
step2Url: "També pots inserir aquest enllaç i utilitzes una aplicació d'escriptori:"
|
||||||
_widgets:
|
_widgets:
|
||||||
notifications: "Notificacions"
|
notifications: "Notificacions"
|
||||||
timeline: "Línia de temps"
|
timeline: "Línia de temps"
|
||||||
|
|
|
@ -842,6 +842,9 @@ oneDay: "Einen Tag"
|
||||||
oneWeek: "Eine Woche"
|
oneWeek: "Eine Woche"
|
||||||
reflectMayTakeTime: "Es kann etwas dauern, bis sich dies widerspiegelt."
|
reflectMayTakeTime: "Es kann etwas dauern, bis sich dies widerspiegelt."
|
||||||
failedToFetchAccountInformation: "Benutzerkontoinformationen konnten nicht abgefragt werden"
|
failedToFetchAccountInformation: "Benutzerkontoinformationen konnten nicht abgefragt werden"
|
||||||
|
rateLimitExceeded: "Versuchsanzahl überschritten"
|
||||||
|
cropImage: "Bild zuschneiden"
|
||||||
|
cropImageAsk: "Möchtest du das Bild zuschneiden?"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "Diese Email-Adresse wird bereits verwendet"
|
used: "Diese Email-Adresse wird bereits verwendet"
|
||||||
format: "Das Format dieser Email-Adresse ist ungültig"
|
format: "Das Format dieser Email-Adresse ist ungültig"
|
||||||
|
@ -1087,7 +1090,6 @@ _sfx:
|
||||||
antenna: "Antennen"
|
antenna: "Antennen"
|
||||||
channel: "Kanalbenachrichtigung"
|
channel: "Kanalbenachrichtigung"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Unbekannt"
|
|
||||||
future: "Zukunft"
|
future: "Zukunft"
|
||||||
justNow: "Gerade eben"
|
justNow: "Gerade eben"
|
||||||
secondsAgo: "vor {n} Sekunde(n)"
|
secondsAgo: "vor {n} Sekunde(n)"
|
||||||
|
@ -1131,6 +1133,7 @@ _2fa:
|
||||||
registerKey: "Neuen Sicherheitsschlüssel registrieren"
|
registerKey: "Neuen Sicherheitsschlüssel registrieren"
|
||||||
step1: "Installiere zuerst eine Authentifizierungsapp (z.B. {a} oder {b}) auf deinem Gerät."
|
step1: "Installiere zuerst eine Authentifizierungsapp (z.B. {a} oder {b}) auf deinem Gerät."
|
||||||
step2: "Dann, scanne den angezeigten QR-Code mit deinem Gerät."
|
step2: "Dann, scanne den angezeigten QR-Code mit deinem Gerät."
|
||||||
|
step2Url: "Nutzt du ein Desktopprogramm kannst du alternativ diese URL eingeben:"
|
||||||
step3: "Gib zum Abschluss den Token ein, der von deiner App angezeigt wird."
|
step3: "Gib zum Abschluss den Token ein, der von deiner App angezeigt wird."
|
||||||
step4: "Alle folgenden Anmeldungsversuche werden ab sofort die Eingabe eines solchen Tokens benötigen."
|
step4: "Alle folgenden Anmeldungsversuche werden ab sofort die Eingabe eines solchen Tokens benötigen."
|
||||||
securityKeyInfo: "Du kannst neben Fingerabdruck- oder PIN-Authentifizierung auf deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels einrichten."
|
securityKeyInfo: "Du kannst neben Fingerabdruck- oder PIN-Authentifizierung auf deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels einrichten."
|
||||||
|
|
|
@ -842,6 +842,9 @@ oneDay: "One day"
|
||||||
oneWeek: "One week"
|
oneWeek: "One week"
|
||||||
reflectMayTakeTime: "It may take some time for this to be reflected."
|
reflectMayTakeTime: "It may take some time for this to be reflected."
|
||||||
failedToFetchAccountInformation: "Could not fetch account information"
|
failedToFetchAccountInformation: "Could not fetch account information"
|
||||||
|
rateLimitExceeded: "Rate limit exceeded"
|
||||||
|
cropImage: "Crop image"
|
||||||
|
cropImageAsk: "Do you want to crop this image?"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "This email address is already being used"
|
used: "This email address is already being used"
|
||||||
format: "The format of this email address is invalid"
|
format: "The format of this email address is invalid"
|
||||||
|
@ -1087,7 +1090,6 @@ _sfx:
|
||||||
antenna: "Antennas"
|
antenna: "Antennas"
|
||||||
channel: "Channel notifications"
|
channel: "Channel notifications"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Unknown"
|
|
||||||
future: "Future"
|
future: "Future"
|
||||||
justNow: "Just now"
|
justNow: "Just now"
|
||||||
secondsAgo: "{n} second(s) ago"
|
secondsAgo: "{n} second(s) ago"
|
||||||
|
@ -1131,6 +1133,7 @@ _2fa:
|
||||||
registerKey: "Register a security key"
|
registerKey: "Register a security key"
|
||||||
step1: "First, install an authentication app (such as {a} or {b}) on your device."
|
step1: "First, install an authentication app (such as {a} or {b}) on your device."
|
||||||
step2: "Then, scan the QR code displayed on this screen."
|
step2: "Then, scan the QR code displayed on this screen."
|
||||||
|
step2Url: "You can also enter this URL if you're using a desktop program:"
|
||||||
step3: "Enter the token provided by your app to finish setup."
|
step3: "Enter the token provided by your app to finish setup."
|
||||||
step4: "From now on, any future login attempts will ask for such a login token."
|
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."
|
securityKeyInfo: "Besides fingerprint or PIN authentication, you can also setup authentication via hardware security keys that support FIDO2 to further secure your account."
|
||||||
|
|
|
@ -989,7 +989,6 @@ _sfx:
|
||||||
antenna: "Antena receptora"
|
antenna: "Antena receptora"
|
||||||
channel: "Notificaciones del canal"
|
channel: "Notificaciones del canal"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Desconocido"
|
|
||||||
future: "Futuro"
|
future: "Futuro"
|
||||||
justNow: "Recién ahora"
|
justNow: "Recién ahora"
|
||||||
secondsAgo: "Hace {n} segundos"
|
secondsAgo: "Hace {n} segundos"
|
||||||
|
|
|
@ -804,7 +804,7 @@ manageAccounts: "Gérer les comptes"
|
||||||
makeReactionsPublic: "Rendre les réactions publiques"
|
makeReactionsPublic: "Rendre les réactions publiques"
|
||||||
makeReactionsPublicDescription: "Ceci rendra la liste de toutes vos réactions données publique."
|
makeReactionsPublicDescription: "Ceci rendra la liste de toutes vos réactions données publique."
|
||||||
classic: "Classique"
|
classic: "Classique"
|
||||||
muteThread: "Mettre ce thread en sourdine"
|
muteThread: "Masquer cette discussion"
|
||||||
unmuteThread: "Ne plus masquer le fil"
|
unmuteThread: "Ne plus masquer le fil"
|
||||||
ffVisibility: "Visibilité des abonnés/abonnements"
|
ffVisibility: "Visibilité des abonnés/abonnements"
|
||||||
ffVisibilityDescription: "Permet de configurer qui peut voir les personnes que tu suis et les personnes qui te suivent."
|
ffVisibilityDescription: "Permet de configurer qui peut voir les personnes que tu suis et les personnes qui te suivent."
|
||||||
|
@ -1075,7 +1075,6 @@ _sfx:
|
||||||
antenna: "Réception de l’antenne"
|
antenna: "Réception de l’antenne"
|
||||||
channel: "Notifications de canal"
|
channel: "Notifications de canal"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Inconnu"
|
|
||||||
future: "Futur"
|
future: "Futur"
|
||||||
justNow: "à l’instant"
|
justNow: "à l’instant"
|
||||||
secondsAgo: "Il y a {n}s"
|
secondsAgo: "Il y a {n}s"
|
||||||
|
|
|
@ -842,6 +842,9 @@ oneDay: "1 Hari"
|
||||||
oneWeek: "1 Bulan"
|
oneWeek: "1 Bulan"
|
||||||
reflectMayTakeTime: "Mungkin perlu beberapa saat untuk dicerminkan."
|
reflectMayTakeTime: "Mungkin perlu beberapa saat untuk dicerminkan."
|
||||||
failedToFetchAccountInformation: "Gagal untuk mendapatkan informasi akun"
|
failedToFetchAccountInformation: "Gagal untuk mendapatkan informasi akun"
|
||||||
|
rateLimitExceeded: "Batas sudah terlampaui"
|
||||||
|
cropImage: "potong gambar"
|
||||||
|
cropImageAsk: "Ingin memotong gambar?"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "Alamat surel ini telah digunakan"
|
used: "Alamat surel ini telah digunakan"
|
||||||
format: "Format tidak valid."
|
format: "Format tidak valid."
|
||||||
|
@ -1087,7 +1090,6 @@ _sfx:
|
||||||
antenna: "Penerimaan Antenna"
|
antenna: "Penerimaan Antenna"
|
||||||
channel: "Pemberitahuan saluran"
|
channel: "Pemberitahuan saluran"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Tidak diketahui"
|
|
||||||
future: "Masa depan"
|
future: "Masa depan"
|
||||||
justNow: "Baru saja"
|
justNow: "Baru saja"
|
||||||
secondsAgo: "{n} detik lalu"
|
secondsAgo: "{n} detik lalu"
|
||||||
|
@ -1131,6 +1133,7 @@ _2fa:
|
||||||
registerKey: "Daftarkan kunci keamanan baru"
|
registerKey: "Daftarkan kunci keamanan baru"
|
||||||
step1: "Pertama, pasang aplikasi otentikasi (seperti {a} atau {b}) di perangkat kamu."
|
step1: "Pertama, pasang aplikasi otentikasi (seperti {a} atau {b}) di perangkat kamu."
|
||||||
step2: "Lalu, pindai kode QR yang ada di layar."
|
step2: "Lalu, pindai kode QR yang ada di layar."
|
||||||
|
step2Url: "Di aplikasi desktop, masukkan URL berikut:"
|
||||||
step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan pemasangan."
|
step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan pemasangan."
|
||||||
step4: "Mulai sekarang, upaya login apapun akan meminta token login dari aplikasi otentikasi kamu."
|
step4: "Mulai sekarang, upaya login apapun akan meminta token login dari aplikasi otentikasi kamu."
|
||||||
securityKeyInfo: "Kamu dapat memasang otentikasi WebAuthN untuk mengamankan proses login lebih lanjut dengan tidak hanya perangkat keras kunci keamanan yang mendukung FIDO2, namun juga sidik jari atau otentikasi PIN pada perangkatmu."
|
securityKeyInfo: "Kamu dapat memasang otentikasi WebAuthN untuk mengamankan proses login lebih lanjut dengan tidak hanya perangkat keras kunci keamanan yang mendukung FIDO2, namun juga sidik jari atau otentikasi PIN pada perangkatmu."
|
||||||
|
|
|
@ -10,7 +10,7 @@ password: "Password"
|
||||||
forgotPassword: "Hai dimenticato la tua password?"
|
forgotPassword: "Hai dimenticato la tua password?"
|
||||||
fetchingAsApObject: "Recuperando dal Fediverso..."
|
fetchingAsApObject: "Recuperando dal Fediverso..."
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
gotIt: "Capito!"
|
gotIt: "Ho capito"
|
||||||
cancel: "Annulla"
|
cancel: "Annulla"
|
||||||
enterUsername: "Inserisci un nome utente"
|
enterUsername: "Inserisci un nome utente"
|
||||||
renotedBy: "Rinotato da {user}"
|
renotedBy: "Rinotato da {user}"
|
||||||
|
@ -767,6 +767,7 @@ customCss: "CSS personalizzato"
|
||||||
global: "Federata"
|
global: "Federata"
|
||||||
squareAvatars: "Mostra l'immagine del profilo come quadrato"
|
squareAvatars: "Mostra l'immagine del profilo come quadrato"
|
||||||
sent: "Inviare"
|
sent: "Inviare"
|
||||||
|
received: "Ricevuto"
|
||||||
searchResult: "Risultati della Ricerca"
|
searchResult: "Risultati della Ricerca"
|
||||||
hashtags: "Hashtag"
|
hashtags: "Hashtag"
|
||||||
troubleshooting: "Risoluzione problemi"
|
troubleshooting: "Risoluzione problemi"
|
||||||
|
@ -804,6 +805,10 @@ welcomeBackWithName: "Bentornato/a, {name}"
|
||||||
clickToFinishEmailVerification: "Fai click su [{ok}] per completare la verifica dell'indirizzo email."
|
clickToFinishEmailVerification: "Fai click su [{ok}] per completare la verifica dell'indirizzo email."
|
||||||
searchByGoogle: "Cerca"
|
searchByGoogle: "Cerca"
|
||||||
indefinitely: "Non scade"
|
indefinitely: "Non scade"
|
||||||
|
tenMinutes: "10 minuti"
|
||||||
|
oneHour: "1 ora"
|
||||||
|
oneDay: "1 giorno"
|
||||||
|
oneWeek: "1 settimana"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "Email già in uso"
|
used: "Email già in uso"
|
||||||
format: "Formato email non valido"
|
format: "Formato email non valido"
|
||||||
|
@ -999,7 +1004,6 @@ _sfx:
|
||||||
antenna: "Ricezione dell'antenna"
|
antenna: "Ricezione dell'antenna"
|
||||||
channel: "Notifiche di canale"
|
channel: "Notifiche di canale"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Sconosciuto"
|
|
||||||
future: "Futuro"
|
future: "Futuro"
|
||||||
justNow: "Ora"
|
justNow: "Ora"
|
||||||
secondsAgo: "{n}s fa"
|
secondsAgo: "{n}s fa"
|
||||||
|
|
|
@ -843,6 +843,8 @@ oneWeek: "1週間"
|
||||||
reflectMayTakeTime: "反映されるまで時間がかかる場合があります。"
|
reflectMayTakeTime: "反映されるまで時間がかかる場合があります。"
|
||||||
failedToFetchAccountInformation: "アカウント情報の取得に失敗しました"
|
failedToFetchAccountInformation: "アカウント情報の取得に失敗しました"
|
||||||
rateLimitExceeded: "レート制限を超えました"
|
rateLimitExceeded: "レート制限を超えました"
|
||||||
|
cropImage: "画像のクロップ"
|
||||||
|
cropImageAsk: "画像をクロップしますか?"
|
||||||
|
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "既に使用されています"
|
used: "既に使用されています"
|
||||||
|
|
|
@ -799,7 +799,6 @@ _sfx:
|
||||||
notification: "通知"
|
notification: "通知"
|
||||||
chat: "チャット"
|
chat: "チャット"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "わからん"
|
|
||||||
future: "未来"
|
future: "未来"
|
||||||
justNow: "たった今"
|
justNow: "たった今"
|
||||||
secondsAgo: "{n}秒前"
|
secondsAgo: "{n}秒前"
|
||||||
|
|
|
@ -842,6 +842,9 @@ oneDay: "1일"
|
||||||
oneWeek: "일주일"
|
oneWeek: "일주일"
|
||||||
reflectMayTakeTime: "반영되기까지 시간이 걸릴 수 있습니다."
|
reflectMayTakeTime: "반영되기까지 시간이 걸릴 수 있습니다."
|
||||||
failedToFetchAccountInformation: "계정 정보를 가져오지 못했습니다"
|
failedToFetchAccountInformation: "계정 정보를 가져오지 못했습니다"
|
||||||
|
rateLimitExceeded: "요청 제한 횟수를 초과하였습니다"
|
||||||
|
cropImage: "이미지 자르기"
|
||||||
|
cropImageAsk: "이미지를 자르시겠습니까?"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "이 메일 주소는 사용중입니다"
|
used: "이 메일 주소는 사용중입니다"
|
||||||
format: "형식이 올바르지 않습니다"
|
format: "형식이 올바르지 않습니다"
|
||||||
|
@ -1087,7 +1090,6 @@ _sfx:
|
||||||
antenna: "안테나 수신"
|
antenna: "안테나 수신"
|
||||||
channel: "채널 알림"
|
channel: "채널 알림"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "알 수 없음"
|
|
||||||
future: "미래"
|
future: "미래"
|
||||||
justNow: "방금 전"
|
justNow: "방금 전"
|
||||||
secondsAgo: "{n}초 전"
|
secondsAgo: "{n}초 전"
|
||||||
|
@ -1131,6 +1133,7 @@ _2fa:
|
||||||
registerKey: "키를 등록"
|
registerKey: "키를 등록"
|
||||||
step1: "먼저, {a}나 {b}등의 인증 앱을 사용 중인 디바이스에 설치합니다."
|
step1: "먼저, {a}나 {b}등의 인증 앱을 사용 중인 디바이스에 설치합니다."
|
||||||
step2: "그 후, 표시되어 있는 QR코드를 앱으로 스캔합니다."
|
step2: "그 후, 표시되어 있는 QR코드를 앱으로 스캔합니다."
|
||||||
|
step2Url: "데스크톱 앱에서는 다음 URL을 입력하세요:"
|
||||||
step3: "앱에 표시된 토큰을 입력하시면 완료됩니다."
|
step3: "앱에 표시된 토큰을 입력하시면 완료됩니다."
|
||||||
step4: "다음 로그인부터는 토큰을 입력해야 합니다."
|
step4: "다음 로그인부터는 토큰을 입력해야 합니다."
|
||||||
securityKeyInfo: "FIDO2를 지원하는 하드웨어 보안 키 혹은 디바이스의 지문인식이나 화면잠금 PIN을 이용해서 로그인하도록 설정할 수 있습니다."
|
securityKeyInfo: "FIDO2를 지원하는 하드웨어 보안 키 혹은 디바이스의 지문인식이나 화면잠금 PIN을 이용해서 로그인하도록 설정할 수 있습니다."
|
||||||
|
|
|
@ -303,6 +303,8 @@ muteThread: "Discussies dempen "
|
||||||
unmuteThread: "Dempen van discussie ongedaan maken"
|
unmuteThread: "Dempen van discussie ongedaan maken"
|
||||||
hide: "Verbergen"
|
hide: "Verbergen"
|
||||||
searchByGoogle: "Zoeken"
|
searchByGoogle: "Zoeken"
|
||||||
|
cropImage: "Afbeelding bijsnijden"
|
||||||
|
cropImageAsk: "Bijsnijdengevraagd"
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "volgde jou"
|
title: "volgde jou"
|
||||||
|
|
|
@ -946,7 +946,6 @@ _sfx:
|
||||||
chatBg: "Rozmowy (tło)"
|
chatBg: "Rozmowy (tło)"
|
||||||
channel: "Powiadomienia kanału"
|
channel: "Powiadomienia kanału"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Nieznane"
|
|
||||||
future: "W przyszłości"
|
future: "W przyszłości"
|
||||||
justNow: "Przed chwilą"
|
justNow: "Przed chwilą"
|
||||||
secondsAgo: "{n} sek. temu"
|
secondsAgo: "{n} sek. temu"
|
||||||
|
|
|
@ -81,18 +81,67 @@ somethingHappened: "Ocorreu um erro"
|
||||||
retry: "Tentar novamente"
|
retry: "Tentar novamente"
|
||||||
pageLoadError: "Ocorreu um erro ao carregar a página."
|
pageLoadError: "Ocorreu um erro ao carregar a página."
|
||||||
pageLoadErrorDescription: "Isto é normalmente causado por erros de rede ou pela cache do browser. Experimenta limpar a cache e tenta novamente após algum tempo."
|
pageLoadErrorDescription: "Isto é normalmente causado por erros de rede ou pela cache do browser. Experimenta limpar a cache e tenta novamente após algum tempo."
|
||||||
|
serverIsDead: "O servidor não está respondendo. Por favor espere um pouco e tente novamente."
|
||||||
|
youShouldUpgradeClient: "Para visualizar essa página, por favor recarregue-a para atualizar seu cliente."
|
||||||
|
enterListName: "Insira um nome para a lista"
|
||||||
|
privacy: "Privacidade"
|
||||||
|
makeFollowManuallyApprove: "Pedidos de seguimento precisam ser aprovados"
|
||||||
|
defaultNoteVisibility: "Visibilidade padrão"
|
||||||
follow: "Seguindo"
|
follow: "Seguindo"
|
||||||
|
followRequest: "Mandar pedido de seguimento"
|
||||||
|
followRequests: "Pedidos de seguimento"
|
||||||
|
unfollow: "Deixar de seguir"
|
||||||
|
followRequestPending: "Pedido de seguimento pendente"
|
||||||
enterEmoji: "Inserir emoji"
|
enterEmoji: "Inserir emoji"
|
||||||
renote: "Repostar"
|
renote: "Repostar"
|
||||||
renoted: "Repostado"
|
renoted: "Repostado"
|
||||||
cantRenote: "Não pode repostar"
|
cantRenote: "Não pode repostar"
|
||||||
cantReRenote: "Não pode repostar este repost"
|
cantReRenote: "Não pode repostar este repost"
|
||||||
|
quote: "Citar"
|
||||||
pinnedNote: "Post fixado"
|
pinnedNote: "Post fixado"
|
||||||
pinned: "Afixar no perfil"
|
pinned: "Afixar no perfil"
|
||||||
|
you: "Você"
|
||||||
|
clickToShow: "Clique para ver"
|
||||||
sensitive: "Conteúdo sensível"
|
sensitive: "Conteúdo sensível"
|
||||||
|
add: "Adicionar"
|
||||||
|
reaction: "Reações"
|
||||||
|
reactionSetting: "Quais reações a mostrar no selecionador de reações"
|
||||||
|
rememberNoteVisibility: "Lembrar das configurações de visibilidade de notas"
|
||||||
|
attachCancel: "Remover anexo"
|
||||||
|
markAsSensitive: "Marcar como sensível"
|
||||||
|
unmarkAsSensitive: "Desmarcar como sensível"
|
||||||
|
enterFileName: "Digite o nome do ficheiro"
|
||||||
mute: "Silenciar"
|
mute: "Silenciar"
|
||||||
unmute: "Dessilenciar"
|
unmute: "Dessilenciar"
|
||||||
|
block: "Bloquear"
|
||||||
|
unblock: "Desbloquear"
|
||||||
|
suspend: "Suspender"
|
||||||
|
unsuspend: "Cancelar suspensão"
|
||||||
|
blockConfirm: "Tem certeza que gostaria de bloquear essa conta?"
|
||||||
|
unblockConfirm: "Tem certeza que gostaria de desbloquear essa conta?"
|
||||||
|
suspendConfirm: "Tem certeza que gostaria de suspender essa conta?"
|
||||||
|
unsuspendConfirm: "Tem certeza que gostaria de cancelar a suspensão dessa conta?"
|
||||||
|
selectList: "Escolhe uma lista"
|
||||||
|
selectAntenna: "Escolhe uma antena"
|
||||||
|
selectWidget: "Escolhe um widget"
|
||||||
|
editWidgets: "Editar widgets"
|
||||||
|
editWidgetsExit: "Pronto"
|
||||||
|
customEmojis: "Emoji personalizado"
|
||||||
|
emoji: "Emoji"
|
||||||
|
emojis: "Emojis"
|
||||||
|
emojiName: "Nome do Emoji"
|
||||||
|
emojiUrl: "URL do Emoji"
|
||||||
|
addEmoji: "Adicionar um Emoji"
|
||||||
settingGuide: "Guia de configuração"
|
settingGuide: "Guia de configuração"
|
||||||
|
flagAsBot: "Marcar conta como robô"
|
||||||
|
flagAsCat: "Marcar conta como gato"
|
||||||
|
flagAsCatDescription: "Ative essa opção para marcar essa conta como gato."
|
||||||
|
flagShowTimelineReplies: "Mostrar respostas na linha de tempo"
|
||||||
|
general: "Geral"
|
||||||
|
wallpaper: "Papel de parede"
|
||||||
|
searchWith: "Buscar: {q}"
|
||||||
|
youHaveNoLists: "Não tem nenhuma lista"
|
||||||
|
followConfirm: "Tem certeza que quer deixar de seguir {name}?"
|
||||||
instances: "Instância"
|
instances: "Instância"
|
||||||
registeredAt: "Registrado em"
|
registeredAt: "Registrado em"
|
||||||
perHour: "por hora"
|
perHour: "por hora"
|
||||||
|
@ -107,6 +156,8 @@ nsfw: "Conteúdo sensível"
|
||||||
monthX: "mês de {month}"
|
monthX: "mês de {month}"
|
||||||
pinnedNotes: "Post fixado"
|
pinnedNotes: "Post fixado"
|
||||||
userList: "Listas"
|
userList: "Listas"
|
||||||
|
none: "Nenhum"
|
||||||
|
output: "Resultado"
|
||||||
smtpUser: "Nome de usuário"
|
smtpUser: "Nome de usuário"
|
||||||
smtpPass: "Senha"
|
smtpPass: "Senha"
|
||||||
user: "Usuários"
|
user: "Usuários"
|
||||||
|
@ -116,6 +167,8 @@ _email:
|
||||||
title: "Você tem um novo seguidor"
|
title: "Você tem um novo seguidor"
|
||||||
_mfm:
|
_mfm:
|
||||||
mention: "Menção"
|
mention: "Menção"
|
||||||
|
quote: "Citar"
|
||||||
|
emoji: "Emoji personalizado"
|
||||||
search: "Pesquisar"
|
search: "Pesquisar"
|
||||||
_theme:
|
_theme:
|
||||||
keys:
|
keys:
|
||||||
|
@ -136,38 +189,229 @@ _profile:
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
followingList: "Seguindo"
|
followingList: "Seguindo"
|
||||||
muteList: "Silenciar"
|
muteList: "Silenciar"
|
||||||
|
blockingList: "Bloquear"
|
||||||
userLists: "Listas"
|
userLists: "Listas"
|
||||||
_pages:
|
_pages:
|
||||||
|
blocks:
|
||||||
|
_button:
|
||||||
|
_action:
|
||||||
|
_pushEvent:
|
||||||
|
event: "Nome do evento"
|
||||||
|
message: "Mostrar mensagem quando ativado"
|
||||||
|
variable: "Variável a mandar"
|
||||||
|
no-variable: "Nenhum"
|
||||||
|
callAiScript: "Invocar AiScript"
|
||||||
|
_callAiScript:
|
||||||
|
functionName: "Nome da função"
|
||||||
|
radioButton: "Escolha"
|
||||||
|
_radioButton:
|
||||||
|
values: "Lista de escolhas separadas por quebras de texto"
|
||||||
script:
|
script:
|
||||||
categories:
|
categories:
|
||||||
|
logical: "Operação lógica"
|
||||||
|
operation: "Cálculos"
|
||||||
|
comparison: "Comparação"
|
||||||
list: "Listas"
|
list: "Listas"
|
||||||
blocks:
|
blocks:
|
||||||
|
_strReplace:
|
||||||
|
arg2: "Texto que irá ser substituído"
|
||||||
|
arg3: "Substituir com"
|
||||||
|
strReverse: "Virar texto"
|
||||||
|
join: "Sequência de texto"
|
||||||
_join:
|
_join:
|
||||||
arg1: "Listas"
|
arg1: "Listas"
|
||||||
|
arg2: "Separador"
|
||||||
|
add: "Somar"
|
||||||
|
_add:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
subtract: "Subtrair"
|
||||||
|
_subtract:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
multiply: "Multiplicar"
|
||||||
|
_multiply:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
divide: "Dividir"
|
||||||
|
_divide:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
mod: "O resto de"
|
||||||
|
_mod:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
round: "Arredondar decimal"
|
||||||
|
_round:
|
||||||
|
arg1: "Numérico"
|
||||||
|
eq: "A e B são iguais"
|
||||||
|
_eq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
notEq: "A e B são diferentes"
|
||||||
|
_notEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
and: "A e B"
|
||||||
|
_and:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
or: "A OU B"
|
||||||
|
_or:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
lt: "< A é menor do que B"
|
||||||
|
_lt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gt: "> A é maior do que B"
|
||||||
|
_gt:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
ltEq: "<= A é maior ou igual a B"
|
||||||
|
_ltEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
gtEq: ">= A é maior ou igual a B"
|
||||||
|
_gtEq:
|
||||||
|
arg1: "A"
|
||||||
|
arg2: "B"
|
||||||
|
if: "Galho"
|
||||||
|
_if:
|
||||||
|
arg1: "Se"
|
||||||
|
arg2: "Então"
|
||||||
|
arg3: "Se não"
|
||||||
|
not: "NÃO"
|
||||||
|
_not:
|
||||||
|
arg1: "NÃO"
|
||||||
|
random: "Aleatório"
|
||||||
|
_random:
|
||||||
|
arg1: "Probabilidade"
|
||||||
|
rannum: "Numeral aleatório"
|
||||||
|
_rannum:
|
||||||
|
arg1: "Valor mínimo"
|
||||||
|
arg2: "Valor máximo"
|
||||||
|
randomPick: "Escolher aleatoriamente de uma lista"
|
||||||
_randomPick:
|
_randomPick:
|
||||||
arg1: "Listas"
|
arg1: "Listas"
|
||||||
|
dailyRandom: "Aleatório (Muda uma vez por dia para cada usuário)"
|
||||||
|
_dailyRandom:
|
||||||
|
arg1: "Probabilidade"
|
||||||
|
dailyRannum: "Numeral aleatório (Muda uma vez por dia para cada usuário)"
|
||||||
|
_dailyRannum:
|
||||||
|
arg1: "Valor mínimo"
|
||||||
|
arg2: "Valor máximo"
|
||||||
|
dailyRandomPick: "Escolher aleatoriamente de uma lista (Muda uma vez por dia para cada usuário)"
|
||||||
_dailyRandomPick:
|
_dailyRandomPick:
|
||||||
arg1: "Listas"
|
arg1: "Listas"
|
||||||
|
seedRandom: "Aleatório (com semente)"
|
||||||
|
_seedRandom:
|
||||||
|
arg1: "Semente"
|
||||||
|
arg2: "Probabilidade"
|
||||||
|
seedRannum: "Número aleatório (com semente)"
|
||||||
|
_seedRannum:
|
||||||
|
arg1: "Semente"
|
||||||
|
arg2: "Valor mínimo"
|
||||||
|
arg3: "Valor máximo"
|
||||||
|
seedRandomPick: "Escolher aleatoriamente de uma lista (com uma semente)"
|
||||||
_seedRandomPick:
|
_seedRandomPick:
|
||||||
|
arg1: "Semente"
|
||||||
arg2: "Listas"
|
arg2: "Listas"
|
||||||
|
DRPWPM: "Escolher aleatoriamente de uma lista ponderada (Muda uma vez por dia para cada usuário)"
|
||||||
|
_DRPWPM:
|
||||||
|
arg1: "Lista de texto"
|
||||||
|
pick: "Escolhe a partir da lista"
|
||||||
_pick:
|
_pick:
|
||||||
arg1: "Listas"
|
arg1: "Listas"
|
||||||
|
arg2: "Posição"
|
||||||
|
listLen: "Pegar comprimento da lista"
|
||||||
_listLen:
|
_listLen:
|
||||||
arg1: "Listas"
|
arg1: "Listas"
|
||||||
|
number: "Numérico"
|
||||||
|
stringToNumber: "Texto para numérico"
|
||||||
|
_stringToNumber:
|
||||||
|
arg1: "Texto"
|
||||||
|
numberToString: "Numérico para texto"
|
||||||
|
_numberToString:
|
||||||
|
arg1: "Numérico"
|
||||||
|
splitStrByLine: "Dividir texto por quebras"
|
||||||
|
_splitStrByLine:
|
||||||
|
arg1: "Texto"
|
||||||
|
ref: "Variável"
|
||||||
|
aiScriptVar: "Variável AiScript"
|
||||||
|
fn: "Função"
|
||||||
|
_fn:
|
||||||
|
slots: "Espaços"
|
||||||
|
slots-info: "Separar cada espaço com uma quebra de texto"
|
||||||
|
arg1: "Resultado"
|
||||||
|
for: "Repetição 'for'"
|
||||||
|
_for:
|
||||||
|
arg1: "Número de repetições"
|
||||||
|
arg2: "Ação"
|
||||||
|
typeError: "Espaço {slot} aceita valores de tipo \"{expect}\", mas o valor dado é do tipo \"{actual}\"!"
|
||||||
|
thereIsEmptySlot: "O espaço {slot} está vazio!"
|
||||||
types:
|
types:
|
||||||
|
string: "Texto"
|
||||||
|
number: "Numérico"
|
||||||
array: "Listas"
|
array: "Listas"
|
||||||
|
stringArray: "Lista de texto"
|
||||||
|
emptySlot: "Espaço vazio"
|
||||||
|
enviromentVariables: "Variáveis de ambiente"
|
||||||
|
pageVariables: "Variáveis de página"
|
||||||
|
_relayStatus:
|
||||||
|
requesting: "Pendente"
|
||||||
|
accepted: "Aprovado"
|
||||||
|
rejected: "Recusado"
|
||||||
_notification:
|
_notification:
|
||||||
|
fileUploaded: "Carregamento de arquivo efetuado com sucesso"
|
||||||
|
youGotMention: "{name} te mencionou"
|
||||||
|
youGotReply: "{name} te respondeu"
|
||||||
|
youGotQuote: "{name} te citou"
|
||||||
|
youGotPoll: "{name} votou em sua enquete"
|
||||||
|
youGotMessagingMessageFromUser: "{name} te mandou uma mensagem de bate-papo"
|
||||||
|
youGotMessagingMessageFromGroup: "Uma mensagem foi mandada para o grupo {name}"
|
||||||
youWereFollowed: "Você tem um novo seguidor"
|
youWereFollowed: "Você tem um novo seguidor"
|
||||||
|
youReceivedFollowRequest: "Você recebeu um pedido de seguimento"
|
||||||
|
yourFollowRequestAccepted: "Seu pedido de seguimento foi aceito"
|
||||||
|
youWereInvitedToGroup: "{userName} te convidou para um grupo"
|
||||||
|
pollEnded: "Os resultados da enquete agora estão disponíveis"
|
||||||
|
emptyPushNotificationMessage: "As notificações de alerta foram atualizadas"
|
||||||
_types:
|
_types:
|
||||||
|
all: "Todos"
|
||||||
follow: "Seguindo"
|
follow: "Seguindo"
|
||||||
mention: "Menção"
|
mention: "Menção"
|
||||||
|
reply: "Respostas"
|
||||||
renote: "Repostar"
|
renote: "Repostar"
|
||||||
|
quote: "Citar"
|
||||||
|
reaction: "Reações"
|
||||||
|
pollVote: "Votações em enquetes"
|
||||||
|
pollEnded: "Enquetes terminando"
|
||||||
|
receiveFollowRequest: "Recebeu pedidos de seguimento"
|
||||||
|
followRequestAccepted: "Aceitou pedidos de seguimento"
|
||||||
|
groupInvited: "Convites de grupo"
|
||||||
|
app: "Notificações de aplicativos conectados"
|
||||||
_actions:
|
_actions:
|
||||||
|
followBack: "te seguiu de volta"
|
||||||
reply: "Responder"
|
reply: "Responder"
|
||||||
renote: "Repostar"
|
renote: "Repostar"
|
||||||
_deck:
|
_deck:
|
||||||
|
alwaysShowMainColumn: "Sempre mostrar a coluna principal"
|
||||||
|
columnAlign: "Alinhar colunas"
|
||||||
|
columnMargin: "Margem entre colunas"
|
||||||
|
columnHeaderHeight: "Altura do cabeçalho de coluna"
|
||||||
|
addColumn: "Adicionar coluna"
|
||||||
|
swapLeft: "Trocar de posição com a coluna à esquerda"
|
||||||
|
swapRight: "Trocar de posição com a coluna à direita"
|
||||||
|
swapUp: "Trocar de posição com a coluna acima"
|
||||||
|
swapDown: "Trocar de posição com a coluna abaixo"
|
||||||
|
popRight: "Acoplar coluna à direita"
|
||||||
|
profile: "Perfil"
|
||||||
_columns:
|
_columns:
|
||||||
|
main: "Principal"
|
||||||
|
widgets: "Widgets"
|
||||||
notifications: "Notificações"
|
notifications: "Notificações"
|
||||||
tl: "Timeline"
|
tl: "Timeline"
|
||||||
|
antenna: "Antenas"
|
||||||
list: "Listas"
|
list: "Listas"
|
||||||
mentions: "Menções"
|
mentions: "Menções"
|
||||||
|
direct: "Notas diretas"
|
||||||
|
|
|
@ -141,6 +141,8 @@ flagAsBot: "Аккаунт бота"
|
||||||
flagAsBotDescription: "Включите, если этот аккаунт управляется программой. Это позволит системе Misskey учитывать это, а также поможет разработчикам других ботов предотвратить бесконечные циклы взаимодействия."
|
flagAsBotDescription: "Включите, если этот аккаунт управляется программой. Это позволит системе Misskey учитывать это, а также поможет разработчикам других ботов предотвратить бесконечные циклы взаимодействия."
|
||||||
flagAsCat: "Аккаунт кота"
|
flagAsCat: "Аккаунт кота"
|
||||||
flagAsCatDescription: "Включите, и этот аккаунт будет помечен как кошачий."
|
flagAsCatDescription: "Включите, и этот аккаунт будет помечен как кошачий."
|
||||||
|
flagShowTimelineReplies: "Показывать ответы на заметки в ленте"
|
||||||
|
flagShowTimelineRepliesDescription: "Если этот параметр включен, то в ленте, в дополнение к заметкам пользователя, отображаются ответы на другие заметки пользователя."
|
||||||
autoAcceptFollowed: "Принимать подписчиков автоматически"
|
autoAcceptFollowed: "Принимать подписчиков автоматически"
|
||||||
addAccount: "Добавить учётную запись"
|
addAccount: "Добавить учётную запись"
|
||||||
loginFailed: "Неудачная попытка входа"
|
loginFailed: "Неудачная попытка входа"
|
||||||
|
@ -236,6 +238,7 @@ saved: "Сохранено"
|
||||||
messaging: "Сообщения"
|
messaging: "Сообщения"
|
||||||
upload: "Загрузить"
|
upload: "Загрузить"
|
||||||
keepOriginalUploading: "Сохранить исходное изображение"
|
keepOriginalUploading: "Сохранить исходное изображение"
|
||||||
|
keepOriginalUploadingDescription: "Сохраняет исходную версию при загрузке изображений. Если выключить, то при загрузке браузер генерирует изображение для публикации."
|
||||||
fromDrive: "С «диска»"
|
fromDrive: "С «диска»"
|
||||||
fromUrl: "По ссылке"
|
fromUrl: "По ссылке"
|
||||||
uploadFromUrl: "Загрузить по ссылке"
|
uploadFromUrl: "Загрузить по ссылке"
|
||||||
|
@ -589,6 +592,7 @@ smtpSecure: "Использовать SSL/TLS для SMTP-соединений"
|
||||||
smtpSecureInfo: "Выключите при использовании STARTTLS."
|
smtpSecureInfo: "Выключите при использовании STARTTLS."
|
||||||
testEmail: "Проверка доставки электронной почты"
|
testEmail: "Проверка доставки электронной почты"
|
||||||
wordMute: "Скрытие слов"
|
wordMute: "Скрытие слов"
|
||||||
|
regexpError: "Ошибка в регулярном выражении"
|
||||||
instanceMute: "Глушение инстансов"
|
instanceMute: "Глушение инстансов"
|
||||||
userSaysSomething: "{name} что-то сообщает"
|
userSaysSomething: "{name} что-то сообщает"
|
||||||
makeActive: "Активировать"
|
makeActive: "Активировать"
|
||||||
|
@ -619,6 +623,8 @@ fillAbuseReportDescription: "Опишите, пожалуйста, причин
|
||||||
abuseReported: "Жалоба отправлена. Большое спасибо за информацию."
|
abuseReported: "Жалоба отправлена. Большое спасибо за информацию."
|
||||||
reporteeOrigin: "О ком сообщено"
|
reporteeOrigin: "О ком сообщено"
|
||||||
reporterOrigin: "Кто сообщил"
|
reporterOrigin: "Кто сообщил"
|
||||||
|
forwardReport: "Перенаправление отчета на инстант."
|
||||||
|
forwardReportIsAnonymous: "Удаленный инстант не сможет увидеть вашу информацию и будет отображаться как анонимная системная учетная запись."
|
||||||
send: "Отправить"
|
send: "Отправить"
|
||||||
abuseMarkAsResolved: "Отметить жалобу как решённую"
|
abuseMarkAsResolved: "Отметить жалобу как решённую"
|
||||||
openInNewTab: "Открыть в новой вкладке"
|
openInNewTab: "Открыть в новой вкладке"
|
||||||
|
@ -815,7 +821,16 @@ leaveGroupConfirm: "Покинуть группу «{name}»?"
|
||||||
useDrawerReactionPickerForMobile: "Выдвижная палитра на мобильном устройстве"
|
useDrawerReactionPickerForMobile: "Выдвижная палитра на мобильном устройстве"
|
||||||
welcomeBackWithName: "С возвращением, {name}!"
|
welcomeBackWithName: "С возвращением, {name}!"
|
||||||
clickToFinishEmailVerification: "Пожалуйста, нажмите [{ok}], чтобы завершить подтверждение адреса электронной почты."
|
clickToFinishEmailVerification: "Пожалуйста, нажмите [{ok}], чтобы завершить подтверждение адреса электронной почты."
|
||||||
|
overridedDeviceKind: "Тип устройства"
|
||||||
|
smartphone: "Смартфон"
|
||||||
|
tablet: "Планшет"
|
||||||
|
auto: "Автоматически"
|
||||||
|
themeColor: "Цвет темы"
|
||||||
|
size: "Размер"
|
||||||
|
numberOfColumn: "Количество столбцов"
|
||||||
searchByGoogle: "Поиск"
|
searchByGoogle: "Поиск"
|
||||||
|
instanceDefaultLightTheme: "Светлая тема по умолчанию"
|
||||||
|
instanceDefaultDarkTheme: "Темная тема по умолчанию"
|
||||||
indefinitely: "вечно"
|
indefinitely: "вечно"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "Уже используется"
|
used: "Уже используется"
|
||||||
|
@ -1059,7 +1074,6 @@ _sfx:
|
||||||
antenna: "Антенна"
|
antenna: "Антенна"
|
||||||
channel: "Канал"
|
channel: "Канал"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Когда-то"
|
|
||||||
future: "Из будущего"
|
future: "Из будущего"
|
||||||
justNow: "Только что"
|
justNow: "Только что"
|
||||||
secondsAgo: "{n} с назад"
|
secondsAgo: "{n} с назад"
|
||||||
|
|
|
@ -841,6 +841,7 @@ oneDay: "1 deň"
|
||||||
oneWeek: "1 týždeň"
|
oneWeek: "1 týždeň"
|
||||||
reflectMayTakeTime: "Zmeny môžu chvíľu trvať kým sa prejavia."
|
reflectMayTakeTime: "Zmeny môžu chvíľu trvať kým sa prejavia."
|
||||||
failedToFetchAccountInformation: "Nepodarilo sa načítať informácie o účte."
|
failedToFetchAccountInformation: "Nepodarilo sa načítať informácie o účte."
|
||||||
|
rateLimitExceeded: "Prekročený limit rýchlosti"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "Táto emailová adresa sa už používa"
|
used: "Táto emailová adresa sa už používa"
|
||||||
format: "Formát emailovej adresy je nesprávny"
|
format: "Formát emailovej adresy je nesprávny"
|
||||||
|
@ -1086,7 +1087,6 @@ _sfx:
|
||||||
antenna: "Antény"
|
antenna: "Antény"
|
||||||
channel: "Upozornenia kanála"
|
channel: "Upozornenia kanála"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Neznáme"
|
|
||||||
future: "Budúcnosť"
|
future: "Budúcnosť"
|
||||||
justNow: "Teraz"
|
justNow: "Teraz"
|
||||||
secondsAgo: "pred {n} sekundami"
|
secondsAgo: "pred {n} sekundami"
|
||||||
|
@ -1130,6 +1130,7 @@ _2fa:
|
||||||
registerKey: "Registrovať bezpečnostný kľúč"
|
registerKey: "Registrovať bezpečnostný kľúč"
|
||||||
step1: "Najprv si nainštalujte autentifikačnú aplikáciu (napríklad {a} alebo {b}) na svoje zariadenie."
|
step1: "Najprv si nainštalujte autentifikačnú aplikáciu (napríklad {a} alebo {b}) na svoje zariadenie."
|
||||||
step2: "Potom, naskenujte QR kód zobrazený na obrazovke."
|
step2: "Potom, naskenujte QR kód zobrazený na obrazovke."
|
||||||
|
step2Url: "Do aplikácie zadajte nasledujúcu URL adresu:"
|
||||||
step3: "Nastavenie dokončíte zadaním tokenu z vašej aplikácie."
|
step3: "Nastavenie dokončíte zadaním tokenu z vašej aplikácie."
|
||||||
step4: "Od teraz, všetky ďalšie prihlásenia budú vyžadovať prihlasovací token."
|
step4: "Od teraz, všetky ďalšie prihlásenia budú vyžadovať prihlasovací token."
|
||||||
securityKeyInfo: "Okrem odtlačku prsta alebo PIN autentifikácie si môžete nastaviť autentifikáciu cez hardvérový bezpečnostný kľúč podporujúci FIDO2 a tak ešte viac zabezpečiť svoj účet."
|
securityKeyInfo: "Okrem odtlačku prsta alebo PIN autentifikácie si môžete nastaviť autentifikáciu cez hardvérový bezpečnostný kľúč podporujúci FIDO2 a tak ešte viac zabezpečiť svoj účet."
|
||||||
|
|
319
locales/sv-SE.yml
Normal file
319
locales/sv-SE.yml
Normal file
|
@ -0,0 +1,319 @@
|
||||||
|
---
|
||||||
|
_lang_: "Svenska"
|
||||||
|
headlineMisskey: "Ett nätverk kopplat av noter"
|
||||||
|
introMisskey: "Välkommen! Misskey är en öppen och decentraliserad mikrobloggningstjänst.\nSkapa en \"not\" och dela dina tankar med alla runtomkring dig. 📡\nMed \"reaktioner\" kan du snabbt uttrycka dina känslor kring andras noter.👍\nLåt oss utforska en nya värld!🚀"
|
||||||
|
monthAndDay: "{day}/{month}"
|
||||||
|
search: "Sök"
|
||||||
|
notifications: "Notifikationer"
|
||||||
|
username: "Användarnamn"
|
||||||
|
password: "Lösenord"
|
||||||
|
forgotPassword: "Glömt lösenord"
|
||||||
|
fetchingAsApObject: "Hämtar från Fediversum..."
|
||||||
|
ok: "OK"
|
||||||
|
gotIt: "Uppfattat!"
|
||||||
|
cancel: "Avbryt"
|
||||||
|
enterUsername: "Ange användarnamn"
|
||||||
|
renotedBy: "Omnoterad av {user}"
|
||||||
|
noNotes: "Inga noteringar"
|
||||||
|
noNotifications: "Inga aviseringar"
|
||||||
|
instance: "Instanser"
|
||||||
|
settings: "Inställningar"
|
||||||
|
basicSettings: "Basinställningar"
|
||||||
|
otherSettings: "Andra inställningar"
|
||||||
|
openInWindow: "Öppna i ett fönster"
|
||||||
|
profile: "Profil"
|
||||||
|
timeline: "Tidslinje"
|
||||||
|
noAccountDescription: "Användaren har inte skrivit en biografi än."
|
||||||
|
login: "Logga in"
|
||||||
|
loggingIn: "Loggar in"
|
||||||
|
logout: "Logga ut"
|
||||||
|
signup: "Registrera"
|
||||||
|
uploading: "Uppladdning sker..."
|
||||||
|
save: "Spara"
|
||||||
|
users: "Användare"
|
||||||
|
addUser: "Lägg till användare"
|
||||||
|
favorite: "Lägg till i favoriter"
|
||||||
|
favorites: "Favoriter"
|
||||||
|
unfavorite: "Avfavorisera"
|
||||||
|
favorited: "Tillagd i favoriter."
|
||||||
|
alreadyFavorited: "Redan tillagd i favoriter."
|
||||||
|
cantFavorite: "Gick inte att lägga till i favoriter."
|
||||||
|
pin: "Fäst till profil"
|
||||||
|
unpin: "Lossa från profil"
|
||||||
|
copyContent: "Kopiera innehåll"
|
||||||
|
copyLink: "Kopiera länk"
|
||||||
|
delete: "Radera"
|
||||||
|
deleteAndEdit: "Radera och ändra"
|
||||||
|
deleteAndEditConfirm: "Är du säker att du vill radera denna not och ändra den? Du kommer förlora alla reaktioner, omnoteringar och svar till den."
|
||||||
|
addToList: "Lägg till i lista"
|
||||||
|
sendMessage: "Skicka ett meddelande"
|
||||||
|
copyUsername: "Kopiera användarnamn"
|
||||||
|
searchUser: "Sök användare"
|
||||||
|
reply: "Svara"
|
||||||
|
loadMore: "Ladda mer"
|
||||||
|
showMore: "Visa mer"
|
||||||
|
youGotNewFollower: "följde dig"
|
||||||
|
receiveFollowRequest: "Följarförfrågan mottagen"
|
||||||
|
followRequestAccepted: "Följarförfrågan accepterad"
|
||||||
|
mention: "Nämn"
|
||||||
|
mentions: "Omnämningar"
|
||||||
|
directNotes: "Direktnoter"
|
||||||
|
importAndExport: "Importera / Exportera"
|
||||||
|
import: "Importera"
|
||||||
|
export: "Exportera"
|
||||||
|
files: "Filer"
|
||||||
|
download: "Nedladdning"
|
||||||
|
driveFileDeleteConfirm: "Är du säker att du vill radera filen \"{name}\"? Noter med denna fil bifogad kommer också raderas."
|
||||||
|
unfollowConfirm: "Är du säker att du vill avfölja {name}?"
|
||||||
|
exportRequested: "Du har begärt en export. Detta kan ta lite tid. Den kommer läggas till i din Drive när den blir klar."
|
||||||
|
importRequested: "Du har begärt en import. Detta kan ta lite tid."
|
||||||
|
lists: "Listor"
|
||||||
|
noLists: "Du har inga listor"
|
||||||
|
note: "Not"
|
||||||
|
notes: "Noter"
|
||||||
|
following: "Följer"
|
||||||
|
followers: "Följare"
|
||||||
|
followsYou: "Följer dig"
|
||||||
|
createList: "Skapa lista"
|
||||||
|
manageLists: "Hantera lista"
|
||||||
|
error: "Fel!"
|
||||||
|
somethingHappened: "Ett fel har uppstått"
|
||||||
|
retry: "Försök igen"
|
||||||
|
pageLoadError: "Det gick inte att ladda sidan."
|
||||||
|
pageLoadErrorDescription: "Detta händer oftast p.g.a. nätverksfel eller din webbläsarcache. Försök tömma din cache och testa sedan igen efter en liten stund."
|
||||||
|
serverIsDead: "Servern svarar inte. Vänta ett litet tag och försök igen."
|
||||||
|
youShouldUpgradeClient: "För att kunna se denna sida, vänligen ladda om sidan för att uppdatera din klient."
|
||||||
|
enterListName: "Skriv ett namn till listan"
|
||||||
|
privacy: "Integritet"
|
||||||
|
makeFollowManuallyApprove: "Följarförfrågningar kräver manuellt godkännande"
|
||||||
|
defaultNoteVisibility: "Standardsynlighet"
|
||||||
|
follow: "Följ"
|
||||||
|
followRequest: "Skicka följarförfrågan"
|
||||||
|
followRequests: "Följarförfrågningar"
|
||||||
|
unfollow: "Avfölj"
|
||||||
|
followRequestPending: "Följarförfrågning avvaktar för svar"
|
||||||
|
enterEmoji: "Skriv en emoji"
|
||||||
|
renote: "Omnotera"
|
||||||
|
unrenote: "Ta tillbaka omnotering"
|
||||||
|
renoted: "Omnoterad."
|
||||||
|
cantRenote: "Inlägget kunde inte bli omnoterat."
|
||||||
|
cantReRenote: "En omnotering kan inte bli omnoterad."
|
||||||
|
quote: "Citat"
|
||||||
|
pinnedNote: "Fästad not"
|
||||||
|
pinned: "Fäst till profil"
|
||||||
|
you: "Du"
|
||||||
|
clickToShow: "Klicka för att visa"
|
||||||
|
sensitive: "Känsligt innehåll"
|
||||||
|
add: "Lägg till"
|
||||||
|
reaction: "Reaktioner"
|
||||||
|
reactionSetting: "Reaktioner som ska visas i reaktionsväljaren"
|
||||||
|
reactionSettingDescription2: "Dra för att omordna, klicka för att radera, tryck \"+\" för att lägga till."
|
||||||
|
rememberNoteVisibility: "Komihåg notvisningsinställningar"
|
||||||
|
attachCancel: "Ta bort bilaga"
|
||||||
|
markAsSensitive: "Markera som känsligt innehåll"
|
||||||
|
unmarkAsSensitive: "Avmarkera som känsligt innehåll"
|
||||||
|
enterFileName: "Ange filnamn"
|
||||||
|
mute: "Tysta"
|
||||||
|
unmute: "Avtysta"
|
||||||
|
block: "Blockera"
|
||||||
|
unblock: "Avblockera"
|
||||||
|
suspend: "Suspendera"
|
||||||
|
unsuspend: "Ta bort suspenderingen"
|
||||||
|
blockConfirm: "Är du säker att du vill blockera kontot?"
|
||||||
|
unblockConfirm: "Är du säkert att du vill avblockera kontot?"
|
||||||
|
suspendConfirm: "Är du säker att du vill suspendera detta konto?"
|
||||||
|
unsuspendConfirm: "Är du säker att du vill avsuspendera detta konto?"
|
||||||
|
selectList: "Välj lista"
|
||||||
|
selectAntenna: "Välj en antenn"
|
||||||
|
selectWidget: "Välj en widget"
|
||||||
|
editWidgets: "Redigera widgets"
|
||||||
|
editWidgetsExit: "Avsluta redigering"
|
||||||
|
customEmojis: "Anpassa emoji"
|
||||||
|
emoji: "Emoji"
|
||||||
|
emojis: "Emoji"
|
||||||
|
emojiName: "Emoji namn"
|
||||||
|
emojiUrl: "Emoji länk"
|
||||||
|
addEmoji: "Lägg till emoji"
|
||||||
|
settingGuide: "Rekommenderade inställningar"
|
||||||
|
cacheRemoteFiles: "Spara externa filer till cachen"
|
||||||
|
cacheRemoteFilesDescription: "När denna inställning är avstängd kommer externa filer laddas direkt från den externa instansen. Genom att stänga av detta kommer lagringsutrymme minska i användning men kommer öka datatrafiken eftersom miniatyrer inte kommer genereras."
|
||||||
|
flagAsBot: "Markera konto som bot"
|
||||||
|
flagAsBotDescription: "Aktivera det här alternativet om kontot är kontrollerat av ett program. Om aktiverat kommer den fungera som en flagga för andra utvecklare för att hindra ändlösa kedjor med andra bottar. Det kommer också få Misskeys interna system att hantera kontot som en bot."
|
||||||
|
flagAsCat: "Markera konto som katt"
|
||||||
|
flagAsCatDescription: "Aktivera denna inställning för att markera kontot som en katt."
|
||||||
|
flagShowTimelineReplies: "Visa svar i tidslinje"
|
||||||
|
flagShowTimelineRepliesDescription: "Visar användarsvar till andra användares noter i tidslinjen om påslagen."
|
||||||
|
autoAcceptFollowed: "Godkänn följarförfrågningar från användare du följer automatiskt"
|
||||||
|
addAccount: "Lägg till konto"
|
||||||
|
loginFailed: "Inloggningen misslyckades"
|
||||||
|
showOnRemote: "Se på extern instans"
|
||||||
|
general: "Allmänt"
|
||||||
|
wallpaper: "Bakgrundsbild"
|
||||||
|
setWallpaper: "Välj bakgrund"
|
||||||
|
removeWallpaper: "Ta bort bakgrund"
|
||||||
|
searchWith: "Sök: {q}"
|
||||||
|
youHaveNoLists: "Du har inga listor"
|
||||||
|
followConfirm: "Är du säker att du vill följa {name}?"
|
||||||
|
proxyAccount: "Proxykonto"
|
||||||
|
proxyAccountDescription: "Ett proxykonto är ett konto som agerar som en extern följare för användare under vissa villkor. Till exempel, när en användare lägger till en extern användare till en lista så kommer den externa användarens aktivitet inte levireras till instansen om ingen lokal användare följer det kontot, så proxykontot används istället."
|
||||||
|
host: "Värd"
|
||||||
|
selectUser: "Välj användare"
|
||||||
|
recipient: "Mottagare"
|
||||||
|
annotation: "Kommentarer"
|
||||||
|
federation: "Federation"
|
||||||
|
instances: "Instanser"
|
||||||
|
registeredAt: "Registrerad på"
|
||||||
|
latestRequestSentAt: "Senaste förfrågan skickad"
|
||||||
|
latestRequestReceivedAt: "Senaste begäran mottagen"
|
||||||
|
latestStatus: "Senaste status"
|
||||||
|
storageUsage: "Använt lagringsutrymme"
|
||||||
|
charts: "Diagram"
|
||||||
|
perHour: "Per timme"
|
||||||
|
perDay: "Per dag"
|
||||||
|
stopActivityDelivery: "Sluta skicka aktiviteter"
|
||||||
|
blockThisInstance: "Blockera instans"
|
||||||
|
operations: "Operationer"
|
||||||
|
software: "Mjukvara"
|
||||||
|
version: "Version"
|
||||||
|
metadata: "Metadata"
|
||||||
|
withNFiles: "{n} fil(er)"
|
||||||
|
monitor: "Övervakning"
|
||||||
|
jobQueue: "Jobbkö"
|
||||||
|
cpuAndMemory: "CPU och minne"
|
||||||
|
network: "Nätverk"
|
||||||
|
disk: "Disk"
|
||||||
|
instanceInfo: "Instansinformation"
|
||||||
|
statistics: "Statistik"
|
||||||
|
clearQueue: "Rensa kö"
|
||||||
|
clearQueueConfirmTitle: "Är du säker att du vill rensa kön?"
|
||||||
|
clearQueueConfirmText: "Om någon not är olevererad i kön kommer den inte federeras. Vanligtvis behövs inte denna handling."
|
||||||
|
clearCachedFiles: "Rensa cache"
|
||||||
|
clearCachedFilesConfirm: "Är du säker att du vill radera alla cachade externa filer?"
|
||||||
|
blockedInstances: "Blockerade instanser"
|
||||||
|
blockedInstancesDescription: "Lista adressnamn av instanser som du vill blockera. Listade instanser kommer inte längre kommunicera med denna instans."
|
||||||
|
muteAndBlock: "Tystningar och blockeringar"
|
||||||
|
mutedUsers: "Tystade användare"
|
||||||
|
blockedUsers: "Blockerade användare"
|
||||||
|
noUsers: "Det finns inga användare"
|
||||||
|
editProfile: "Redigera profil"
|
||||||
|
noteDeleteConfirm: "Är du säker på att du vill ta bort denna not?"
|
||||||
|
pinLimitExceeded: "Du kan inte fästa fler noter"
|
||||||
|
intro: "Misskey har installerats! Vänligen skapa en adminanvändare."
|
||||||
|
done: "Klar"
|
||||||
|
processing: "Bearbetar..."
|
||||||
|
preview: "Förhandsvisning"
|
||||||
|
default: "Standard"
|
||||||
|
noCustomEmojis: "Det finns ingen emoji"
|
||||||
|
noJobs: "Det finns inga jobb"
|
||||||
|
federating: "Federerar"
|
||||||
|
blocked: "Blockerad"
|
||||||
|
suspended: "Suspenderad"
|
||||||
|
all: "Allt"
|
||||||
|
subscribing: "Prenumererar"
|
||||||
|
publishing: "Publiceras"
|
||||||
|
notResponding: "Svarar inte"
|
||||||
|
instanceFollowing: "Följer på instans"
|
||||||
|
instanceFollowers: "Följare av instans"
|
||||||
|
instanceUsers: "Användare av denna instans"
|
||||||
|
changePassword: "Ändra lösenord"
|
||||||
|
security: "Säkerhet"
|
||||||
|
retypedNotMatch: "Inmatningen matchar inte"
|
||||||
|
currentPassword: "Nuvarande lösenord"
|
||||||
|
newPassword: "Nytt lösenord"
|
||||||
|
newPasswordRetype: "Bekräfta lösenord"
|
||||||
|
attachFile: "Bifoga filer"
|
||||||
|
more: "Mer!"
|
||||||
|
featured: "Utvalda"
|
||||||
|
usernameOrUserId: "Användarnamn eller användar-id"
|
||||||
|
noSuchUser: "Kan inte hitta användaren"
|
||||||
|
lookup: "Sökning"
|
||||||
|
announcements: "Nyheter"
|
||||||
|
imageUrl: "Bild-URL"
|
||||||
|
remove: "Radera"
|
||||||
|
removed: "Borttaget"
|
||||||
|
removeAreYouSure: "Är du säker att du vill radera \"{x}\"?"
|
||||||
|
deleteAreYouSure: "Är du säker att du vill radera \"{x}\"?"
|
||||||
|
resetAreYouSure: "Vill du återställa?"
|
||||||
|
saved: "Sparad"
|
||||||
|
messaging: "Chatt"
|
||||||
|
upload: "Ladda upp"
|
||||||
|
keepOriginalUploading: "Behåll originalbild"
|
||||||
|
nsfw: "Känsligt innehåll"
|
||||||
|
pinnedNotes: "Fästad not"
|
||||||
|
userList: "Listor"
|
||||||
|
smtpHost: "Värd"
|
||||||
|
smtpUser: "Användarnamn"
|
||||||
|
smtpPass: "Lösenord"
|
||||||
|
clearCache: "Rensa cache"
|
||||||
|
user: "Användare"
|
||||||
|
searchByGoogle: "Sök"
|
||||||
|
_email:
|
||||||
|
_follow:
|
||||||
|
title: "följde dig"
|
||||||
|
_mfm:
|
||||||
|
mention: "Nämn"
|
||||||
|
quote: "Citat"
|
||||||
|
emoji: "Anpassa emoji"
|
||||||
|
search: "Sök"
|
||||||
|
_theme:
|
||||||
|
keys:
|
||||||
|
mention: "Nämn"
|
||||||
|
renote: "Omnotera"
|
||||||
|
_sfx:
|
||||||
|
note: "Noter"
|
||||||
|
notification: "Notifikationer"
|
||||||
|
chat: "Chatt"
|
||||||
|
_widgets:
|
||||||
|
notifications: "Notifikationer"
|
||||||
|
timeline: "Tidslinje"
|
||||||
|
federation: "Federation"
|
||||||
|
jobQueue: "Jobbkö"
|
||||||
|
_cw:
|
||||||
|
show: "Ladda mer"
|
||||||
|
_visibility:
|
||||||
|
followers: "Följare"
|
||||||
|
_profile:
|
||||||
|
username: "Användarnamn"
|
||||||
|
_exportOrImport:
|
||||||
|
followingList: "Följer"
|
||||||
|
muteList: "Tysta"
|
||||||
|
blockingList: "Blockera"
|
||||||
|
userLists: "Listor"
|
||||||
|
_charts:
|
||||||
|
federation: "Federation"
|
||||||
|
_pages:
|
||||||
|
script:
|
||||||
|
categories:
|
||||||
|
list: "Listor"
|
||||||
|
blocks:
|
||||||
|
_join:
|
||||||
|
arg1: "Listor"
|
||||||
|
_randomPick:
|
||||||
|
arg1: "Listor"
|
||||||
|
_dailyRandomPick:
|
||||||
|
arg1: "Listor"
|
||||||
|
_seedRandomPick:
|
||||||
|
arg2: "Listor"
|
||||||
|
_pick:
|
||||||
|
arg1: "Listor"
|
||||||
|
_listLen:
|
||||||
|
arg1: "Listor"
|
||||||
|
types:
|
||||||
|
array: "Listor"
|
||||||
|
_notification:
|
||||||
|
youWereFollowed: "följde dig"
|
||||||
|
_types:
|
||||||
|
follow: "Följer"
|
||||||
|
mention: "Nämn"
|
||||||
|
renote: "Omnotera"
|
||||||
|
quote: "Citat"
|
||||||
|
reaction: "Reaktioner"
|
||||||
|
_actions:
|
||||||
|
reply: "Svara"
|
||||||
|
renote: "Omnotera"
|
||||||
|
_deck:
|
||||||
|
_columns:
|
||||||
|
notifications: "Notifikationer"
|
||||||
|
tl: "Tidslinje"
|
||||||
|
list: "Listor"
|
||||||
|
mentions: "Omnämningar"
|
|
@ -919,7 +919,6 @@ _sfx:
|
||||||
antenna: "Прийом антени"
|
antenna: "Прийом антени"
|
||||||
channel: "Повідомлення каналу"
|
channel: "Повідомлення каналу"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Невідомо"
|
|
||||||
future: "Майбутнє"
|
future: "Майбутнє"
|
||||||
justNow: "Щойно"
|
justNow: "Щойно"
|
||||||
secondsAgo: "{n}с тому"
|
secondsAgo: "{n}с тому"
|
||||||
|
|
|
@ -842,6 +842,7 @@ oneDay: "1 ngày"
|
||||||
oneWeek: "1 tuần"
|
oneWeek: "1 tuần"
|
||||||
reflectMayTakeTime: "Có thể mất một thời gian để điều này được áp dụng."
|
reflectMayTakeTime: "Có thể mất một thời gian để điều này được áp dụng."
|
||||||
failedToFetchAccountInformation: "Không thể lấy thông tin tài khoản"
|
failedToFetchAccountInformation: "Không thể lấy thông tin tài khoản"
|
||||||
|
rateLimitExceeded: "Giới hạn quá mức"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "Địa chỉ email đã được sử dụng"
|
used: "Địa chỉ email đã được sử dụng"
|
||||||
format: "Địa chỉ email không hợp lệ"
|
format: "Địa chỉ email không hợp lệ"
|
||||||
|
@ -1087,7 +1088,6 @@ _sfx:
|
||||||
antenna: "Trạm phát sóng"
|
antenna: "Trạm phát sóng"
|
||||||
channel: "Kênh"
|
channel: "Kênh"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "Không rõ"
|
|
||||||
future: "Tương lai"
|
future: "Tương lai"
|
||||||
justNow: "Vừa xong"
|
justNow: "Vừa xong"
|
||||||
secondsAgo: "{n}s trước"
|
secondsAgo: "{n}s trước"
|
||||||
|
@ -1131,6 +1131,7 @@ _2fa:
|
||||||
registerKey: "Đăng ký một mã bảo vệ"
|
registerKey: "Đăng ký một mã bảo vệ"
|
||||||
step1: "Trước tiên, hãy cài đặt một ứng dụng xác minh (chẳng hạn như {a} hoặc {b}) trên thiết bị của bạn."
|
step1: "Trước tiên, hãy cài đặt một ứng dụng xác minh (chẳng hạn như {a} hoặc {b}) trên thiết bị của bạn."
|
||||||
step2: "Sau đó, quét mã QR hiển thị trên màn hình này."
|
step2: "Sau đó, quét mã QR hiển thị trên màn hình này."
|
||||||
|
step2Url: "Bạn cũng có thể nhập URL này nếu sử dụng một chương trình máy tính:"
|
||||||
step3: "Nhập mã token do ứng dụng của bạn cung cấp để hoàn tất thiết lập."
|
step3: "Nhập mã token do ứng dụng của bạn cung cấp để hoàn tất thiết lập."
|
||||||
step4: "Kể từ bây giờ, những lần đăng nhập trong tương lai sẽ yêu cầu mã token đăng nhập đó."
|
step4: "Kể từ bây giờ, những lần đăng nhập trong tương lai sẽ yêu cầu mã token đăng nhập đó."
|
||||||
securityKeyInfo: "Bên cạnh xác minh bằng vân tay hoặc mã PIN, bạn cũng có thể thiết lập xác minh thông qua khóa bảo mật phần cứng hỗ trợ FIDO2 để bảo mật hơn nữa cho tài khoản của mình."
|
securityKeyInfo: "Bên cạnh xác minh bằng vân tay hoặc mã PIN, bạn cũng có thể thiết lập xác minh thông qua khóa bảo mật phần cứng hỗ trợ FIDO2 để bảo mật hơn nữa cho tài khoản của mình."
|
||||||
|
|
|
@ -1087,7 +1087,6 @@ _sfx:
|
||||||
antenna: "天线接收"
|
antenna: "天线接收"
|
||||||
channel: "频道通知"
|
channel: "频道通知"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "未知"
|
|
||||||
future: "未来"
|
future: "未来"
|
||||||
justNow: "最近"
|
justNow: "最近"
|
||||||
secondsAgo: "{n}秒前"
|
secondsAgo: "{n}秒前"
|
||||||
|
@ -1131,6 +1130,7 @@ _2fa:
|
||||||
registerKey: "注册密钥"
|
registerKey: "注册密钥"
|
||||||
step1: "首先,在您的设备上安装验证应用,例如{a}或{b}。"
|
step1: "首先,在您的设备上安装验证应用,例如{a}或{b}。"
|
||||||
step2: "然后,扫描屏幕上显示的二维码。"
|
step2: "然后,扫描屏幕上显示的二维码。"
|
||||||
|
step2Url: "在桌面应用程序中输入以下URL:"
|
||||||
step3: "输入您的应用提供的动态口令以完成设置。"
|
step3: "输入您的应用提供的动态口令以完成设置。"
|
||||||
step4: "从现在开始,任何登录操作都将要求您提供动态口令。"
|
step4: "从现在开始,任何登录操作都将要求您提供动态口令。"
|
||||||
securityKeyInfo: "您可以设置使用支持FIDO2的硬件安全密钥、设备上的指纹或PIN来保护您的登录过程。"
|
securityKeyInfo: "您可以设置使用支持FIDO2的硬件安全密钥、设备上的指纹或PIN来保护您的登录过程。"
|
||||||
|
|
|
@ -1087,7 +1087,6 @@ _sfx:
|
||||||
antenna: "天線接收"
|
antenna: "天線接收"
|
||||||
channel: "頻道通知"
|
channel: "頻道通知"
|
||||||
_ago:
|
_ago:
|
||||||
unknown: "未知"
|
|
||||||
future: "未來"
|
future: "未來"
|
||||||
justNow: "剛剛"
|
justNow: "剛剛"
|
||||||
secondsAgo: "{n}秒前"
|
secondsAgo: "{n}秒前"
|
||||||
|
@ -1131,6 +1130,7 @@ _2fa:
|
||||||
registerKey: "註冊鍵"
|
registerKey: "註冊鍵"
|
||||||
step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。"
|
step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。"
|
||||||
step2: "然後,掃描螢幕上的QR code。"
|
step2: "然後,掃描螢幕上的QR code。"
|
||||||
|
step2Url: "在桌面版應用中,請輸入以下的URL:"
|
||||||
step3: "輸入您的App提供的權杖以完成設定。"
|
step3: "輸入您的App提供的權杖以完成設定。"
|
||||||
step4: "從現在開始,任何登入操作都將要求您提供權杖。"
|
step4: "從現在開始,任何登入操作都將要求您提供權杖。"
|
||||||
securityKeyInfo: "您可以設定使用支援FIDO2的硬體安全鎖、終端設備的指纹認證或者PIN碼來登入。"
|
securityKeyInfo: "您可以設定使用支援FIDO2的硬體安全鎖、終端設備的指纹認證或者PIN碼來登入。"
|
||||||
|
|
10
package.json
10
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "12.110.1",
|
"version": "12.111.1",
|
||||||
"codename": "indigo",
|
"codename": "indigo",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
"watch": "yarn dev",
|
"watch": "yarn dev",
|
||||||
"dev": "node ./scripts/dev.js",
|
"dev": "node ./scripts/dev.js",
|
||||||
"lint": "yarn workspaces foreach run lint",
|
"lint": "yarn workspaces foreach run lint",
|
||||||
"cy:open": "cypress open",
|
"cy:open": "cypress open --browser --e2e --config-file=cypress.config.ts",
|
||||||
"cy:run": "cypress run",
|
"cy:run": "cypress run",
|
||||||
"e2e": "start-server-and-test start:test http://localhost:61812 cy:run",
|
"e2e": "start-server-and-test start:test http://localhost:61812 cy:run",
|
||||||
"mocha": "yarn workspace backend run mocha",
|
"mocha": "yarn workspace backend run mocha",
|
||||||
|
@ -48,13 +48,13 @@
|
||||||
"@types/gulp": "4.0.9",
|
"@types/gulp": "4.0.9",
|
||||||
"@types/gulp-rename": "2.0.1",
|
"@types/gulp-rename": "2.0.1",
|
||||||
"@typescript-eslint/eslint-plugin": "latest",
|
"@typescript-eslint/eslint-plugin": "latest",
|
||||||
"@typescript-eslint/parser": "5.27.0",
|
"@typescript-eslint/parser": "5.27.1",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "9.7.0",
|
"cypress": "10.0.3",
|
||||||
"eslint-plugin-import": "^2.26.0",
|
"eslint-plugin-import": "^2.26.0",
|
||||||
"eslint-plugin-vue": "latest",
|
"eslint-plugin-vue": "latest",
|
||||||
"start-server-and-test": "1.14.0",
|
"start-server-and-test": "1.14.0",
|
||||||
"typescript": "4.7.2",
|
"typescript": "4.7.3",
|
||||||
"vue-eslint-parser": "^9.0.2"
|
"vue-eslint-parser": "^9.0.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,6 @@
|
||||||
"loader=./test/loader.js"
|
"loader=./test/loader.js"
|
||||||
],
|
],
|
||||||
"slow": 1000,
|
"slow": 1000,
|
||||||
"timeout": 3000,
|
"timeout": 10000,
|
||||||
"exit": true
|
"exit": true
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,10 +35,9 @@
|
||||||
"archiver": "5.3.1",
|
"archiver": "5.3.1",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"aws-sdk": "2.1145.0",
|
"aws-sdk": "2.1152.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "1.1.5",
|
"blurhash": "1.1.5",
|
||||||
"broadcast-channel": "4.12.0",
|
|
||||||
"bull": "4.8.3",
|
"bull": "4.8.3",
|
||||||
"cacheable-lookup": "6.0.4",
|
"cacheable-lookup": "6.0.4",
|
||||||
"cbor": "8.1.0",
|
"cbor": "8.1.0",
|
||||||
|
@ -51,7 +50,7 @@
|
||||||
"deep-email-validator": "0.1.21",
|
"deep-email-validator": "0.1.21",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"feed": "4.2.2",
|
"feed": "4.2.2",
|
||||||
"file-type": "17.1.1",
|
"file-type": "17.1.2",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
"got": "12.1.0",
|
"got": "12.1.0",
|
||||||
"hpagent": "0.1.2",
|
"hpagent": "0.1.2",
|
||||||
|
@ -61,8 +60,8 @@
|
||||||
"jsdom": "19.0.0",
|
"jsdom": "19.0.0",
|
||||||
"json5": "2.2.1",
|
"json5": "2.2.1",
|
||||||
"json5-loader": "4.0.1",
|
"json5-loader": "4.0.1",
|
||||||
"jsonld": "5.2.0",
|
"jsonld": "6.0.0",
|
||||||
"jsrsasign": "10.5.23",
|
"jsrsasign": "10.5.24",
|
||||||
"koa": "2.13.4",
|
"koa": "2.13.4",
|
||||||
"koa-bodyparser": "4.3.0",
|
"koa-bodyparser": "4.3.0",
|
||||||
"koa-favicon": "2.1.0",
|
"koa-favicon": "2.1.0",
|
||||||
|
@ -79,7 +78,7 @@
|
||||||
"ms": "3.0.0-canary.1",
|
"ms": "3.0.0-canary.1",
|
||||||
"multer": "1.4.4",
|
"multer": "1.4.4",
|
||||||
"nested-property": "4.0.0",
|
"nested-property": "4.0.0",
|
||||||
"node-fetch": "3.2.4",
|
"node-fetch": "3.2.6",
|
||||||
"nodemailer": "6.7.5",
|
"nodemailer": "6.7.5",
|
||||||
"oauth": "^0.9.15",
|
"oauth": "^0.9.15",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
|
@ -115,8 +114,8 @@
|
||||||
"tinycolor2": "1.4.2",
|
"tinycolor2": "1.4.2",
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"ts-loader": "9.3.0",
|
"ts-loader": "9.3.0",
|
||||||
"ts-node": "10.8.0",
|
"ts-node": "10.8.1",
|
||||||
"tsc-alias": "1.6.7",
|
"tsc-alias": "1.6.9",
|
||||||
"tsconfig-paths": "4.0.0",
|
"tsconfig-paths": "4.0.0",
|
||||||
"twemoji-parser": "14.0.0",
|
"twemoji-parser": "14.0.0",
|
||||||
"typeorm": "0.3.6",
|
"typeorm": "0.3.6",
|
||||||
|
@ -125,7 +124,7 @@
|
||||||
"uuid": "8.3.2",
|
"uuid": "8.3.2",
|
||||||
"web-push": "3.5.0",
|
"web-push": "3.5.0",
|
||||||
"websocket": "1.0.34",
|
"websocket": "1.0.34",
|
||||||
"ws": "8.7.0",
|
"ws": "8.8.0",
|
||||||
"xev": "3.0.2"
|
"xev": "3.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -152,7 +151,7 @@
|
||||||
"@types/koa__multer": "2.0.4",
|
"@types/koa__multer": "2.0.4",
|
||||||
"@types/koa__router": "8.0.11",
|
"@types/koa__router": "8.0.11",
|
||||||
"@types/mocha": "9.1.1",
|
"@types/mocha": "9.1.1",
|
||||||
"@types/node": "17.0.36",
|
"@types/node": "17.0.41",
|
||||||
"@types/node-fetch": "3.0.3",
|
"@types/node-fetch": "3.0.3",
|
||||||
"@types/nodemailer": "6.4.4",
|
"@types/nodemailer": "6.4.4",
|
||||||
"@types/oauth": "0.9.1",
|
"@types/oauth": "0.9.1",
|
||||||
|
@ -175,10 +174,10 @@
|
||||||
"@types/web-push": "3.3.2",
|
"@types/web-push": "3.3.2",
|
||||||
"@types/websocket": "1.0.5",
|
"@types/websocket": "1.0.5",
|
||||||
"@types/ws": "8.5.3",
|
"@types/ws": "8.5.3",
|
||||||
"@typescript-eslint/eslint-plugin": "5.27.0",
|
"@typescript-eslint/eslint-plugin": "5.27.1",
|
||||||
"@typescript-eslint/parser": "5.27.0",
|
"@typescript-eslint/parser": "5.27.1",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"eslint": "8.16.0",
|
"eslint": "8.17.0",
|
||||||
"eslint-plugin-import": "2.26.0",
|
"eslint-plugin-import": "2.26.0",
|
||||||
"execa": "6.1.0",
|
"execa": "6.1.0",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "^4.0.0",
|
||||||
|
|
|
@ -208,7 +208,15 @@ export const db = new DataSource({
|
||||||
migrations: ['../../migration/*.js'],
|
migrations: ['../../migration/*.js'],
|
||||||
});
|
});
|
||||||
|
|
||||||
export async function initDb() {
|
export async function initDb(force = false) {
|
||||||
|
if (force) {
|
||||||
|
if (db.isInitialized) {
|
||||||
|
await db.destroy();
|
||||||
|
}
|
||||||
|
await db.initialize();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (db.isInitialized) {
|
if (db.isInitialized) {
|
||||||
// nop
|
// nop
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -11,9 +11,14 @@ export function createTemp(): Promise<[string, () => void]> {
|
||||||
|
|
||||||
export function createTempDir(): Promise<[string, () => void]> {
|
export function createTempDir(): Promise<[string, () => void]> {
|
||||||
return new Promise<[string, () => void]>((res, rej) => {
|
return new Promise<[string, () => void]>((res, rej) => {
|
||||||
tmp.dir((e, path, cleanup) => {
|
tmp.dir(
|
||||||
if (e) return rej(e);
|
{
|
||||||
res([path, cleanup]);
|
unsafeCleanup: true,
|
||||||
});
|
},
|
||||||
|
(e, path, cleanup) => {
|
||||||
|
if (e) return rej(e);
|
||||||
|
res([path, cleanup]);
|
||||||
|
}
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,6 +136,7 @@ async function populateMyReaction(note: Note, meId: User['id'], _hint_?: {
|
||||||
|
|
||||||
export const NoteRepository = db.getRepository(Note).extend({
|
export const NoteRepository = db.getRepository(Note).extend({
|
||||||
async isVisibleForMe(note: Note, meId: User['id'] | null): Promise<boolean> {
|
async isVisibleForMe(note: Note, meId: User['id'] | null): Promise<boolean> {
|
||||||
|
// This code must always be synchronized with the checks in generateVisibilityQuery.
|
||||||
// visibility が specified かつ自分が指定されていなかったら非表示
|
// visibility が specified かつ自分が指定されていなかったら非表示
|
||||||
if (note.visibility === 'specified') {
|
if (note.visibility === 'specified') {
|
||||||
if (meId == null) {
|
if (meId == null) {
|
||||||
|
|
|
@ -197,7 +197,14 @@ export async function createNote(value: string | IObject, resolver?: Resolver, s
|
||||||
const cw = note.summary === '' ? null : note.summary;
|
const cw = note.summary === '' ? null : note.summary;
|
||||||
|
|
||||||
// テキストのパース
|
// テキストのパース
|
||||||
const text = typeof note._misskey_content !== 'undefined' ? note._misskey_content : (note.content ? htmlToMfm(note.content, note.tag) : null);
|
let text: string | null = null;
|
||||||
|
if (note.source?.mediaType === 'text/x.misskeymarkdown' && typeof note.source?.content === 'string') {
|
||||||
|
text = note.source.content;
|
||||||
|
} else if (typeof note._misskey_content !== 'undefined') {
|
||||||
|
text = note._misskey_content;
|
||||||
|
} else if (typeof note.content === 'string') {
|
||||||
|
text = htmlToMfm(note.content, note.tag);
|
||||||
|
}
|
||||||
|
|
||||||
// vote
|
// vote
|
||||||
if (reply && reply.hasPoll) {
|
if (reply && reply.hasPoll) {
|
||||||
|
|
|
@ -82,15 +82,14 @@ export default async function renderNote(note: Note, dive = true, isTalk = false
|
||||||
|
|
||||||
const files = await getPromisedFiles(note.fileIds);
|
const files = await getPromisedFiles(note.fileIds);
|
||||||
|
|
||||||
// text should never be undefined
|
const text = note.text ?? '';
|
||||||
const text = note.text ?? null;
|
|
||||||
let poll: Poll | null = null;
|
let poll: Poll | null = null;
|
||||||
|
|
||||||
if (note.hasPoll) {
|
if (note.hasPoll) {
|
||||||
poll = await Polls.findOneBy({ noteId: note.id });
|
poll = await Polls.findOneBy({ noteId: note.id });
|
||||||
}
|
}
|
||||||
|
|
||||||
let apText = text ?? '';
|
let apText = text;
|
||||||
|
|
||||||
if (quote) {
|
if (quote) {
|
||||||
apText += `\n\nRE: ${quote}`;
|
apText += `\n\nRE: ${quote}`;
|
||||||
|
@ -138,6 +137,10 @@ export default async function renderNote(note: Note, dive = true, isTalk = false
|
||||||
summary,
|
summary,
|
||||||
content,
|
content,
|
||||||
_misskey_content: text,
|
_misskey_content: text,
|
||||||
|
source: {
|
||||||
|
content: text,
|
||||||
|
mediaType: "text/x.misskeymarkdown",
|
||||||
|
},
|
||||||
_misskey_quote: quote,
|
_misskey_quote: quote,
|
||||||
quoteUrl: quote,
|
quoteUrl: quote,
|
||||||
published: note.createdAt.toISOString(),
|
published: note.createdAt.toISOString(),
|
||||||
|
|
|
@ -106,7 +106,10 @@ export const isPost = (object: IObject): object is IPost =>
|
||||||
|
|
||||||
export interface IPost extends IObject {
|
export interface IPost extends IObject {
|
||||||
type: 'Note' | 'Question' | 'Article' | 'Audio' | 'Document' | 'Image' | 'Page' | 'Video' | 'Event';
|
type: 'Note' | 'Question' | 'Article' | 'Audio' | 'Document' | 'Image' | 'Page' | 'Video' | 'Event';
|
||||||
_misskey_content?: string;
|
source?: {
|
||||||
|
content: string;
|
||||||
|
mediaType: string;
|
||||||
|
};
|
||||||
_misskey_quote?: string;
|
_misskey_quote?: string;
|
||||||
quoteUrl?: string;
|
quoteUrl?: string;
|
||||||
_misskey_talk: boolean;
|
_misskey_talk: boolean;
|
||||||
|
@ -114,7 +117,10 @@ export interface IPost extends IObject {
|
||||||
|
|
||||||
export interface IQuestion extends IObject {
|
export interface IQuestion extends IObject {
|
||||||
type: 'Note' | 'Question';
|
type: 'Note' | 'Question';
|
||||||
_misskey_content?: string;
|
source?: {
|
||||||
|
content: string;
|
||||||
|
mediaType: string;
|
||||||
|
};
|
||||||
_misskey_quote?: string;
|
_misskey_quote?: string;
|
||||||
quoteUrl?: string;
|
quoteUrl?: string;
|
||||||
oneOf?: IQuestionChoice[];
|
oneOf?: IQuestionChoice[];
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import Koa from 'koa';
|
|
||||||
import { performance } from 'perf_hooks';
|
import { performance } from 'perf_hooks';
|
||||||
import { limiter } from './limiter.js';
|
import Koa from 'koa';
|
||||||
import { CacheableLocalUser, User } from '@/models/entities/user.js';
|
import { CacheableLocalUser, User } from '@/models/entities/user.js';
|
||||||
|
import { AccessToken } from '@/models/entities/access-token.js';
|
||||||
|
import { getIpHash } from '@/misc/get-ip-hash.js';
|
||||||
|
import { limiter } from './limiter.js';
|
||||||
import endpoints, { IEndpointMeta } from './endpoints.js';
|
import endpoints, { IEndpointMeta } from './endpoints.js';
|
||||||
import { ApiError } from './error.js';
|
import { ApiError } from './error.js';
|
||||||
import { apiLogger } from './logger.js';
|
import { apiLogger } from './logger.js';
|
||||||
import { AccessToken } from '@/models/entities/access-token.js';
|
|
||||||
import { getIpHash } from '@/misc/get-ip-hash.js';
|
|
||||||
|
|
||||||
const accessDenied = {
|
const accessDenied = {
|
||||||
message: 'Access denied.',
|
message: 'Access denied.',
|
||||||
|
@ -33,7 +33,7 @@ export default async (endpoint: string, user: CacheableLocalUser | null | undefi
|
||||||
throw new ApiError(accessDenied);
|
throw new ApiError(accessDenied);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ep.meta.limit && !isModerator) {
|
if (ep.meta.limit) {
|
||||||
// koa will automatically load the `X-Forwarded-For` header if `proxy: true` is configured in the app.
|
// koa will automatically load the `X-Forwarded-For` header if `proxy: true` is configured in the app.
|
||||||
let limitActor: string;
|
let limitActor: string;
|
||||||
if (user) {
|
if (user) {
|
||||||
|
@ -120,20 +120,20 @@ export default async (endpoint: string, user: CacheableLocalUser | null | undefi
|
||||||
if (e instanceof ApiError) {
|
if (e instanceof ApiError) {
|
||||||
throw e;
|
throw e;
|
||||||
} else {
|
} else {
|
||||||
apiLogger.error(`Internal error occurred in ${ep.name}: ${e?.message}`, {
|
apiLogger.error(`Internal error occurred in ${ep.name}: ${e.message}`, {
|
||||||
ep: ep.name,
|
ep: ep.name,
|
||||||
ps: data,
|
ps: data,
|
||||||
e: {
|
e: {
|
||||||
message: e?.message,
|
message: e.message,
|
||||||
code: e?.name,
|
code: e.name,
|
||||||
stack: e?.stack,
|
stack: e.stack,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
throw new ApiError(null, {
|
throw new ApiError(null, {
|
||||||
e: {
|
e: {
|
||||||
message: e?.message,
|
message: e.message,
|
||||||
code: e?.name,
|
code: e.name,
|
||||||
stack: e?.stack,
|
stack: e.stack,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { Followings } from '@/models/index.js';
|
||||||
import { Brackets, SelectQueryBuilder } from 'typeorm';
|
import { Brackets, SelectQueryBuilder } from 'typeorm';
|
||||||
|
|
||||||
export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
|
export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
|
||||||
|
// This code must always be synchronized with the checks in Notes.isVisibleForMe.
|
||||||
if (me == null) {
|
if (me == null) {
|
||||||
q.andWhere(new Brackets(qb => { qb
|
q.andWhere(new Brackets(qb => { qb
|
||||||
.where(`note.visibility = 'public'`)
|
.where(`note.visibility = 'public'`)
|
||||||
|
@ -11,7 +12,7 @@ export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: { id: U
|
||||||
} else {
|
} else {
|
||||||
const followingQuery = Followings.createQueryBuilder('following')
|
const followingQuery = Followings.createQueryBuilder('following')
|
||||||
.select('following.followeeId')
|
.select('following.followeeId')
|
||||||
.where('following.followerId = :followerId', { followerId: me.id });
|
.where('following.followerId = :meId');
|
||||||
|
|
||||||
q.andWhere(new Brackets(qb => { qb
|
q.andWhere(new Brackets(qb => { qb
|
||||||
// 公開投稿である
|
// 公開投稿である
|
||||||
|
@ -20,21 +21,22 @@ export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: { id: U
|
||||||
.orWhere(`note.visibility = 'home'`);
|
.orWhere(`note.visibility = 'home'`);
|
||||||
}))
|
}))
|
||||||
// または 自分自身
|
// または 自分自身
|
||||||
.orWhere('note.userId = :userId1', { userId1: me.id })
|
.orWhere('note.userId = :meId')
|
||||||
// または 自分宛て
|
// または 自分宛て
|
||||||
.orWhere(`'{"${me.id}"}' <@ note.visibleUserIds`)
|
.orWhere(':meId = ANY(note.visibleUserIds)')
|
||||||
|
.orWhere(':meId = ANY(note.mentions)')
|
||||||
.orWhere(new Brackets(qb => { qb
|
.orWhere(new Brackets(qb => { qb
|
||||||
// または フォロワー宛ての投稿であり、
|
// または フォロワー宛ての投稿であり、
|
||||||
.where('note.visibility = \'followers\'')
|
.where(`note.visibility = 'followers'`)
|
||||||
.andWhere(new Brackets(qb => { qb
|
.andWhere(new Brackets(qb => { qb
|
||||||
// 自分がフォロワーである
|
// 自分がフォロワーである
|
||||||
.where(`note.userId IN (${ followingQuery.getQuery() })`)
|
.where(`note.userId IN (${ followingQuery.getQuery() })`)
|
||||||
// または 自分の投稿へのリプライ
|
// または 自分の投稿へのリプライ
|
||||||
.orWhere('note.replyUserId = :userId3', { userId3: me.id });
|
.orWhere('note.replyUserId = :meId');
|
||||||
}));
|
}));
|
||||||
}));
|
}));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
q.setParameters(followingQuery.getParameters());
|
q.setParameters({ meId: me.id });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,8 @@ export async function readNotification(
|
||||||
userId: User['id'],
|
userId: User['id'],
|
||||||
notificationIds: Notification['id'][]
|
notificationIds: Notification['id'][]
|
||||||
) {
|
) {
|
||||||
|
if (notificationIds.length === 0) return;
|
||||||
|
|
||||||
// Update documents
|
// Update documents
|
||||||
await Notifications.update({
|
await Notifications.update({
|
||||||
id: In(notificationIds),
|
id: In(notificationIds),
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import define from '../define.js';
|
|
||||||
import { Announcements, AnnouncementReads } from '@/models/index.js';
|
import { Announcements, AnnouncementReads } from '@/models/index.js';
|
||||||
|
import define from '../define.js';
|
||||||
import { makePaginationQuery } from '../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../common/make-pagination-query.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import define from '../define.js';
|
|
||||||
import { fetchMeta } from '@/misc/fetch-meta.js';
|
import { fetchMeta } from '@/misc/fetch-meta.js';
|
||||||
import { DriveFiles } from '@/models/index.js';
|
import { DriveFiles } from '@/models/index.js';
|
||||||
|
import define from '../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['drive', 'account'],
|
tags: ['drive', 'account'],
|
||||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
||||||
|
|
||||||
kind: 'read:drive',
|
kind: 'read:drive',
|
||||||
|
|
||||||
|
description: 'Find the notes to which the given file is attached.',
|
||||||
|
|
||||||
res: {
|
res: {
|
||||||
type: 'array',
|
type: 'array',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
|
@ -8,6 +8,8 @@ export const meta = {
|
||||||
|
|
||||||
kind: 'read:drive',
|
kind: 'read:drive',
|
||||||
|
|
||||||
|
description: 'Check if a given file exists.',
|
||||||
|
|
||||||
res: {
|
res: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
|
@ -20,6 +20,8 @@ export const meta = {
|
||||||
|
|
||||||
kind: 'write:drive',
|
kind: 'write:drive',
|
||||||
|
|
||||||
|
description: 'Upload a new drive file.',
|
||||||
|
|
||||||
res: {
|
res: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
|
@ -11,6 +11,8 @@ export const meta = {
|
||||||
|
|
||||||
kind: 'write:drive',
|
kind: 'write:drive',
|
||||||
|
|
||||||
|
description: 'Delete an existing drive file.',
|
||||||
|
|
||||||
errors: {
|
errors: {
|
||||||
noSuchFile: {
|
noSuchFile: {
|
||||||
message: 'No such file.',
|
message: 'No such file.',
|
||||||
|
|
|
@ -8,6 +8,8 @@ export const meta = {
|
||||||
|
|
||||||
kind: 'read:drive',
|
kind: 'read:drive',
|
||||||
|
|
||||||
|
description: 'Search for a drive file by a hash of the contents.',
|
||||||
|
|
||||||
res: {
|
res: {
|
||||||
type: 'array',
|
type: 'array',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
|
@ -9,6 +9,8 @@ export const meta = {
|
||||||
|
|
||||||
kind: 'read:drive',
|
kind: 'read:drive',
|
||||||
|
|
||||||
|
description: 'Search for a drive file by the given parameters.',
|
||||||
|
|
||||||
res: {
|
res: {
|
||||||
type: 'array',
|
type: 'array',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
|
@ -10,6 +10,8 @@ export const meta = {
|
||||||
|
|
||||||
kind: 'read:drive',
|
kind: 'read:drive',
|
||||||
|
|
||||||
|
description: 'Show the properties of a drive file.',
|
||||||
|
|
||||||
res: {
|
res: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
|
@ -11,6 +11,8 @@ export const meta = {
|
||||||
|
|
||||||
kind: 'write:drive',
|
kind: 'write:drive',
|
||||||
|
|
||||||
|
description: 'Update the properties of a drive file.',
|
||||||
|
|
||||||
errors: {
|
errors: {
|
||||||
invalidFileName: {
|
invalidFileName: {
|
||||||
message: 'Invalid file name.',
|
message: 'Invalid file name.',
|
||||||
|
|
|
@ -13,6 +13,8 @@ export const meta = {
|
||||||
max: 60,
|
max: 60,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
description: 'Request the server to download a new drive file from the specified URL.',
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
|
|
||||||
kind: 'write:drive',
|
kind: 'write:drive',
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import define from '../define.js';
|
|
||||||
import { createExportCustomEmojisJob } from '@/queue/index.js';
|
|
||||||
import ms from 'ms';
|
import ms from 'ms';
|
||||||
|
import { createExportCustomEmojisJob } from '@/queue/index.js';
|
||||||
|
import define from '../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
secure: true,
|
secure: true,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { MoreThan } from 'typeorm';
|
||||||
import { USER_ONLINE_THRESHOLD } from '@/const.js';
|
import { USER_ONLINE_THRESHOLD } from '@/const.js';
|
||||||
import { Users } from '@/models/index.js';
|
import { Users } from '@/models/index.js';
|
||||||
import { MoreThan } from 'typeorm';
|
|
||||||
import define from '../define.js';
|
import define from '../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import define from '../define.js';
|
|
||||||
import { Users } from '@/models/index.js';
|
import { Users } from '@/models/index.js';
|
||||||
|
import define from '../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['account'],
|
tags: ['account'],
|
||||||
|
|
|
@ -1,17 +1,22 @@
|
||||||
|
import { Brackets } from 'typeorm';
|
||||||
|
import { Notifications, Followings, Mutings, Users } from '@/models/index.js';
|
||||||
|
import { notificationTypes } from '@/types.js';
|
||||||
|
import read from '@/services/note/read.js';
|
||||||
import { readNotification } from '../../common/read-notification.js';
|
import { readNotification } from '../../common/read-notification.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
import { generateMutedInstanceNotificationQuery } from '../../common/generate-muted-instance-query.js';
|
import { generateMutedInstanceNotificationQuery } from '../../common/generate-muted-instance-query.js';
|
||||||
import { Notifications, Followings, Mutings, Users } from '@/models/index.js';
|
|
||||||
import { notificationTypes } from '@/types.js';
|
|
||||||
import read from '@/services/note/read.js';
|
|
||||||
import { Brackets } from 'typeorm';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['account', 'notifications'],
|
tags: ['account', 'notifications'],
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
|
|
||||||
|
limit: {
|
||||||
|
duration: 60000,
|
||||||
|
max: 10,
|
||||||
|
},
|
||||||
|
|
||||||
kind: 'read:notifications',
|
kind: 'read:notifications',
|
||||||
|
|
||||||
res: {
|
res: {
|
||||||
|
@ -67,7 +72,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
.where('users.isSuspended = TRUE');
|
.where('users.isSuspended = TRUE');
|
||||||
|
|
||||||
const query = makePaginationQuery(Notifications.createQueryBuilder('notification'), ps.sinceId, ps.untilId)
|
const query = makePaginationQuery(Notifications.createQueryBuilder('notification'), ps.sinceId, ps.untilId)
|
||||||
.andWhere(`notification.notifieeId = :meId`, { meId: user.id })
|
.andWhere('notification.notifieeId = :meId', { meId: user.id })
|
||||||
.leftJoinAndSelect('notification.notifier', 'notifier')
|
.leftJoinAndSelect('notification.notifier', 'notifier')
|
||||||
.leftJoinAndSelect('notification.note', 'note')
|
.leftJoinAndSelect('notification.note', 'note')
|
||||||
.leftJoinAndSelect('notifier.avatar', 'notifierAvatar')
|
.leftJoinAndSelect('notifier.avatar', 'notifierAvatar')
|
||||||
|
@ -103,13 +108,13 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps.includeTypes && ps.includeTypes.length > 0) {
|
if (ps.includeTypes && ps.includeTypes.length > 0) {
|
||||||
query.andWhere(`notification.type IN (:...includeTypes)`, { includeTypes: ps.includeTypes });
|
query.andWhere('notification.type IN (:...includeTypes)', { includeTypes: ps.includeTypes });
|
||||||
} else if (ps.excludeTypes && ps.excludeTypes.length > 0) {
|
} else if (ps.excludeTypes && ps.excludeTypes.length > 0) {
|
||||||
query.andWhere(`notification.type NOT IN (:...excludeTypes)`, { excludeTypes: ps.excludeTypes });
|
query.andWhere('notification.type NOT IN (:...excludeTypes)', { excludeTypes: ps.excludeTypes });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps.unreadOnly) {
|
if (ps.unreadOnly) {
|
||||||
query.andWhere(`notification.isRead = false`);
|
query.andWhere('notification.isRead = false');
|
||||||
}
|
}
|
||||||
|
|
||||||
const notifications = await query.take(ps.limit).getMany();
|
const notifications = await query.take(ps.limit).getMany();
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
|
import { IsNull, MoreThan } from 'typeorm';
|
||||||
import config from '@/config/index.js';
|
import config from '@/config/index.js';
|
||||||
import define from '../define.js';
|
|
||||||
import { fetchMeta } from '@/misc/fetch-meta.js';
|
import { fetchMeta } from '@/misc/fetch-meta.js';
|
||||||
import { Ads, Emojis, Users } from '@/models/index.js';
|
import { Ads, Emojis, Users } from '@/models/index.js';
|
||||||
import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits.js';
|
import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits.js';
|
||||||
import { IsNull, MoreThan } from 'typeorm';
|
|
||||||
import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
|
import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
|
||||||
|
import define from '../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['meta'],
|
tags: ['meta'],
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { Notes } from '@/models/index.js';
|
||||||
import define from '../define.js';
|
import define from '../define.js';
|
||||||
import { makePaginationQuery } from '../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../common/make-pagination-query.js';
|
||||||
import { Notes } from '@/models/index.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes'],
|
tags: ['notes'],
|
||||||
|
@ -34,8 +34,8 @@ export const paramDef = {
|
||||||
// eslint-disable-next-line import/no-default-export
|
// eslint-disable-next-line import/no-default-export
|
||||||
export default define(meta, paramDef, async (ps) => {
|
export default define(meta, paramDef, async (ps) => {
|
||||||
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
|
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
|
||||||
.andWhere(`note.visibility = 'public'`)
|
.andWhere('note.visibility = \'public\'')
|
||||||
.andWhere(`note.localOnly = FALSE`)
|
.andWhere('note.localOnly = FALSE')
|
||||||
.innerJoinAndSelect('note.user', 'user')
|
.innerJoinAndSelect('note.user', 'user')
|
||||||
.leftJoinAndSelect('user.avatar', 'avatar')
|
.leftJoinAndSelect('user.avatar', 'avatar')
|
||||||
.leftJoinAndSelect('user.banner', 'banner')
|
.leftJoinAndSelect('user.banner', 'banner')
|
||||||
|
@ -61,7 +61,7 @@ export default define(meta, paramDef, async (ps) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps.withFiles !== undefined) {
|
if (ps.withFiles !== undefined) {
|
||||||
query.andWhere(ps.withFiles ? `note.fileIds != '{}'` : `note.fileIds = '{}'`);
|
query.andWhere(ps.withFiles ? 'note.fileIds != \'{}\'' : 'note.fileIds = \'{}\'');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps.poll !== undefined) {
|
if (ps.poll !== undefined) {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
|
import { Brackets } from 'typeorm';
|
||||||
|
import { Notes } from '@/models/index.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
||||||
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
||||||
import { Brackets } from 'typeorm';
|
|
||||||
import { Notes } from '@/models/index.js';
|
|
||||||
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
||||||
import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
|
import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
|
||||||
|
|
||||||
|
@ -38,13 +38,13 @@ export const paramDef = {
|
||||||
export default define(meta, paramDef, async (ps, user) => {
|
export default define(meta, paramDef, async (ps, user) => {
|
||||||
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
|
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
|
||||||
.andWhere(new Brackets(qb => { qb
|
.andWhere(new Brackets(qb => { qb
|
||||||
.where(`note.replyId = :noteId`, { noteId: ps.noteId })
|
.where('note.replyId = :noteId', { noteId: ps.noteId })
|
||||||
.orWhere(new Brackets(qb => { qb
|
.orWhere(new Brackets(qb => { qb
|
||||||
.where(`note.renoteId = :noteId`, { noteId: ps.noteId })
|
.where('note.renoteId = :noteId', { noteId: ps.noteId })
|
||||||
.andWhere(new Brackets(qb => { qb
|
.andWhere(new Brackets(qb => { qb
|
||||||
.where(`note.text IS NOT NULL`)
|
.where('note.text IS NOT NULL')
|
||||||
.orWhere(`note.fileIds != '{}'`)
|
.orWhere('note.fileIds != \'{}\'')
|
||||||
.orWhere(`note.hasPoll = TRUE`);
|
.orWhere('note.hasPoll = TRUE');
|
||||||
}));
|
}));
|
||||||
}));
|
}));
|
||||||
}))
|
}))
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import define from '../../define.js';
|
import { In } from 'typeorm';
|
||||||
import { ClipNotes, Clips } from '@/models/index.js';
|
import { ClipNotes, Clips } from '@/models/index.js';
|
||||||
|
import define from '../../define.js';
|
||||||
import { getNote } from '../../common/getters.js';
|
import { getNote } from '../../common/getters.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
import { In } from 'typeorm';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['clips', 'notes'],
|
tags: ['clips', 'notes'],
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
import { Note } from '@/models/entities/note.js';
|
||||||
|
import { Notes } from '@/models/index.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
import { getNote } from '../../common/getters.js';
|
import { getNote } from '../../common/getters.js';
|
||||||
import { Note } from '@/models/entities/note.js';
|
|
||||||
import { Notes } from '@/models/index.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes'],
|
tags: ['notes'],
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import deleteNote from '@/services/note/delete.js';
|
|
||||||
import define from '../../define.js';
|
|
||||||
import ms from 'ms';
|
import ms from 'ms';
|
||||||
|
import deleteNote from '@/services/note/delete.js';
|
||||||
|
import { Users } from '@/models/index.js';
|
||||||
|
import define from '../../define.js';
|
||||||
import { getNote } from '../../common/getters.js';
|
import { getNote } from '../../common/getters.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
import { Users } from '@/models/index.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes'],
|
tags: ['notes'],
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
import { NoteFavorites } from '@/models/index.js';
|
||||||
|
import { genId } from '@/misc/gen-id.js';
|
||||||
import define from '../../../define.js';
|
import define from '../../../define.js';
|
||||||
import { ApiError } from '../../../error.js';
|
import { ApiError } from '../../../error.js';
|
||||||
import { getNote } from '../../../common/getters.js';
|
import { getNote } from '../../../common/getters.js';
|
||||||
import { NoteFavorites } from '@/models/index.js';
|
|
||||||
import { genId } from '@/misc/gen-id.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes', 'favorites'],
|
tags: ['notes', 'favorites'],
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
import { NoteFavorites } from '@/models/index.js';
|
||||||
import define from '../../../define.js';
|
import define from '../../../define.js';
|
||||||
import { ApiError } from '../../../error.js';
|
import { ApiError } from '../../../error.js';
|
||||||
import { getNote } from '../../../common/getters.js';
|
import { getNote } from '../../../common/getters.js';
|
||||||
import { NoteFavorites } from '@/models/index.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes', 'favorites'],
|
tags: ['notes', 'favorites'],
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { Notes } from '@/models/index.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
||||||
import { Notes } from '@/models/index.js';
|
|
||||||
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
@ -36,9 +36,9 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
const query = Notes.createQueryBuilder('note')
|
const query = Notes.createQueryBuilder('note')
|
||||||
.addSelect('note.score')
|
.addSelect('note.score')
|
||||||
.where('note.userHost IS NULL')
|
.where('note.userHost IS NULL')
|
||||||
.andWhere(`note.score > 0`)
|
.andWhere('note.score > 0')
|
||||||
.andWhere(`note.createdAt > :date`, { date: new Date(Date.now() - day) })
|
.andWhere('note.createdAt > :date', { date: new Date(Date.now() - day) })
|
||||||
.andWhere(`note.visibility = 'public'`)
|
.andWhere('note.visibility = \'public\'')
|
||||||
.innerJoinAndSelect('note.user', 'user')
|
.innerJoinAndSelect('note.user', 'user')
|
||||||
.leftJoinAndSelect('user.avatar', 'avatar')
|
.leftJoinAndSelect('user.avatar', 'avatar')
|
||||||
.leftJoinAndSelect('user.banner', 'banner')
|
.leftJoinAndSelect('user.banner', 'banner')
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import define from '../../define.js';
|
|
||||||
import { fetchMeta } from '@/misc/fetch-meta.js';
|
import { fetchMeta } from '@/misc/fetch-meta.js';
|
||||||
|
import { Notes, Users } from '@/models/index.js';
|
||||||
|
import { activeUsersChart } from '@/services/chart/index.js';
|
||||||
|
import define from '../../define.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
import { Notes, Users } from '@/models/index.js';
|
|
||||||
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
||||||
import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
|
import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
|
||||||
import { activeUsersChart } from '@/services/chart/index.js';
|
|
||||||
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
|
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
|
||||||
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
|
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
|
||||||
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
||||||
|
@ -60,7 +60,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
|
|
||||||
//#region Construct query
|
//#region Construct query
|
||||||
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
|
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
|
||||||
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
|
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
|
||||||
.andWhere('note.visibility = \'public\'')
|
.andWhere('note.visibility = \'public\'')
|
||||||
.andWhere('note.channelId IS NULL')
|
.andWhere('note.channelId IS NULL')
|
||||||
.innerJoinAndSelect('note.user', 'user')
|
.innerJoinAndSelect('note.user', 'user')
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
import define from '../../define.js';
|
import { Brackets } from 'typeorm';
|
||||||
import { fetchMeta } from '@/misc/fetch-meta.js';
|
import { fetchMeta } from '@/misc/fetch-meta.js';
|
||||||
|
import { Followings, Notes, Users } from '@/models/index.js';
|
||||||
|
import { activeUsersChart } from '@/services/chart/index.js';
|
||||||
|
import define from '../../define.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
import { Followings, Notes, Users } from '@/models/index.js';
|
|
||||||
import { Brackets } from 'typeorm';
|
|
||||||
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
||||||
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
||||||
import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
|
import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
|
||||||
import { activeUsersChart } from '@/services/chart/index.js';
|
|
||||||
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
|
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
|
||||||
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
|
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
|
||||||
import { generateChannelQuery } from '../../common/generate-channel-query.js';
|
import { generateChannelQuery } from '../../common/generate-channel-query.js';
|
||||||
|
@ -70,7 +70,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
.where('following.followerId = :followerId', { followerId: user.id });
|
.where('following.followerId = :followerId', { followerId: user.id });
|
||||||
|
|
||||||
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
|
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
|
||||||
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
|
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
|
||||||
.andWhere(new Brackets(qb => {
|
.andWhere(new Brackets(qb => {
|
||||||
qb.where(`((note.userId IN (${ followingQuery.getQuery() })) OR (note.userId = :meId))`, { meId: user.id })
|
qb.where(`((note.userId IN (${ followingQuery.getQuery() })) OR (note.userId = :meId))`, { meId: user.id })
|
||||||
.orWhere('(note.visibility = \'public\') AND (note.userHost IS NULL)');
|
.orWhere('(note.visibility = \'public\') AND (note.userHost IS NULL)');
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import define from '../../define.js';
|
import { Brackets } from 'typeorm';
|
||||||
import { fetchMeta } from '@/misc/fetch-meta.js';
|
import { fetchMeta } from '@/misc/fetch-meta.js';
|
||||||
import { ApiError } from '../../error.js';
|
|
||||||
import { Notes, Users } from '@/models/index.js';
|
import { Notes, Users } from '@/models/index.js';
|
||||||
|
import { activeUsersChart } from '@/services/chart/index.js';
|
||||||
|
import define from '../../define.js';
|
||||||
|
import { ApiError } from '../../error.js';
|
||||||
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
||||||
import { activeUsersChart } from '@/services/chart/index.js';
|
|
||||||
import { Brackets } from 'typeorm';
|
|
||||||
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
|
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
|
||||||
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
|
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
|
||||||
import { generateChannelQuery } from '../../common/generate-channel-query.js';
|
import { generateChannelQuery } from '../../common/generate-channel-query.js';
|
||||||
|
@ -66,7 +66,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
|
|
||||||
//#region Construct query
|
//#region Construct query
|
||||||
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
|
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
|
||||||
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
|
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
|
||||||
.andWhere('(note.visibility = \'public\') AND (note.userHost IS NULL)')
|
.andWhere('(note.visibility = \'public\') AND (note.userHost IS NULL)')
|
||||||
.innerJoinAndSelect('note.user', 'user')
|
.innerJoinAndSelect('note.user', 'user')
|
||||||
.leftJoinAndSelect('user.avatar', 'avatar')
|
.leftJoinAndSelect('user.avatar', 'avatar')
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import define from '../../define.js';
|
import { Brackets } from 'typeorm';
|
||||||
import read from '@/services/note/read.js';
|
import read from '@/services/note/read.js';
|
||||||
import { Notes, Followings } from '@/models/index.js';
|
import { Notes, Followings } from '@/models/index.js';
|
||||||
|
import define from '../../define.js';
|
||||||
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
||||||
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
import { Brackets } from 'typeorm';
|
|
||||||
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
||||||
import { generateMutedNoteThreadQuery } from '../../common/generate-muted-note-thread-query.js';
|
import { generateMutedNoteThreadQuery } from '../../common/generate-muted-note-thread-query.js';
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import define from '../../../define.js';
|
|
||||||
import { Polls, Mutings, Notes, PollVotes } from '@/models/index.js';
|
|
||||||
import { Brackets, In } from 'typeorm';
|
import { Brackets, In } from 'typeorm';
|
||||||
|
import { Polls, Mutings, Notes, PollVotes } from '@/models/index.js';
|
||||||
|
import define from '../../../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes'],
|
tags: ['notes'],
|
||||||
|
@ -31,8 +31,8 @@ export const paramDef = {
|
||||||
export default define(meta, paramDef, async (ps, user) => {
|
export default define(meta, paramDef, async (ps, user) => {
|
||||||
const query = Polls.createQueryBuilder('poll')
|
const query = Polls.createQueryBuilder('poll')
|
||||||
.where('poll.userHost IS NULL')
|
.where('poll.userHost IS NULL')
|
||||||
.andWhere(`poll.userId != :meId`, { meId: user.id })
|
.andWhere('poll.userId != :meId', { meId: user.id })
|
||||||
.andWhere(`poll.noteVisibility = 'public'`)
|
.andWhere('poll.noteVisibility = \'public\'')
|
||||||
.andWhere(new Brackets(qb => { qb
|
.andWhere(new Brackets(qb => { qb
|
||||||
.where('poll.expiresAt IS NULL')
|
.where('poll.expiresAt IS NULL')
|
||||||
.orWhere('poll.expiresAt > :now', { now: new Date() });
|
.orWhere('poll.expiresAt > :now', { now: new Date() });
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
|
import { Not } from 'typeorm';
|
||||||
import { publishNoteStream } from '@/services/stream.js';
|
import { publishNoteStream } from '@/services/stream.js';
|
||||||
import { createNotification } from '@/services/create-notification.js';
|
import { createNotification } from '@/services/create-notification.js';
|
||||||
import define from '../../../define.js';
|
|
||||||
import { ApiError } from '../../../error.js';
|
|
||||||
import { getNote } from '../../../common/getters.js';
|
|
||||||
import { deliver } from '@/queue/index.js';
|
import { deliver } from '@/queue/index.js';
|
||||||
import { renderActivity } from '@/remote/activitypub/renderer/index.js';
|
import { renderActivity } from '@/remote/activitypub/renderer/index.js';
|
||||||
import renderVote from '@/remote/activitypub/renderer/vote.js';
|
import renderVote from '@/remote/activitypub/renderer/vote.js';
|
||||||
import { deliverQuestionUpdate } from '@/services/note/polls/update.js';
|
import { deliverQuestionUpdate } from '@/services/note/polls/update.js';
|
||||||
import { PollVotes, NoteWatchings, Users, Polls, Blockings } from '@/models/index.js';
|
import { PollVotes, NoteWatchings, Users, Polls, Blockings } from '@/models/index.js';
|
||||||
import { Not } from 'typeorm';
|
|
||||||
import { IRemoteUser } from '@/models/entities/user.js';
|
import { IRemoteUser } from '@/models/entities/user.js';
|
||||||
import { genId } from '@/misc/gen-id.js';
|
import { genId } from '@/misc/gen-id.js';
|
||||||
|
import { getNote } from '../../../common/getters.js';
|
||||||
|
import { ApiError } from '../../../error.js';
|
||||||
|
import define from '../../../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes'],
|
tags: ['notes'],
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import define from '../../../define.js';
|
|
||||||
import ms from 'ms';
|
import ms from 'ms';
|
||||||
import deleteReaction from '@/services/note/reaction/delete.js';
|
import deleteReaction from '@/services/note/reaction/delete.js';
|
||||||
|
import define from '../../../define.js';
|
||||||
import { getNote } from '../../../common/getters.js';
|
import { getNote } from '../../../common/getters.js';
|
||||||
import { ApiError } from '../../../error.js';
|
import { ApiError } from '../../../error.js';
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
|
import { Notes } from '@/models/index.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
import { getNote } from '../../common/getters.js';
|
import { getNote } from '../../common/getters.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
||||||
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
import { Notes } from '@/models/index.js';
|
|
||||||
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
@ -50,7 +50,7 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
|
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
|
||||||
.andWhere(`note.renoteId = :renoteId`, { renoteId: note.id })
|
.andWhere('note.renoteId = :renoteId', { renoteId: note.id })
|
||||||
.innerJoinAndSelect('note.user', 'user')
|
.innerJoinAndSelect('note.user', 'user')
|
||||||
.leftJoinAndSelect('user.avatar', 'avatar')
|
.leftJoinAndSelect('user.avatar', 'avatar')
|
||||||
.leftJoinAndSelect('user.banner', 'banner')
|
.leftJoinAndSelect('user.banner', 'banner')
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import define from '../../define.js';
|
|
||||||
import { Notes } from '@/models/index.js';
|
import { Notes } from '@/models/index.js';
|
||||||
|
import define from '../../define.js';
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
||||||
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import define from '../../define.js';
|
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
|
||||||
import { Notes } from '@/models/index.js';
|
|
||||||
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
|
||||||
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
|
||||||
import { Brackets } from 'typeorm';
|
import { Brackets } from 'typeorm';
|
||||||
|
import { Notes } from '@/models/index.js';
|
||||||
import { safeForSql } from '@/misc/safe-for-sql.js';
|
import { safeForSql } from '@/misc/safe-for-sql.js';
|
||||||
import { normalizeForSearch } from '@/misc/normalize-for-search.js';
|
import { normalizeForSearch } from '@/misc/normalize-for-search.js';
|
||||||
|
import define from '../../define.js';
|
||||||
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
||||||
|
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
||||||
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
import { In } from 'typeorm';
|
||||||
|
import { Notes } from '@/models/index.js';
|
||||||
|
import config from '@/config/index.js';
|
||||||
import es from '../../../../db/elasticsearch.js';
|
import es from '../../../../db/elasticsearch.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
import { Notes } from '@/models/index.js';
|
|
||||||
import { In } from 'typeorm';
|
|
||||||
import config from '@/config/index.js';
|
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
||||||
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
||||||
|
@ -99,7 +99,7 @@ export default define(meta, paramDef, async (ps, me) => {
|
||||||
userHost: ps.host,
|
userHost: ps.host,
|
||||||
},
|
},
|
||||||
}] : []
|
}] : []
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
const result = await es.search({
|
const result = await es.search({
|
||||||
index: config.elasticsearch.index || 'misskey_note',
|
index: config.elasticsearch.index || 'misskey_note',
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
import { Notes } from '@/models/index.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
import { getNote } from '../../common/getters.js';
|
import { getNote } from '../../common/getters.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
import { Notes } from '@/models/index.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes'],
|
tags: ['notes'],
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import define from '../../define.js';
|
|
||||||
import { NoteFavorites, Notes, NoteThreadMutings, NoteWatchings } from '@/models/index.js';
|
import { NoteFavorites, Notes, NoteThreadMutings, NoteWatchings } from '@/models/index.js';
|
||||||
|
import define from '../../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes'],
|
tags: ['notes'],
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import define from '../../../define.js';
|
|
||||||
import { getNote } from '../../../common/getters.js';
|
|
||||||
import { ApiError } from '../../../error.js';
|
|
||||||
import { Notes, NoteThreadMutings } from '@/models/index.js';
|
import { Notes, NoteThreadMutings } from '@/models/index.js';
|
||||||
import { genId } from '@/misc/gen-id.js';
|
import { genId } from '@/misc/gen-id.js';
|
||||||
import readNote from '@/services/note/read.js';
|
import readNote from '@/services/note/read.js';
|
||||||
|
import define from '../../../define.js';
|
||||||
|
import { getNote } from '../../../common/getters.js';
|
||||||
|
import { ApiError } from '../../../error.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes'],
|
tags: ['notes'],
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
import { NoteThreadMutings } from '@/models/index.js';
|
||||||
import define from '../../../define.js';
|
import define from '../../../define.js';
|
||||||
import { getNote } from '../../../common/getters.js';
|
import { getNote } from '../../../common/getters.js';
|
||||||
import { ApiError } from '../../../error.js';
|
import { ApiError } from '../../../error.js';
|
||||||
import { NoteThreadMutings } from '@/models/index.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes'],
|
tags: ['notes'],
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
|
import { Brackets } from 'typeorm';
|
||||||
|
import { Notes, Followings } from '@/models/index.js';
|
||||||
|
import { activeUsersChart } from '@/services/chart/index.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
import { Notes, Followings } from '@/models/index.js';
|
|
||||||
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
||||||
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
||||||
import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
|
import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
|
||||||
import { activeUsersChart } from '@/services/chart/index.js';
|
|
||||||
import { Brackets } from 'typeorm';
|
|
||||||
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
|
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
|
||||||
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
|
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
|
||||||
import { generateChannelQuery } from '../../common/generate-channel-query.js';
|
import { generateChannelQuery } from '../../common/generate-channel-query.js';
|
||||||
|
@ -62,10 +62,10 @@ export default define(meta, paramDef, async (ps, user) => {
|
||||||
.where('following.followerId = :followerId', { followerId: user.id });
|
.where('following.followerId = :followerId', { followerId: user.id });
|
||||||
|
|
||||||
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
|
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
|
||||||
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
|
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
|
||||||
.andWhere(new Brackets(qb => { qb
|
.andWhere(new Brackets(qb => { qb
|
||||||
.where('note.userId = :meId', { meId: user.id });
|
.where('note.userId = :meId', { meId: user.id });
|
||||||
if (hasFollowing) qb.orWhere(`note.userId IN (${ followingQuery.getQuery() })`);
|
if (hasFollowing) qb.orWhere(`note.userId IN (${ followingQuery.getQuery() })`);
|
||||||
}))
|
}))
|
||||||
.innerJoinAndSelect('note.user', 'user')
|
.innerJoinAndSelect('note.user', 'user')
|
||||||
.leftJoinAndSelect('user.avatar', 'avatar')
|
.leftJoinAndSelect('user.avatar', 'avatar')
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import deleteNote from '@/services/note/delete.js';
|
|
||||||
import define from '../../define.js';
|
|
||||||
import ms from 'ms';
|
import ms from 'ms';
|
||||||
|
import deleteNote from '@/services/note/delete.js';
|
||||||
|
import { Notes, Users } from '@/models/index.js';
|
||||||
|
import define from '../../define.js';
|
||||||
import { getNote } from '../../common/getters.js';
|
import { getNote } from '../../common/getters.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
import { Notes, Users } from '@/models/index.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes'],
|
tags: ['notes'],
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
|
import { Brackets } from 'typeorm';
|
||||||
|
import { UserLists, UserListJoinings, Notes } from '@/models/index.js';
|
||||||
|
import { activeUsersChart } from '@/services/chart/index.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
import { UserLists, UserListJoinings, Notes } from '@/models/index.js';
|
|
||||||
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
||||||
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
||||||
import { activeUsersChart } from '@/services/chart/index.js';
|
|
||||||
import { Brackets } from 'typeorm';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notes', 'lists'],
|
tags: ['notes', 'lists'],
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import define from '../../../define.js';
|
|
||||||
import watch from '@/services/note/watch.js';
|
import watch from '@/services/note/watch.js';
|
||||||
|
import define from '../../../define.js';
|
||||||
import { getNote } from '../../../common/getters.js';
|
import { getNote } from '../../../common/getters.js';
|
||||||
import { ApiError } from '../../../error.js';
|
import { ApiError } from '../../../error.js';
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import define from '../../../define.js';
|
|
||||||
import unwatch from '@/services/note/unwatch.js';
|
import unwatch from '@/services/note/unwatch.js';
|
||||||
|
import define from '../../../define.js';
|
||||||
import { getNote } from '../../../common/getters.js';
|
import { getNote } from '../../../common/getters.js';
|
||||||
import { ApiError } from '../../../error.js';
|
import { ApiError } from '../../../error.js';
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import define from '../../define.js';
|
|
||||||
import { createNotification } from '@/services/create-notification.js';
|
import { createNotification } from '@/services/create-notification.js';
|
||||||
|
import define from '../../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notifications'],
|
tags: ['notifications'],
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { publishMainStream } from '@/services/stream.js';
|
import { publishMainStream } from '@/services/stream.js';
|
||||||
import { pushNotification } from '@/services/push-notification.js';
|
import { pushNotification } from '@/services/push-notification.js';
|
||||||
import define from '../../define.js';
|
|
||||||
import { Notifications } from '@/models/index.js';
|
import { Notifications } from '@/models/index.js';
|
||||||
|
import define from '../../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['notifications', 'account'],
|
tags: ['notifications', 'account'],
|
||||||
|
|
|
@ -2,17 +2,14 @@ import define from '../../define.js';
|
||||||
import { readNotification } from '../../common/read-notification.js';
|
import { readNotification } from '../../common/read-notification.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
desc: {
|
|
||||||
'ja-JP': '通知を既読にします。',
|
|
||||||
'en-US': 'Mark a notification as read.'
|
|
||||||
},
|
|
||||||
|
|
||||||
tags: ['notifications', 'account'],
|
tags: ['notifications', 'account'],
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
|
|
||||||
kind: 'write:notifications',
|
kind: 'write:notifications',
|
||||||
|
|
||||||
|
description: 'Mark a notification as read.',
|
||||||
|
|
||||||
errors: {
|
errors: {
|
||||||
noSuchNotification: {
|
noSuchNotification: {
|
||||||
message: 'No such notification.',
|
message: 'No such notification.',
|
||||||
|
@ -34,7 +31,11 @@ export const paramDef = {
|
||||||
{
|
{
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
notificationIds: { type: 'array', items: { type: 'string', format: 'misskey:id' } },
|
notificationIds: {
|
||||||
|
type: 'array',
|
||||||
|
items: { type: 'string', format: 'misskey:id' },
|
||||||
|
maxItems: 100,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
required: ['notificationIds'],
|
required: ['notificationIds'],
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import define from '../define.js';
|
|
||||||
import { publishMainStream } from '@/services/stream.js';
|
import { publishMainStream } from '@/services/stream.js';
|
||||||
import { Users, Pages } from '@/models/index.js';
|
import { Users, Pages } from '@/models/index.js';
|
||||||
|
import define from '../define.js';
|
||||||
import { ApiError } from '../error.js';
|
import { ApiError } from '../error.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import ms from 'ms';
|
import ms from 'ms';
|
||||||
import define from '../../define.js';
|
|
||||||
import { Pages, DriveFiles } from '@/models/index.js';
|
import { Pages, DriveFiles } from '@/models/index.js';
|
||||||
import { genId } from '@/misc/gen-id.js';
|
import { genId } from '@/misc/gen-id.js';
|
||||||
import { Page } from '@/models/entities/page.js';
|
import { Page } from '@/models/entities/page.js';
|
||||||
|
import define from '../../define.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
@ -51,7 +51,7 @@ export const paramDef = {
|
||||||
} },
|
} },
|
||||||
script: { type: 'string' },
|
script: { type: 'string' },
|
||||||
eyeCatchingImageId: { type: 'string', format: 'misskey:id', nullable: true },
|
eyeCatchingImageId: { type: 'string', format: 'misskey:id', nullable: true },
|
||||||
font: { type: 'string', enum: ['serif', 'sans-serif'], default: "sans-serif" },
|
font: { type: 'string', enum: ['serif', 'sans-serif'], default: 'sans-serif' },
|
||||||
alignCenter: { type: 'boolean', default: false },
|
alignCenter: { type: 'boolean', default: false },
|
||||||
hideTitleWhenPinned: { type: 'boolean', default: false },
|
hideTitleWhenPinned: { type: 'boolean', default: false },
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { Pages } from '@/models/index.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
import { Pages } from '@/models/index.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['pages'],
|
tags: ['pages'],
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import define from '../../define.js';
|
|
||||||
import { Pages } from '@/models/index.js';
|
import { Pages } from '@/models/index.js';
|
||||||
|
import define from '../../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['pages'],
|
tags: ['pages'],
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import define from '../../define.js';
|
|
||||||
import { ApiError } from '../../error.js';
|
|
||||||
import { Pages, PageLikes } from '@/models/index.js';
|
import { Pages, PageLikes } from '@/models/index.js';
|
||||||
import { genId } from '@/misc/gen-id.js';
|
import { genId } from '@/misc/gen-id.js';
|
||||||
|
import define from '../../define.js';
|
||||||
|
import { ApiError } from '../../error.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['pages'],
|
tags: ['pages'],
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { Pages, PageLikes } from '@/models/index.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
import { Pages, PageLikes } from '@/models/index.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['pages'],
|
tags: ['pages'],
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue