Merge branch 'develop' into block-deliver-by-software
This commit is contained in:
commit
7c071c6c53
|
@ -165,6 +165,11 @@ id: 'aidx'
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||||
|
|
||||||
#sentryForFrontend:
|
#sentryForFrontend:
|
||||||
|
# vueIntegration:
|
||||||
|
# tracingOptions:
|
||||||
|
# trackComponents: true
|
||||||
|
# browserTracingIntegration:
|
||||||
|
# replayIntegration:
|
||||||
# options:
|
# options:
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||||
|
|
||||||
|
|
|
@ -177,6 +177,11 @@ id: 'aidx'
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||||
|
|
||||||
#sentryForFrontend:
|
#sentryForFrontend:
|
||||||
|
# vueIntegration:
|
||||||
|
# tracingOptions:
|
||||||
|
# trackComponents: true
|
||||||
|
# browserTracingIntegration:
|
||||||
|
# replayIntegration:
|
||||||
# options:
|
# options:
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||||
|
|
||||||
|
|
|
@ -259,6 +259,11 @@ id: 'aidx'
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||||
|
|
||||||
#sentryForFrontend:
|
#sentryForFrontend:
|
||||||
|
# vueIntegration:
|
||||||
|
# tracingOptions:
|
||||||
|
# trackComponents: true
|
||||||
|
# browserTracingIntegration:
|
||||||
|
# replayIntegration:
|
||||||
# options:
|
# options:
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||||
|
|
||||||
|
|
|
@ -152,6 +152,11 @@ id: 'aidx'
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||||
|
|
||||||
#sentryForFrontend:
|
#sentryForFrontend:
|
||||||
|
# vueIntegration:
|
||||||
|
# tracingOptions:
|
||||||
|
# trackComponents: true
|
||||||
|
# browserTracingIntegration:
|
||||||
|
# replayIntegration:
|
||||||
# options:
|
# options:
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||||
|
|
||||||
|
|
|
@ -11,14 +11,15 @@ on:
|
||||||
# Storybook CI is checked on the "push" event of "develop" branch so it would cause a duplicate build.
|
# Storybook CI is checked on the "push" event of "develop" branch so it would cause a duplicate build.
|
||||||
# This is a waste of chromatic build quota, so we don't run storybook CI on pull requests targets master.
|
# This is a waste of chromatic build quota, so we don't run storybook CI on pull requests targets master.
|
||||||
- master
|
- master
|
||||||
# Neither Dependabot nor Renovate will change the actual behavior for components.
|
|
||||||
- dependabot/**
|
|
||||||
- renovate/**
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
# chromatic is not likely to be available for fork repositories, so we disable for fork repositories.
|
# Chromatic is not likely to be available for fork repositories, so we disable for fork repositories.
|
||||||
if: github.repository == 'misskey-dev/misskey'
|
# Neither Dependabot nor Renovate will change the actual behavior for components.
|
||||||
|
if: >-
|
||||||
|
github.repository == 'misskey-dev/misskey' &&
|
||||||
|
startsWith(github.ref, 'refs/heads/dependabot/') != true &&
|
||||||
|
startsWith(github.ref, 'refs/heads/renovate/') != true
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
|
10
CHANGELOG.md
10
CHANGELOG.md
|
@ -11,10 +11,16 @@
|
||||||
- 過去自分が送ったメッセージ・自分に送られたメッセージの検索が可能です
|
- 過去自分が送ったメッセージ・自分に送られたメッセージの検索が可能です
|
||||||
- 参加中のルームをミュートして通知が来ないように設定可能です
|
- 参加中のルームをミュートして通知が来ないように設定可能です
|
||||||
- メッセージにはリアクションも可能です
|
- メッセージにはリアクションも可能です
|
||||||
|
- Feat: アカウントのマイグレーション時に古いアカウントからロールをコピーできるようになりました。
|
||||||
|
- 管理者がロールの設定でマイグレーション時にコピーするかを指定できるようになります。
|
||||||
- Enhance: セキュリティを強化するため、ジョブキューのダッシュボード(bull-board)統合が削除されました。
|
- Enhance: セキュリティを強化するため、ジョブキューのダッシュボード(bull-board)統合が削除されました。
|
||||||
- Misskeyネイティブでダッシュボードを実装予定です
|
- Misskeyネイティブでダッシュボードを実装予定です
|
||||||
|
- Enhance: フロントエンドのエラートラッキングができるように
|
||||||
|
- `.config/default.yml`中の項目`sentryForFrontend`を適宜設定してください。
|
||||||
|
- 外部サービスであるSentryへエラー情報が送信されます。ご利用の地域の法令に従い、適切なプライバシーポリシーを策定の上で運用してください。
|
||||||
- Enhance: ミュートしているユーザーをユーザー検索の結果から除外するように
|
- Enhance: ミュートしているユーザーをユーザー検索の結果から除外するように
|
||||||
- Enhance: 連合先のソフトウェア及びバージョン名により配信停止を行えるようになりました
|
- Enhance: アンテナでセンシティブなチャンネルのノートを除外できるように `#14177`
|
||||||
|
- Enhance: 連合先のソフトウェア及びバージョン名により配信停止を行えるように `#15727`
|
||||||
- Fix: 通知のページネーションで2つ以上読み込めなくなることがある問題を修正
|
- Fix: 通知のページネーションで2つ以上読み込めなくなることがある問題を修正
|
||||||
|
|
||||||
### Client
|
### Client
|
||||||
|
@ -36,6 +42,7 @@
|
||||||
- 再度ログインすればサーバーのバックアップから設定データを復元可能です
|
- 再度ログインすればサーバーのバックアップから設定データを復元可能です
|
||||||
- エクスポートした設定データを他のサーバーでインポートして適用すること(設定の持ち運び)が可能になりました
|
- エクスポートした設定データを他のサーバーでインポートして適用すること(設定の持ち運び)が可能になりました
|
||||||
- 設定情報の移行は自動で行われますが、何らかの理由で失敗した場合、設定→その他→旧設定情報を移行 で再試行可能です
|
- 設定情報の移行は自動で行われますが、何らかの理由で失敗した場合、設定→その他→旧設定情報を移行 で再試行可能です
|
||||||
|
- 過去に作成されたバックアップデータとは現在互換性がありませんのでご注意ください
|
||||||
- Feat: 画面を重ねて表示するオプションを実装(実験的)
|
- Feat: 画面を重ねて表示するオプションを実装(実験的)
|
||||||
- 設定 → その他 → 実験的機能 → Enable stacking router view
|
- 設定 → その他 → 実験的機能 → Enable stacking router view
|
||||||
- Enhance: プラグインの管理が強化されました
|
- Enhance: プラグインの管理が強化されました
|
||||||
|
@ -66,6 +73,7 @@
|
||||||
- Fix: ActivityPubリクエストURLチェック実装は仕様に従っていないのを修正
|
- Fix: ActivityPubリクエストURLチェック実装は仕様に従っていないのを修正
|
||||||
- Fix: 連合無しモードでも外部から照会可能だった問題を修正
|
- Fix: 連合無しモードでも外部から照会可能だった問題を修正
|
||||||
- Fix: テスト用WebHookのペイロードの`emojis`パラメータが実際のものと異なる問題を修正
|
- Fix: テスト用WebHookのペイロードの`emojis`パラメータが実際のものと異なる問題を修正
|
||||||
|
- Fix: 非ログインでタイムラインのストリームに接続した際、表示にログイン必須のノートが流れる場合がある問題を修正
|
||||||
|
|
||||||
## 2025.3.1
|
## 2025.3.1
|
||||||
|
|
||||||
|
|
|
@ -173,6 +173,11 @@ id: "aidx"
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||||
|
|
||||||
#sentryForFrontend:
|
#sentryForFrontend:
|
||||||
|
# vueIntegration:
|
||||||
|
# tracingOptions:
|
||||||
|
# trackComponents: true
|
||||||
|
# browserTracingIntegration:
|
||||||
|
# replayIntegration:
|
||||||
# options:
|
# options:
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||||
|
|
||||||
|
|
|
@ -1240,7 +1240,6 @@ _theme:
|
||||||
shadow: "الظل"
|
shadow: "الظل"
|
||||||
navBg: "خلفية الشريط الجانبي"
|
navBg: "خلفية الشريط الجانبي"
|
||||||
navFg: "نص الشريط الجانبي"
|
navFg: "نص الشريط الجانبي"
|
||||||
navHoverFg: "نص الشريط الجانبي (عند التمرير فوقه)"
|
|
||||||
link: "رابط"
|
link: "رابط"
|
||||||
hashtag: "وسم"
|
hashtag: "وسم"
|
||||||
mention: "أشر الى"
|
mention: "أشر الى"
|
||||||
|
|
|
@ -998,7 +998,6 @@ _theme:
|
||||||
header: "হেডার"
|
header: "হেডার"
|
||||||
navBg: "সাইডবারের পটভূমি"
|
navBg: "সাইডবারের পটভূমি"
|
||||||
navFg: "সাইডবারের পাঠ্য"
|
navFg: "সাইডবারের পাঠ্য"
|
||||||
navHoverFg: "সাইডবারের পাঠ্য (হভার)"
|
|
||||||
navActive: "সাইডবারের পাঠ্য (অ্যাকটিভ)"
|
navActive: "সাইডবারের পাঠ্য (অ্যাকটিভ)"
|
||||||
navIndicator: "সাইডবারের ইনডিকেটর"
|
navIndicator: "সাইডবারের ইনডিকেটর"
|
||||||
link: "লিংক"
|
link: "লিংক"
|
||||||
|
@ -1021,11 +1020,8 @@ _theme:
|
||||||
buttonHoverBg: "বাটনের পটভূমি (হভার)"
|
buttonHoverBg: "বাটনের পটভূমি (হভার)"
|
||||||
inputBorder: "ইনপুট ফিল্ডের বর্ডার"
|
inputBorder: "ইনপুট ফিল্ডের বর্ডার"
|
||||||
driveFolderBg: "ড্রাইভ ফোল্ডারের পটভূমি"
|
driveFolderBg: "ড্রাইভ ফোল্ডারের পটভূমি"
|
||||||
wallpaperOverlay: "ওয়ালপেপার ওভারলে"
|
|
||||||
badge: "ব্যাজ"
|
badge: "ব্যাজ"
|
||||||
messageBg: "চ্যাটের পটভূমি"
|
messageBg: "চ্যাটের পটভূমি"
|
||||||
accentDarken: "অ্যাকসেন্ট (গাঢ়)"
|
|
||||||
accentLighten: "অ্যাকসেন্ট (হাল্কা)"
|
|
||||||
fgHighlighted: "হাইলাইট করা পাঠ্য"
|
fgHighlighted: "হাইলাইট করা পাঠ্য"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "নোটগুলি"
|
note: "নোটগুলি"
|
||||||
|
|
|
@ -424,6 +424,7 @@ antennaExcludeBots: "Exclou els bots"
|
||||||
antennaKeywordsDescription: "Separar amb espais per la condició AND o amb salts de línia per la condició OR."
|
antennaKeywordsDescription: "Separar amb espais per la condició AND o amb salts de línia per la condició OR."
|
||||||
notifyAntenna: "Notifica'm les publicacions noves"
|
notifyAntenna: "Notifica'm les publicacions noves"
|
||||||
withFileAntenna: "Només les publicacions amb fitxers"
|
withFileAntenna: "Només les publicacions amb fitxers"
|
||||||
|
hideNotesInSensitiveChannel: "Amaga les notes a canals sensibles "
|
||||||
enableServiceworker: "Activar les notificacions al navegador"
|
enableServiceworker: "Activar les notificacions al navegador"
|
||||||
antennaUsersDescription: "Llistar un nom d'usuari per línia"
|
antennaUsersDescription: "Llistar un nom d'usuari per línia"
|
||||||
caseSensitive: "Sensible a majúscules i minúscules "
|
caseSensitive: "Sensible a majúscules i minúscules "
|
||||||
|
@ -1339,6 +1340,8 @@ compress: "Comprimir "
|
||||||
right: "Dreta"
|
right: "Dreta"
|
||||||
bottom: "A baix "
|
bottom: "A baix "
|
||||||
top: "A dalt "
|
top: "A dalt "
|
||||||
|
embed: "Incrustar"
|
||||||
|
settingsMigrating: "Estem fent la migració de la teva configuració. Si us plau espera un moment... (També pots fer la migració més tard i manualment anant a Preferències → Altres configuracions → Migrar configuració antiga)"
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "Encara no tens missatges "
|
noMessagesYet: "Encara no tens missatges "
|
||||||
newMessage: "Missatge nou"
|
newMessage: "Missatge nou"
|
||||||
|
@ -1413,6 +1416,7 @@ _settings:
|
||||||
showNavbarSubButtons: "Mostrar sub botons a la barra de navegació "
|
showNavbarSubButtons: "Mostrar sub botons a la barra de navegació "
|
||||||
ifOn: "Quan s'encén "
|
ifOn: "Quan s'encén "
|
||||||
ifOff: "Quan s'apaga "
|
ifOff: "Quan s'apaga "
|
||||||
|
enableSyncThemesBetweenDevices: "Sincronitzar els temes instal·lats entre dispositius"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "Mostrar el nom del remitent"
|
showSenderName: "Mostrar el nom del remitent"
|
||||||
sendOnEnter: "Introdueix per enviar"
|
sendOnEnter: "Introdueix per enviar"
|
||||||
|
@ -1885,6 +1889,8 @@ _role:
|
||||||
descriptionOfIsExplorable: "La línia de temps d'aquest rol i la llista d'usuaris seran públics si s'activa."
|
descriptionOfIsExplorable: "La línia de temps d'aquest rol i la llista d'usuaris seran públics si s'activa."
|
||||||
displayOrder: "Posició "
|
displayOrder: "Posició "
|
||||||
descriptionOfDisplayOrder: "Com més gran és el número, més dalt la seva posició a la interfície."
|
descriptionOfDisplayOrder: "Com més gran és el número, més dalt la seva posició a la interfície."
|
||||||
|
preserveAssignmentOnMoveAccount: "L'estat de l'assignació també es trasllada amb el compte migrat"
|
||||||
|
preserveAssignmentOnMoveAccount_description: "Si s'activa quan es migra un compte amb aquest rol, el compte migrat també heretarà aquest rol."
|
||||||
canEditMembersByModerator: "Permetre que els moderadors editin la llista d'usuaris en aquest rol"
|
canEditMembersByModerator: "Permetre que els moderadors editin la llista d'usuaris en aquest rol"
|
||||||
descriptionOfCanEditMembersByModerator: "Quan s'activa, els moderadors, així com els administradors, podran afegir i treure usuaris d'aquest rol. Si es troba desactivat, només els administradors poden assignar usuaris."
|
descriptionOfCanEditMembersByModerator: "Quan s'activa, els moderadors, així com els administradors, podran afegir i treure usuaris d'aquest rol. Si es troba desactivat, només els administradors poden assignar usuaris."
|
||||||
priority: "Prioritat"
|
priority: "Prioritat"
|
||||||
|
@ -2122,7 +2128,6 @@ _theme:
|
||||||
header: "Capçalera"
|
header: "Capçalera"
|
||||||
navBg: "Fons de la barra lateral"
|
navBg: "Fons de la barra lateral"
|
||||||
navFg: "Text de la barra lateral"
|
navFg: "Text de la barra lateral"
|
||||||
navHoverFg: "Text barra lateral (en passar per sobre)"
|
|
||||||
navActive: "Text barra lateral (actiu)"
|
navActive: "Text barra lateral (actiu)"
|
||||||
navIndicator: "Indicador barra lateral"
|
navIndicator: "Indicador barra lateral"
|
||||||
link: "Enllaç"
|
link: "Enllaç"
|
||||||
|
@ -2145,11 +2150,8 @@ _theme:
|
||||||
buttonHoverBg: "Fons botó (en passar-hi per sobre)"
|
buttonHoverBg: "Fons botó (en passar-hi per sobre)"
|
||||||
inputBorder: "Contorn del cap d'introducció "
|
inputBorder: "Contorn del cap d'introducció "
|
||||||
driveFolderBg: "Fons de la carpeta Disc"
|
driveFolderBg: "Fons de la carpeta Disc"
|
||||||
wallpaperOverlay: "Superposició del fons de pantalla "
|
|
||||||
badge: "Insígnia "
|
badge: "Insígnia "
|
||||||
messageBg: "Fons del xat"
|
messageBg: "Fons del xat"
|
||||||
accentDarken: "Accent (fosc)"
|
|
||||||
accentLighten: "Accent (clar)"
|
|
||||||
fgHighlighted: "Text ressaltat"
|
fgHighlighted: "Text ressaltat"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Notes"
|
note: "Notes"
|
||||||
|
|
|
@ -1626,7 +1626,6 @@ _theme:
|
||||||
header: "Nadpis"
|
header: "Nadpis"
|
||||||
navBg: "Pozadí postranního panelu"
|
navBg: "Pozadí postranního panelu"
|
||||||
navFg: "Text na postranním panelu"
|
navFg: "Text na postranním panelu"
|
||||||
navHoverFg: "Text na postranním panelu (Hover)"
|
|
||||||
navActive: "Text na postranním panelu (Aktivní)"
|
navActive: "Text na postranním panelu (Aktivní)"
|
||||||
navIndicator: "Indikátor na postranním panelu"
|
navIndicator: "Indikátor na postranním panelu"
|
||||||
link: "Odkaz"
|
link: "Odkaz"
|
||||||
|
@ -1649,11 +1648,8 @@ _theme:
|
||||||
buttonHoverBg: "Pozadí tlačítka (Hover)"
|
buttonHoverBg: "Pozadí tlačítka (Hover)"
|
||||||
inputBorder: "Ohraničení vstupního pole"
|
inputBorder: "Ohraničení vstupního pole"
|
||||||
driveFolderBg: "Pozadí složky disku"
|
driveFolderBg: "Pozadí složky disku"
|
||||||
wallpaperOverlay: "Překrytí tapety"
|
|
||||||
badge: "Odznak"
|
badge: "Odznak"
|
||||||
messageBg: "Pozadí chatu"
|
messageBg: "Pozadí chatu"
|
||||||
accentDarken: "Akcent (Ztmavený)"
|
|
||||||
accentLighten: "Akcent (Zesvětlený)"
|
|
||||||
fgHighlighted: "Zvýrazněný text"
|
fgHighlighted: "Zvýrazněný text"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Poznámky"
|
note: "Poznámky"
|
||||||
|
|
|
@ -424,6 +424,7 @@ antennaExcludeBots: "Bot-Accounts ausschließen"
|
||||||
antennaKeywordsDescription: "Zum Nutzen einer \"UND\"-Verknüpfung Einträge mit Leerzeichen trennen, zum Nutzen einer \"ODER\"-Verknüpfung Einträge mit einem Zeilenumbruch trennen"
|
antennaKeywordsDescription: "Zum Nutzen einer \"UND\"-Verknüpfung Einträge mit Leerzeichen trennen, zum Nutzen einer \"ODER\"-Verknüpfung Einträge mit einem Zeilenumbruch trennen"
|
||||||
notifyAntenna: "Über neue Notizen benachrichtigen"
|
notifyAntenna: "Über neue Notizen benachrichtigen"
|
||||||
withFileAntenna: "Nur Notizen mit Dateien"
|
withFileAntenna: "Nur Notizen mit Dateien"
|
||||||
|
hideNotesInSensitiveChannel: "Verstecke Notizen von sensitive Kanäle"
|
||||||
enableServiceworker: "Push-Benachrichtigungen im Browser aktivieren"
|
enableServiceworker: "Push-Benachrichtigungen im Browser aktivieren"
|
||||||
antennaUsersDescription: "Benutzernamen getrennt durch Zeilenumbrüche angeben"
|
antennaUsersDescription: "Benutzernamen getrennt durch Zeilenumbrüche angeben"
|
||||||
caseSensitive: "Groß-/Kleinschreibung unterscheiden"
|
caseSensitive: "Groß-/Kleinschreibung unterscheiden"
|
||||||
|
@ -1304,6 +1305,7 @@ thisContentsAreMarkedAsSigninRequiredByAuthor: "Logge dich ein, um weitere Inhal
|
||||||
lockdown: "Sperren"
|
lockdown: "Sperren"
|
||||||
pleaseSelectAccount: "Bitte Konto auswählen"
|
pleaseSelectAccount: "Bitte Konto auswählen"
|
||||||
availableRoles: "Verfügbare Rollen"
|
availableRoles: "Verfügbare Rollen"
|
||||||
|
acknowledgeNotesAndEnable: "Schalten Sie dies erst ein, wenn Sie die Vorsichtsmaßnahmen verstanden haben."
|
||||||
federationSpecified: "Dieser Server arbeitet mit Whitelist-Föderation. Er kann nicht mit anderen als den vom Administrator angegebenen Servern interagieren."
|
federationSpecified: "Dieser Server arbeitet mit Whitelist-Föderation. Er kann nicht mit anderen als den vom Administrator angegebenen Servern interagieren."
|
||||||
federationDisabled: "Föderation ist auf diesem Server deaktiviert. Es ist nicht möglich, mit Benutzern auf anderen Servern zu interagieren."
|
federationDisabled: "Föderation ist auf diesem Server deaktiviert. Es ist nicht möglich, mit Benutzern auf anderen Servern zu interagieren."
|
||||||
confirmOnReact: "Reagieren bestätigen"
|
confirmOnReact: "Reagieren bestätigen"
|
||||||
|
@ -1311,9 +1313,11 @@ reactAreYouSure: "Willst du eine \"{emoji}\"-Reaktion hinzufügen?"
|
||||||
markAsSensitiveConfirm: "Möchtest du dieses Medium als sensibel kennzeichnen?"
|
markAsSensitiveConfirm: "Möchtest du dieses Medium als sensibel kennzeichnen?"
|
||||||
unmarkAsSensitiveConfirm: "Möchtest du die Kennzeichnung dieses Mediums als sensibel aufheben?"
|
unmarkAsSensitiveConfirm: "Möchtest du die Kennzeichnung dieses Mediums als sensibel aufheben?"
|
||||||
preferences: "Einstellungen"
|
preferences: "Einstellungen"
|
||||||
|
accessibility: "Eingabehilfe"
|
||||||
preferencesProfile: "Einstellungsprofil"
|
preferencesProfile: "Einstellungsprofil"
|
||||||
copyPreferenceId: "Kopiere die Einstellungs-ID"
|
copyPreferenceId: "Kopiere die Einstellungs-ID"
|
||||||
resetToDefaultValue: "Auf Standard zurücksetzen"
|
resetToDefaultValue: "Auf Standard zurücksetzen"
|
||||||
|
overrideByAccount: "Überschreibung durch das Konto"
|
||||||
untitled: "Unbenannt"
|
untitled: "Unbenannt"
|
||||||
noName: "Kein Name"
|
noName: "Kein Name"
|
||||||
skip: "Überspringen"
|
skip: "Überspringen"
|
||||||
|
@ -1333,15 +1337,21 @@ chat: "Chat"
|
||||||
migrateOldSettings: "Alte Client-Einstellungen migrieren"
|
migrateOldSettings: "Alte Client-Einstellungen migrieren"
|
||||||
migrateOldSettings_description: "Dies sollte normalerweise automatisch geschehen, aber wenn die Migration aus irgendeinem Grund nicht erfolgreich war, kannst du den Migrationsprozess selbst manuell auslösen. Die aktuellen Konfigurationsinformationen werden dabei überschrieben."
|
migrateOldSettings_description: "Dies sollte normalerweise automatisch geschehen, aber wenn die Migration aus irgendeinem Grund nicht erfolgreich war, kannst du den Migrationsprozess selbst manuell auslösen. Die aktuellen Konfigurationsinformationen werden dabei überschrieben."
|
||||||
compress: "Komprimieren"
|
compress: "Komprimieren"
|
||||||
|
right: "Rechts"
|
||||||
|
bottom: "Unten"
|
||||||
|
top: "Oben"
|
||||||
|
embed: "Einbetten"
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "Noch keine Nachrichten"
|
noMessagesYet: "Noch keine Nachrichten"
|
||||||
newMessage: "Neue Nachricht"
|
newMessage: "Neue Nachricht"
|
||||||
individualChat: "Privater Chat"
|
individualChat: "Privater Chat"
|
||||||
individualChat_description: "Führe einen privaten Chat mit einer anderen Person."
|
individualChat_description: "Führe einen privaten Chat mit einer anderen Person."
|
||||||
|
roomChat: "Chatraum"
|
||||||
roomChat_description: "Ein Chat-Raum, an dem mehrere Personen teilnehmen können.\nDu kannst auch Personen einladen, die keine privaten Chats zulassen, wenn sie die Einladung annehmen."
|
roomChat_description: "Ein Chat-Raum, an dem mehrere Personen teilnehmen können.\nDu kannst auch Personen einladen, die keine privaten Chats zulassen, wenn sie die Einladung annehmen."
|
||||||
createRoom: "Raum erstellen"
|
createRoom: "Raum erstellen"
|
||||||
inviteUserToChat: "Lade Benutzer ein, um mit dem Chatten zu beginnen"
|
inviteUserToChat: "Lade Benutzer ein, um mit dem Chatten zu beginnen"
|
||||||
yourRooms: "Erstellte Räume"
|
yourRooms: "Erstellte Räume"
|
||||||
|
joiningRooms: "Raum beitreten"
|
||||||
invitations: "Einladen"
|
invitations: "Einladen"
|
||||||
noInvitations: "Keine Einladungen"
|
noInvitations: "Keine Einladungen"
|
||||||
history: "Verlauf"
|
history: "Verlauf"
|
||||||
|
@ -1384,8 +1394,10 @@ _emojiPalette:
|
||||||
_settings:
|
_settings:
|
||||||
driveBanner: "Du kannst den Drive verwalten und konfigurieren, die Auslastung überprüfen und Einstellungen für das Hochladen von Dateien vornehmen."
|
driveBanner: "Du kannst den Drive verwalten und konfigurieren, die Auslastung überprüfen und Einstellungen für das Hochladen von Dateien vornehmen."
|
||||||
pluginBanner: "Du kannst die Funktionen des Clients mit Plugins erweitern. Plugins können installiert, individuell konfiguriert und verwaltet werden."
|
pluginBanner: "Du kannst die Funktionen des Clients mit Plugins erweitern. Plugins können installiert, individuell konfiguriert und verwaltet werden."
|
||||||
|
notificationsBanner: "Sie können die Arten und den Umfang der Benachrichtigungen vom Server und der Push- Mitteilungen konfigurieren."
|
||||||
api: "API"
|
api: "API"
|
||||||
webhook: "Webhook"
|
webhook: "Webhook"
|
||||||
|
serviceConnection: "Integrierte Dienste"
|
||||||
serviceConnectionBanner: "Du kannst Zugriffstoken und Webhooks für die Integration mit externen Anwendungen und Diensten verwalten und konfigurieren."
|
serviceConnectionBanner: "Du kannst Zugriffstoken und Webhooks für die Integration mit externen Anwendungen und Diensten verwalten und konfigurieren."
|
||||||
accountData: "Kontodaten"
|
accountData: "Kontodaten"
|
||||||
accountDataBanner: "Export/Import und Verwaltung von Kontodatenarchiven."
|
accountDataBanner: "Export/Import und Verwaltung von Kontodatenarchiven."
|
||||||
|
@ -1393,13 +1405,17 @@ _settings:
|
||||||
accessibilityBanner: "Die Clients können personalisiert und für eine optimale Nutzung im Hinblick auf ihre Darstellung und ihr Verhalten eingerichtet werden."
|
accessibilityBanner: "Die Clients können personalisiert und für eine optimale Nutzung im Hinblick auf ihre Darstellung und ihr Verhalten eingerichtet werden."
|
||||||
privacyBanner: "Du kannst Einstellungen für die Privatsphäre deines Kontos vornehmen, z. B. inwieweit Inhalte veröffentlicht werden, wie leicht sie zu finden sind und ob Follower genehmigt werden müssen."
|
privacyBanner: "Du kannst Einstellungen für die Privatsphäre deines Kontos vornehmen, z. B. inwieweit Inhalte veröffentlicht werden, wie leicht sie zu finden sind und ob Follower genehmigt werden müssen."
|
||||||
securityBanner: "Du kannst Einstellungen für die Kontosicherheit konfigurieren, z. B. Passwörter, Anmeldemethoden, Authentifizierungs-Apps und Passkeys."
|
securityBanner: "Du kannst Einstellungen für die Kontosicherheit konfigurieren, z. B. Passwörter, Anmeldemethoden, Authentifizierungs-Apps und Passkeys."
|
||||||
|
preferencesBanner: "Sie können das Gesamtverhalten des Clients nach Ihren Wünschen konfigurieren."
|
||||||
appearanceBanner: "Du kannst das Erscheinungsbild und die Anzeigeeinstellungen für den Client nach deinen Wünschen konfigurieren."
|
appearanceBanner: "Du kannst das Erscheinungsbild und die Anzeigeeinstellungen für den Client nach deinen Wünschen konfigurieren."
|
||||||
soundsBanner: "Du kannst die Einstellungen für die Wiedergabe von Klängen im Client konfigurieren."
|
soundsBanner: "Du kannst die Einstellungen für die Wiedergabe von Klängen im Client konfigurieren."
|
||||||
timelineAndNote: "Chroniken und Notizen"
|
timelineAndNote: "Chroniken und Notizen"
|
||||||
makeEveryTextElementsSelectable: "Alle Textelemente auswählbar machen"
|
makeEveryTextElementsSelectable: "Alle Textelemente auswählbar machen"
|
||||||
makeEveryTextElementsSelectable_description: "Die Aktivierung kann in manchen Situationen die Benutzerfreundlichkeit beeinträchtigen."
|
makeEveryTextElementsSelectable_description: "Die Aktivierung kann in manchen Situationen die Benutzerfreundlichkeit beeinträchtigen."
|
||||||
|
useStickyIcons: "Icons beim Scrollen folgen lassen"
|
||||||
|
showNavbarSubButtons: "Unterschaltflächen in der Navigationsleiste anzeigen"
|
||||||
ifOn: "Wenn eingeschaltet"
|
ifOn: "Wenn eingeschaltet"
|
||||||
ifOff: "Wenn ausgeschaltet"
|
ifOff: "Wenn ausgeschaltet"
|
||||||
|
enableSyncThemesBetweenDevices: "Synchronisierung von installierten Themen auf verschiedenen Endgeräten"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "Name des Absenders anzeigen"
|
showSenderName: "Name des Absenders anzeigen"
|
||||||
sendOnEnter: "Eingabetaste sendet Nachricht"
|
sendOnEnter: "Eingabetaste sendet Nachricht"
|
||||||
|
@ -1427,6 +1443,7 @@ _accountSettings:
|
||||||
makeNotesHiddenBeforeDescription: ""
|
makeNotesHiddenBeforeDescription: ""
|
||||||
mayNotEffectForFederatedNotes: "Dies hat möglicherweise keine Auswirkungen auf Notizen, die an andere Server föderiert werden."
|
mayNotEffectForFederatedNotes: "Dies hat möglicherweise keine Auswirkungen auf Notizen, die an andere Server föderiert werden."
|
||||||
mayNotEffectSomeSituations: "Diese Einschränkungen sind vereinfacht. Sie gelten möglicherweise nicht in allen Situationen, z. B. bei der Anzeige auf einem fremden Server oder während der Moderation."
|
mayNotEffectSomeSituations: "Diese Einschränkungen sind vereinfacht. Sie gelten möglicherweise nicht in allen Situationen, z. B. bei der Anzeige auf einem fremden Server oder während der Moderation."
|
||||||
|
notesHavePassedSpecifiedPeriod: "Notizen die nach der folgenden Zeit veröffentlicht worden"
|
||||||
notesOlderThanSpecifiedDateAndTime: "Notizen vor einem bestimmtem Datum und Uhrzeit"
|
notesOlderThanSpecifiedDateAndTime: "Notizen vor einem bestimmtem Datum und Uhrzeit"
|
||||||
_abuseUserReport:
|
_abuseUserReport:
|
||||||
forward: "Weiterleiten"
|
forward: "Weiterleiten"
|
||||||
|
@ -1438,6 +1455,7 @@ _abuseUserReport:
|
||||||
_delivery:
|
_delivery:
|
||||||
status: "Auslieferungsstatus"
|
status: "Auslieferungsstatus"
|
||||||
stop: "Gesperrt"
|
stop: "Gesperrt"
|
||||||
|
resume: "Zustellung wieder fortsetzen"
|
||||||
_type:
|
_type:
|
||||||
none: "Wird veröffentlicht"
|
none: "Wird veröffentlicht"
|
||||||
manuallySuspended: "Manuell gesperrt"
|
manuallySuspended: "Manuell gesperrt"
|
||||||
|
@ -1519,6 +1537,7 @@ _initialTutorial:
|
||||||
description2: "Du kannst jederzeit am oberen Rand des Bildschirms zwischen den jeweiligen Chroniken wechseln."
|
description2: "Du kannst jederzeit am oberen Rand des Bildschirms zwischen den jeweiligen Chroniken wechseln."
|
||||||
description3: "Darüber hinaus gibt es Listen-Chroniken und Kanal-Chroniken. Weitere Einzelheiten findest du unter {link}."
|
description3: "Darüber hinaus gibt es Listen-Chroniken und Kanal-Chroniken. Weitere Einzelheiten findest du unter {link}."
|
||||||
_postNote:
|
_postNote:
|
||||||
|
title: "Optionen bei Abschicken einer Notiz"
|
||||||
description1: "Wenn du eine Notiz auf Misskey veröffentlichst, stehen dir verschiedene Optionen zur Verfügung. Die Oberfläche sieht folgendermaßen aus."
|
description1: "Wenn du eine Notiz auf Misskey veröffentlichst, stehen dir verschiedene Optionen zur Verfügung. Die Oberfläche sieht folgendermaßen aus."
|
||||||
_visibility:
|
_visibility:
|
||||||
description: "Du kannst einschränken, wer deine Notiz sehen kann."
|
description: "Du kannst einschränken, wer deine Notiz sehen kann."
|
||||||
|
@ -1839,6 +1858,7 @@ _achievements:
|
||||||
_bubbleGameDoubleExplodingHead:
|
_bubbleGameDoubleExplodingHead:
|
||||||
title: "Doppel🤯"
|
title: "Doppel🤯"
|
||||||
description: "Zwei der größten Objekte im Bubble Game zur gleichen Zeit"
|
description: "Zwei der größten Objekte im Bubble Game zur gleichen Zeit"
|
||||||
|
flavor: "Eine Lunchbox kann man auch mit etwas mehr 🤯 🤯 füllen"
|
||||||
_role:
|
_role:
|
||||||
new: "Rolle erstellen"
|
new: "Rolle erstellen"
|
||||||
edit: "Rolle bearbeiten"
|
edit: "Rolle bearbeiten"
|
||||||
|
@ -1868,6 +1888,8 @@ _role:
|
||||||
descriptionOfIsExplorable: "Ist dies aktiviert, so ist die Chronik dieser Rolle, sowie eine Liste der Benutzer mit dieser Rolle, frei zugänglich."
|
descriptionOfIsExplorable: "Ist dies aktiviert, so ist die Chronik dieser Rolle, sowie eine Liste der Benutzer mit dieser Rolle, frei zugänglich."
|
||||||
displayOrder: "Position"
|
displayOrder: "Position"
|
||||||
descriptionOfDisplayOrder: "Je höher die Nummer, desto höher die UI-Position."
|
descriptionOfDisplayOrder: "Je höher die Nummer, desto höher die UI-Position."
|
||||||
|
preserveAssignmentOnMoveAccount: "Rolle übertragbar machen"
|
||||||
|
preserveAssignmentOnMoveAccount_description: "Wenn diese Option aktiviert ist, wird diese Rolle bei der Migration mit übertragen."
|
||||||
canEditMembersByModerator: "Moderatoren können Benutzern diese Rolle zuweisen"
|
canEditMembersByModerator: "Moderatoren können Benutzern diese Rolle zuweisen"
|
||||||
descriptionOfCanEditMembersByModerator: "Wenn aktiviert, so können Moderatoren und Adminstratoren anderen Benutzern diese Rolle zuweisen bzw. diese Zuweisung aufheben. Wenn deaktiviert, so ist es nur Administratoren möglich, Zuweisungen dieser Rolle zu verwalten."
|
descriptionOfCanEditMembersByModerator: "Wenn aktiviert, so können Moderatoren und Adminstratoren anderen Benutzern diese Rolle zuweisen bzw. diese Zuweisung aufheben. Wenn deaktiviert, so ist es nur Administratoren möglich, Zuweisungen dieser Rolle zu verwalten."
|
||||||
priority: "Priorität"
|
priority: "Priorität"
|
||||||
|
@ -2105,7 +2127,6 @@ _theme:
|
||||||
header: "Kopfzeile"
|
header: "Kopfzeile"
|
||||||
navBg: "Hintergrund der Seitenleiste"
|
navBg: "Hintergrund der Seitenleiste"
|
||||||
navFg: "Text der Seitenleiste"
|
navFg: "Text der Seitenleiste"
|
||||||
navHoverFg: "Text der Seitenleiste (Mouseover)"
|
|
||||||
navActive: "Text der Seitenleiste (Aktiv)"
|
navActive: "Text der Seitenleiste (Aktiv)"
|
||||||
navIndicator: "Indikator der Seitenleiste"
|
navIndicator: "Indikator der Seitenleiste"
|
||||||
link: "Link"
|
link: "Link"
|
||||||
|
@ -2128,11 +2149,8 @@ _theme:
|
||||||
buttonHoverBg: "Hintergrund von Schaltflächen (Mouseover)"
|
buttonHoverBg: "Hintergrund von Schaltflächen (Mouseover)"
|
||||||
inputBorder: "Rahmen von Eingabefeldern"
|
inputBorder: "Rahmen von Eingabefeldern"
|
||||||
driveFolderBg: "Hintergrund von Drive-Ordnern"
|
driveFolderBg: "Hintergrund von Drive-Ordnern"
|
||||||
wallpaperOverlay: "Hintergrundbild-Overlay"
|
|
||||||
badge: "Wappen"
|
badge: "Wappen"
|
||||||
messageBg: "Hintergrund von Chats"
|
messageBg: "Hintergrund von Chats"
|
||||||
accentDarken: "Akzent (Verdunkelt)"
|
|
||||||
accentLighten: "Akzent (Erhellt)"
|
|
||||||
fgHighlighted: "Hervorgehobener Text"
|
fgHighlighted: "Hervorgehobener Text"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Notizen"
|
note: "Notizen"
|
||||||
|
@ -2267,12 +2285,14 @@ _permissions:
|
||||||
"read:admin:announcements": "Ankündigungen einsehen"
|
"read:admin:announcements": "Ankündigungen einsehen"
|
||||||
"write:admin:avatar-decorations": "Kann Avatar-Dekorationen verwalten"
|
"write:admin:avatar-decorations": "Kann Avatar-Dekorationen verwalten"
|
||||||
"read:admin:avatar-decorations": "Avatar-Dekorationen ansehen"
|
"read:admin:avatar-decorations": "Avatar-Dekorationen ansehen"
|
||||||
|
"write:admin:federation": "Informationen über Föderationen bearbeiten oder löschen"
|
||||||
"write:admin:account": "Benutzerkonten verwalten"
|
"write:admin:account": "Benutzerkonten verwalten"
|
||||||
"read:admin:account": "Benutzerkonten anzeigen"
|
"read:admin:account": "Benutzerkonten anzeigen"
|
||||||
"write:admin:emoji": "Emojis verwalten"
|
"write:admin:emoji": "Emojis verwalten"
|
||||||
"read:admin:emoji": "Emojis anzeigen"
|
"read:admin:emoji": "Emojis anzeigen"
|
||||||
"write:admin:queue": "Job-Warteschlange verwalten"
|
"write:admin:queue": "Job-Warteschlange verwalten"
|
||||||
"read:admin:queue": "Job-Warteschlange anzeigen"
|
"read:admin:queue": "Job-Warteschlange anzeigen"
|
||||||
|
"write:admin:promo": "Moderationsnotiz hinzufügen"
|
||||||
"write:admin:drive": "Benutzer-Drive verwalten"
|
"write:admin:drive": "Benutzer-Drive verwalten"
|
||||||
"read:admin:drive": "Benutzer-Drive ansehen"
|
"read:admin:drive": "Benutzer-Drive ansehen"
|
||||||
"read:admin:stream": "Verwendung der Websocket-API für Administratoren"
|
"read:admin:stream": "Verwendung der Websocket-API für Administratoren"
|
||||||
|
@ -2280,6 +2300,8 @@ _permissions:
|
||||||
"read:admin:ad": "Werbung ansehen"
|
"read:admin:ad": "Werbung ansehen"
|
||||||
"write:invite-codes": "Einladungscodes erstellen"
|
"write:invite-codes": "Einladungscodes erstellen"
|
||||||
"read:invite-codes": "Einladungscodes anzeigen"
|
"read:invite-codes": "Einladungscodes anzeigen"
|
||||||
|
"write:clip-favorite": "Clip-Likes bearbeiten oder löschen"
|
||||||
|
"read:clip-favorite": "Clip-Likes ansehen"
|
||||||
"read:federation": "Informationen zur Föderation einsehen"
|
"read:federation": "Informationen zur Föderation einsehen"
|
||||||
"write:report-abuse": "Verstöße melden"
|
"write:report-abuse": "Verstöße melden"
|
||||||
"write:chat": "Chats bedienen"
|
"write:chat": "Chats bedienen"
|
||||||
|
@ -2294,6 +2316,7 @@ _auth:
|
||||||
callback: "Es wird zur Anwendung zurückgekehrt"
|
callback: "Es wird zur Anwendung zurückgekehrt"
|
||||||
accepted: "Zugriff gewährt"
|
accepted: "Zugriff gewährt"
|
||||||
denied: "Zugriff verweigert"
|
denied: "Zugriff verweigert"
|
||||||
|
scopeUser: "Als folgender Benutzer agieren"
|
||||||
pleaseLogin: "Bitte logge dich ein, um Apps zu authorisieren."
|
pleaseLogin: "Bitte logge dich ein, um Apps zu authorisieren."
|
||||||
byClickingYouWillBeRedirectedToThisUrl: "Wenn der Zugang gewährt wird, wirst du automatisch zu folgender URL weitergeleitet"
|
byClickingYouWillBeRedirectedToThisUrl: "Wenn der Zugang gewährt wird, wirst du automatisch zu folgender URL weitergeleitet"
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
|
@ -2546,6 +2569,7 @@ _notification:
|
||||||
exportOfXCompleted: "Der Export von {x} ist abgeschlossen"
|
exportOfXCompleted: "Der Export von {x} ist abgeschlossen"
|
||||||
login: "Neue Anmeldung erfolgt"
|
login: "Neue Anmeldung erfolgt"
|
||||||
createToken: "Ein Zugangstoken wurde erstellt"
|
createToken: "Ein Zugangstoken wurde erstellt"
|
||||||
|
createTokenDescription: "Wenn Sie keine Ahnung haben, löschen Sie das Zugriffstoken über \"{text}\""
|
||||||
_types:
|
_types:
|
||||||
all: "Alle"
|
all: "Alle"
|
||||||
note: "Neue Notizen"
|
note: "Neue Notizen"
|
||||||
|
@ -2573,6 +2597,9 @@ _notification:
|
||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "Hauptspalte immer zeigen"
|
alwaysShowMainColumn: "Hauptspalte immer zeigen"
|
||||||
columnAlign: "Spaltenausrichtung"
|
columnAlign: "Spaltenausrichtung"
|
||||||
|
columnGap: "Spaltenabstand"
|
||||||
|
deckMenuPosition: "Position des Deck-Menüs"
|
||||||
|
navbarPosition: "Position der Navigationsleiste"
|
||||||
addColumn: "Spalte hinzufügen"
|
addColumn: "Spalte hinzufügen"
|
||||||
newNoteNotificationSettings: "Benachrichtigungseinstellungen für neue Notizen"
|
newNoteNotificationSettings: "Benachrichtigungseinstellungen für neue Notizen"
|
||||||
configureColumn: "Spalteneinstellungen"
|
configureColumn: "Spalteneinstellungen"
|
||||||
|
@ -2795,6 +2822,9 @@ _reversi:
|
||||||
allGames: "Alle Runden"
|
allGames: "Alle Runden"
|
||||||
ended: "Beendet"
|
ended: "Beendet"
|
||||||
playing: "Partie läuft"
|
playing: "Partie läuft"
|
||||||
|
isLlotheo: "Der mit weniger Steinen gewinnt (Llotheo)"
|
||||||
|
loopedMap: "Wiederholendes Spielbrett"
|
||||||
|
canPutEverywhere: "Steine können überall platziert werden"
|
||||||
timeLimitForEachTurn: "Zeitlimit eines Zugs"
|
timeLimitForEachTurn: "Zeitlimit eines Zugs"
|
||||||
freeMatch: "Freies Spiel"
|
freeMatch: "Freies Spiel"
|
||||||
lookingForPlayer: "Gegner werden gesucht..."
|
lookingForPlayer: "Gegner werden gesucht..."
|
||||||
|
@ -2845,6 +2875,7 @@ _customEmojisManager:
|
||||||
copySelectionRows: "Ausgewählte Zeilen kopieren"
|
copySelectionRows: "Ausgewählte Zeilen kopieren"
|
||||||
copySelectionRanges: "Auswahl kopieren"
|
copySelectionRanges: "Auswahl kopieren"
|
||||||
deleteSelectionRows: "Ausgewählte Zeilen löschen"
|
deleteSelectionRows: "Ausgewählte Zeilen löschen"
|
||||||
|
deleteSelectionRanges: "Zeilen in der Auswahl löschen"
|
||||||
searchSettings: "Sucheinstellungen"
|
searchSettings: "Sucheinstellungen"
|
||||||
searchSettingCaption: "Detaillierte Suchkriterien festlegen."
|
searchSettingCaption: "Detaillierte Suchkriterien festlegen."
|
||||||
searchLimit: "Anzahl der Ergebnisse"
|
searchLimit: "Anzahl der Ergebnisse"
|
||||||
|
@ -2853,10 +2884,12 @@ _customEmojisManager:
|
||||||
registrationLogsCaption: "Protokolle werden beim Aktualisieren oder Löschen von Emojis angezeigt. Sie verschwinden nach dem Aktualisieren oder Löschen, dem Wechsel zu einer neuen Seite oder dem Neuladen."
|
registrationLogsCaption: "Protokolle werden beim Aktualisieren oder Löschen von Emojis angezeigt. Sie verschwinden nach dem Aktualisieren oder Löschen, dem Wechsel zu einer neuen Seite oder dem Neuladen."
|
||||||
alertEmojisRegisterFailedDescription: "Emoji konnte nicht aktualisiert oder gelöscht werden. Bitte prüfe das Registrierungsprotokoll für Details."
|
alertEmojisRegisterFailedDescription: "Emoji konnte nicht aktualisiert oder gelöscht werden. Bitte prüfe das Registrierungsprotokoll für Details."
|
||||||
_logs:
|
_logs:
|
||||||
|
showSuccessLogSwitch: "Erfolgsprotokoll zeigen"
|
||||||
failureLogNothing: "Es gibt kein Fehlerprotokoll."
|
failureLogNothing: "Es gibt kein Fehlerprotokoll."
|
||||||
logNothing: "Keine Protokoll-Einträge."
|
logNothing: "Keine Protokoll-Einträge."
|
||||||
_remote:
|
_remote:
|
||||||
selectionRowDetail: "Details der ausgewählten Zeile"
|
selectionRowDetail: "Details der ausgewählten Zeile"
|
||||||
|
importSelectionRows: "Ausgewählte Zeilen importieren"
|
||||||
importSelectionRangesRows: "Zeilen in der Auswahl importieren"
|
importSelectionRangesRows: "Zeilen in der Auswahl importieren"
|
||||||
importEmojisButton: "Ausgewählte Emojis importieren"
|
importEmojisButton: "Ausgewählte Emojis importieren"
|
||||||
confirmImportEmojisTitle: "Emojis importieren"
|
confirmImportEmojisTitle: "Emojis importieren"
|
||||||
|
@ -2866,15 +2899,23 @@ _customEmojisManager:
|
||||||
tabTitleRegister: "Emojis hinzufügen"
|
tabTitleRegister: "Emojis hinzufügen"
|
||||||
_list:
|
_list:
|
||||||
emojisNothing: "Es wurden keine Emojis hinzugefügt."
|
emojisNothing: "Es wurden keine Emojis hinzugefügt."
|
||||||
|
markAsDeleteTargetRows: "Ausgewählte Zeilen als zu löschendes Element markieren"
|
||||||
|
markAsDeleteTargetRanges: "Zeilen in der Auswahl als zu löschendes Element markieren"
|
||||||
alertUpdateEmojisNothingDescription: "Es wurden keine Emojis geändert."
|
alertUpdateEmojisNothingDescription: "Es wurden keine Emojis geändert."
|
||||||
alertDeleteEmojisNothingDescription: "Es gibt keine zu löschenden Emojis."
|
alertDeleteEmojisNothingDescription: "Es gibt keine zu löschenden Emojis."
|
||||||
|
confirmMovePage: "Möchten Sie die Seiten verschieben?"
|
||||||
|
confirmChangeView: "Möchten Sie die Darstellung wechseln?"
|
||||||
confirmUpdateEmojisDescription: "Aktualisiere {count} Emoji(s). Willst du fortfahren?"
|
confirmUpdateEmojisDescription: "Aktualisiere {count} Emoji(s). Willst du fortfahren?"
|
||||||
confirmDeleteEmojisDescription: "Lösche {count} ausgewählte Emoji(s). Willst du fortfahren?"
|
confirmDeleteEmojisDescription: "Lösche {count} ausgewählte Emoji(s). Willst du fortfahren?"
|
||||||
|
confirmResetDescription: "Alle bisher vorgenommenen Änderungen werden zurückgesetzt."
|
||||||
confirmMovePageDesciption: "An den Emojis auf dieser Seite wurden Änderungen vorgenommen.\nWenn du die Seite verlässt, ohne zu speichern, werden alle auf dieser Seite vorgenommenen Änderungen verworfen."
|
confirmMovePageDesciption: "An den Emojis auf dieser Seite wurden Änderungen vorgenommen.\nWenn du die Seite verlässt, ohne zu speichern, werden alle auf dieser Seite vorgenommenen Änderungen verworfen."
|
||||||
|
dialogSelectRoleTitle: "Suche nach dem Rollensatz in Emojis"
|
||||||
_register:
|
_register:
|
||||||
|
uploadSettingTitle: "Upload-Einstellungen"
|
||||||
uploadSettingDescription: "Hier kannst du das Verhalten beim Hochladen von Emojis konfigurieren."
|
uploadSettingDescription: "Hier kannst du das Verhalten beim Hochladen von Emojis konfigurieren."
|
||||||
directoryToCategoryLabel: "Gib den Namen des Verzeichnisses in das Feld „Kategorie“ ein"
|
directoryToCategoryLabel: "Gib den Namen des Verzeichnisses in das Feld „Kategorie“ ein"
|
||||||
directoryToCategoryCaption: "Wenn du ein Verzeichnis ziehst und ablegst, gib den Verzeichnisnamen in das Feld „Kategorie“ ein."
|
directoryToCategoryCaption: "Wenn du ein Verzeichnis ziehst und ablegst, gib den Verzeichnisnamen in das Feld „Kategorie“ ein."
|
||||||
|
emojiInputAreaCaption: "Wählen Sie die Emojis aus, die Sie mit einer der folgenden Methoden speichern möchten."
|
||||||
emojiInputAreaList1: "Ziehe Bilddateien oder Verzeichnisse per Drag-and-drop in diesen Rahmen"
|
emojiInputAreaList1: "Ziehe Bilddateien oder Verzeichnisse per Drag-and-drop in diesen Rahmen"
|
||||||
emojiInputAreaList2: "Klicke auf diesen Link, um von deinem PC aus zu wählen"
|
emojiInputAreaList2: "Klicke auf diesen Link, um von deinem PC aus zu wählen"
|
||||||
emojiInputAreaList3: "Klicke auf diesen Link, um vom Drive aus zu wählen"
|
emojiInputAreaList3: "Klicke auf diesen Link, um vom Drive aus zu wählen"
|
||||||
|
|
|
@ -424,6 +424,7 @@ antennaExcludeBots: "Exclude bot accounts"
|
||||||
antennaKeywordsDescription: "Separate with spaces for an AND condition or with line breaks for an OR condition."
|
antennaKeywordsDescription: "Separate with spaces for an AND condition or with line breaks for an OR condition."
|
||||||
notifyAntenna: "Notify about new notes"
|
notifyAntenna: "Notify about new notes"
|
||||||
withFileAntenna: "Only notes with files"
|
withFileAntenna: "Only notes with files"
|
||||||
|
hideNotesInSensitiveChannel: "Hide notes from sensitive channels"
|
||||||
enableServiceworker: "Enable Push-Notifications for your Browser"
|
enableServiceworker: "Enable Push-Notifications for your Browser"
|
||||||
antennaUsersDescription: "List one username per line"
|
antennaUsersDescription: "List one username per line"
|
||||||
caseSensitive: "Case sensitive"
|
caseSensitive: "Case sensitive"
|
||||||
|
@ -1339,6 +1340,7 @@ compress: "Compress"
|
||||||
right: "Right"
|
right: "Right"
|
||||||
bottom: "Bottom"
|
bottom: "Bottom"
|
||||||
top: "Top"
|
top: "Top"
|
||||||
|
embed: "Embed"
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "No messages yet"
|
noMessagesYet: "No messages yet"
|
||||||
newMessage: "New message"
|
newMessage: "New message"
|
||||||
|
@ -1413,6 +1415,7 @@ _settings:
|
||||||
showNavbarSubButtons: "Show sub-buttons on the navigation bar"
|
showNavbarSubButtons: "Show sub-buttons on the navigation bar"
|
||||||
ifOn: "When turned on"
|
ifOn: "When turned on"
|
||||||
ifOff: "When turned off"
|
ifOff: "When turned off"
|
||||||
|
enableSyncThemesBetweenDevices: "Synchronize installed themes across devices"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "Show sender's name"
|
showSenderName: "Show sender's name"
|
||||||
sendOnEnter: "Press Enter to send"
|
sendOnEnter: "Press Enter to send"
|
||||||
|
@ -1885,6 +1888,8 @@ _role:
|
||||||
descriptionOfIsExplorable: "This role's timeline and the list of users with this will be made public if enabled."
|
descriptionOfIsExplorable: "This role's timeline and the list of users with this will be made public if enabled."
|
||||||
displayOrder: "Position"
|
displayOrder: "Position"
|
||||||
descriptionOfDisplayOrder: "The higher the number, the higher its UI position."
|
descriptionOfDisplayOrder: "The higher the number, the higher its UI position."
|
||||||
|
preserveAssignmentOnMoveAccount: "Preserve role assignment during migration"
|
||||||
|
preserveAssignmentOnMoveAccount_description: "When turned on, this role will be carried over to the destination account when an account with this role is migrated."
|
||||||
canEditMembersByModerator: "Allow moderators to edit the list of members for this role"
|
canEditMembersByModerator: "Allow moderators to edit the list of members for this role"
|
||||||
descriptionOfCanEditMembersByModerator: "When turned on, moderators as well as administrators will be able to assign and unassign users to this role. When turned off, only administrators will be able to assign users."
|
descriptionOfCanEditMembersByModerator: "When turned on, moderators as well as administrators will be able to assign and unassign users to this role. When turned off, only administrators will be able to assign users."
|
||||||
priority: "Priority"
|
priority: "Priority"
|
||||||
|
@ -2122,7 +2127,6 @@ _theme:
|
||||||
header: "Header"
|
header: "Header"
|
||||||
navBg: "Sidebar background"
|
navBg: "Sidebar background"
|
||||||
navFg: "Sidebar text"
|
navFg: "Sidebar text"
|
||||||
navHoverFg: "Sidebar text (Hover)"
|
|
||||||
navActive: "Sidebar text (Active)"
|
navActive: "Sidebar text (Active)"
|
||||||
navIndicator: "Sidebar indicator"
|
navIndicator: "Sidebar indicator"
|
||||||
link: "Link"
|
link: "Link"
|
||||||
|
@ -2145,11 +2149,8 @@ _theme:
|
||||||
buttonHoverBg: "Button background (Hover)"
|
buttonHoverBg: "Button background (Hover)"
|
||||||
inputBorder: "Input field border"
|
inputBorder: "Input field border"
|
||||||
driveFolderBg: "Drive folder background"
|
driveFolderBg: "Drive folder background"
|
||||||
wallpaperOverlay: "Wallpaper overlay"
|
|
||||||
badge: "Badge"
|
badge: "Badge"
|
||||||
messageBg: "Chat background"
|
messageBg: "Chat background"
|
||||||
accentDarken: "Accent (Darkened)"
|
|
||||||
accentLighten: "Accent (Lightened)"
|
|
||||||
fgHighlighted: "Highlighted Text"
|
fgHighlighted: "Highlighted Text"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "New note"
|
note: "New note"
|
||||||
|
|
|
@ -1965,7 +1965,6 @@ _theme:
|
||||||
header: "Cabezal"
|
header: "Cabezal"
|
||||||
navBg: "Fondo de la barra lateral"
|
navBg: "Fondo de la barra lateral"
|
||||||
navFg: "Texto de la barra lateral"
|
navFg: "Texto de la barra lateral"
|
||||||
navHoverFg: "Texto de la barra lateral (hover)"
|
|
||||||
navActive: "Texto de la barra lateral (activo)"
|
navActive: "Texto de la barra lateral (activo)"
|
||||||
navIndicator: "Indicador de la barra lateral"
|
navIndicator: "Indicador de la barra lateral"
|
||||||
link: "Vínculo"
|
link: "Vínculo"
|
||||||
|
@ -1988,11 +1987,8 @@ _theme:
|
||||||
buttonHoverBg: "Fondo de botón (hover)"
|
buttonHoverBg: "Fondo de botón (hover)"
|
||||||
inputBorder: "Borde de los campos de entrada"
|
inputBorder: "Borde de los campos de entrada"
|
||||||
driveFolderBg: "Fondo de capeta del drive"
|
driveFolderBg: "Fondo de capeta del drive"
|
||||||
wallpaperOverlay: "Transparencia del fondo de pantalla"
|
|
||||||
badge: "Medalla"
|
badge: "Medalla"
|
||||||
messageBg: "Fondo de chat"
|
messageBg: "Fondo de chat"
|
||||||
accentDarken: "Acento (oscuro)"
|
|
||||||
accentLighten: "Acento (claro)"
|
|
||||||
fgHighlighted: "Texto resaltado"
|
fgHighlighted: "Texto resaltado"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Notas"
|
note: "Notas"
|
||||||
|
|
|
@ -1816,7 +1816,6 @@ _theme:
|
||||||
header: "Entête"
|
header: "Entête"
|
||||||
navBg: "Fond de la barre latérale"
|
navBg: "Fond de la barre latérale"
|
||||||
navFg: "Texte de la barre latérale"
|
navFg: "Texte de la barre latérale"
|
||||||
navHoverFg: "Texte de la barre latérale (survolé)"
|
|
||||||
navActive: "Texte de la barre latérale (actif)"
|
navActive: "Texte de la barre latérale (actif)"
|
||||||
navIndicator: "Indicateur de barre latérale"
|
navIndicator: "Indicateur de barre latérale"
|
||||||
link: "Lien"
|
link: "Lien"
|
||||||
|
@ -1839,11 +1838,8 @@ _theme:
|
||||||
buttonHoverBg: "Arrière-plan du bouton (survolé)"
|
buttonHoverBg: "Arrière-plan du bouton (survolé)"
|
||||||
inputBorder: "Cadre de la zone de texte"
|
inputBorder: "Cadre de la zone de texte"
|
||||||
driveFolderBg: "Arrière-plan du dossier de disque"
|
driveFolderBg: "Arrière-plan du dossier de disque"
|
||||||
wallpaperOverlay: "Superposition de fond d'écran"
|
|
||||||
badge: "Badge"
|
badge: "Badge"
|
||||||
messageBg: "Arrière plan de la discussion"
|
messageBg: "Arrière plan de la discussion"
|
||||||
accentDarken: "Plus sombre"
|
|
||||||
accentLighten: "Plus clair"
|
|
||||||
fgHighlighted: "Texte mis en évidence"
|
fgHighlighted: "Texte mis en évidence"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Nouvelle note"
|
note: "Nouvelle note"
|
||||||
|
|
|
@ -1931,7 +1931,6 @@ _theme:
|
||||||
header: "Header"
|
header: "Header"
|
||||||
navBg: "Latar belakang bilah samping"
|
navBg: "Latar belakang bilah samping"
|
||||||
navFg: "Teks bilah samping"
|
navFg: "Teks bilah samping"
|
||||||
navHoverFg: "Teks bilah samping (Mengambang)"
|
|
||||||
navActive: "Teks bilah samping (Aktif)"
|
navActive: "Teks bilah samping (Aktif)"
|
||||||
navIndicator: "Indikator bilah samping"
|
navIndicator: "Indikator bilah samping"
|
||||||
link: "Tautan"
|
link: "Tautan"
|
||||||
|
@ -1954,11 +1953,8 @@ _theme:
|
||||||
buttonHoverBg: "Latar belakang tombol (Mengambang)"
|
buttonHoverBg: "Latar belakang tombol (Mengambang)"
|
||||||
inputBorder: "Batas bidang masukan"
|
inputBorder: "Batas bidang masukan"
|
||||||
driveFolderBg: "Latar belakang folder drive"
|
driveFolderBg: "Latar belakang folder drive"
|
||||||
wallpaperOverlay: "Lapisan wallpaper"
|
|
||||||
badge: "Lencana"
|
badge: "Lencana"
|
||||||
messageBg: "Latar belakang obrolan"
|
messageBg: "Latar belakang obrolan"
|
||||||
accentDarken: "Aksen (Gelap)"
|
|
||||||
accentLighten: "Aksen (Terang)"
|
|
||||||
fgHighlighted: "Teks yang disorot"
|
fgHighlighted: "Teks yang disorot"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Catatan"
|
note: "Catatan"
|
||||||
|
|
|
@ -1718,6 +1718,10 @@ export interface Locale extends ILocale {
|
||||||
* ファイルが添付されたノートのみ
|
* ファイルが添付されたノートのみ
|
||||||
*/
|
*/
|
||||||
"withFileAntenna": string;
|
"withFileAntenna": string;
|
||||||
|
/**
|
||||||
|
* センシティブなチャンネルのノートを非表示
|
||||||
|
*/
|
||||||
|
"hideNotesInSensitiveChannel": string;
|
||||||
/**
|
/**
|
||||||
* ブラウザへのプッシュ通知を有効にする
|
* ブラウザへのプッシュ通知を有効にする
|
||||||
*/
|
*/
|
||||||
|
@ -5378,6 +5382,18 @@ export interface Locale extends ILocale {
|
||||||
* 上
|
* 上
|
||||||
*/
|
*/
|
||||||
"top": string;
|
"top": string;
|
||||||
|
/**
|
||||||
|
* 埋め込み
|
||||||
|
*/
|
||||||
|
"embed": string;
|
||||||
|
/**
|
||||||
|
* 設定を移行しています。しばらくお待ちください... (後ほど、設定→その他→旧設定情報を移行 で手動で移行することもできます)
|
||||||
|
*/
|
||||||
|
"settingsMigrating": string;
|
||||||
|
/**
|
||||||
|
* 読み取り専用
|
||||||
|
*/
|
||||||
|
"readonly": string;
|
||||||
"_chat": {
|
"_chat": {
|
||||||
/**
|
/**
|
||||||
* まだメッセージはありません
|
* まだメッセージはありません
|
||||||
|
@ -5492,6 +5508,10 @@ export interface Locale extends ILocale {
|
||||||
* このサーバー、またはこのアカウントでチャットは有効化されていません。
|
* このサーバー、またはこのアカウントでチャットは有効化されていません。
|
||||||
*/
|
*/
|
||||||
"chatNotAvailableForThisAccountOrServer": string;
|
"chatNotAvailableForThisAccountOrServer": string;
|
||||||
|
/**
|
||||||
|
* このサーバー、またはこのアカウントでチャットは読み取り専用となっています。新たに書き込んだり、チャットルームを作成・参加したりすることはできません。
|
||||||
|
*/
|
||||||
|
"chatIsReadOnlyForThisAccountOrServer": string;
|
||||||
/**
|
/**
|
||||||
* 相手のアカウントでチャット機能が使えない状態になっています。
|
* 相手のアカウントでチャット機能が使えない状態になっています。
|
||||||
*/
|
*/
|
||||||
|
@ -7369,6 +7389,14 @@ export interface Locale extends ILocale {
|
||||||
* 数値が大きいほどUI上で先頭に表示されます。
|
* 数値が大きいほどUI上で先頭に表示されます。
|
||||||
*/
|
*/
|
||||||
"descriptionOfDisplayOrder": string;
|
"descriptionOfDisplayOrder": string;
|
||||||
|
/**
|
||||||
|
* アサイン状態を移行先アカウントにも引き継ぐ
|
||||||
|
*/
|
||||||
|
"preserveAssignmentOnMoveAccount": string;
|
||||||
|
/**
|
||||||
|
* オンにすると、このロールが付与されたアカウントが移行された際に、移行先アカウントにもこのロールが引き継がれるようになります。
|
||||||
|
*/
|
||||||
|
"preserveAssignmentOnMoveAccount_description": string;
|
||||||
/**
|
/**
|
||||||
* モデレーターのメンバー編集を許可
|
* モデレーターのメンバー編集を許可
|
||||||
*/
|
*/
|
||||||
|
@ -7527,7 +7555,7 @@ export interface Locale extends ILocale {
|
||||||
/**
|
/**
|
||||||
* チャットを許可
|
* チャットを許可
|
||||||
*/
|
*/
|
||||||
"canChat": string;
|
"chatAvailability": string;
|
||||||
};
|
};
|
||||||
"_condition": {
|
"_condition": {
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -424,6 +424,7 @@ antennaExcludeBots: "Escludere i Bot"
|
||||||
antennaKeywordsDescription: "Sparando con uno spazio indichi la condizione E (and). Separando con un a capo, indichi la condizione O (or)."
|
antennaKeywordsDescription: "Sparando con uno spazio indichi la condizione E (and). Separando con un a capo, indichi la condizione O (or)."
|
||||||
notifyAntenna: "Invia notifiche delle nuove note"
|
notifyAntenna: "Invia notifiche delle nuove note"
|
||||||
withFileAntenna: "Solo note con file in allegato"
|
withFileAntenna: "Solo note con file in allegato"
|
||||||
|
hideNotesInSensitiveChannel: "Nascondere le Note dai canali espliciti"
|
||||||
enableServiceworker: "Abilita ServiceWorker"
|
enableServiceworker: "Abilita ServiceWorker"
|
||||||
antennaUsersDescription: "Elenca un nome utente per riga"
|
antennaUsersDescription: "Elenca un nome utente per riga"
|
||||||
caseSensitive: "Sensibile alla distinzione tra maiuscole e minuscole"
|
caseSensitive: "Sensibile alla distinzione tra maiuscole e minuscole"
|
||||||
|
@ -522,7 +523,7 @@ showNoteActionsOnlyHover: "Mostra le azioni delle Note solo al passaggio del mou
|
||||||
showReactionsCount: "Visualizza il numero di reazioni su una nota"
|
showReactionsCount: "Visualizza il numero di reazioni su una nota"
|
||||||
noHistory: "Nessuna cronologia"
|
noHistory: "Nessuna cronologia"
|
||||||
signinHistory: "Storico degli accessi al profilo"
|
signinHistory: "Storico degli accessi al profilo"
|
||||||
enableAdvancedMfm: "Attiva MFM avanzati"
|
enableAdvancedMfm: "Attivare i Misskey Flavoured Markdown (MFM) avanzati"
|
||||||
enableAnimatedMfm: "Attiva MFM animati"
|
enableAnimatedMfm: "Attiva MFM animati"
|
||||||
doing: "In corso..."
|
doing: "In corso..."
|
||||||
category: "Categoria"
|
category: "Categoria"
|
||||||
|
@ -605,7 +606,7 @@ uiInspector: "UI Inspector"
|
||||||
uiInspectorDescription: "Puoi visualizzare un elenco di elementi UI presenti in memoria. I componenti dell'interfaccia utente vengono generati dalle funzioni Ui:C:."
|
uiInspectorDescription: "Puoi visualizzare un elenco di elementi UI presenti in memoria. I componenti dell'interfaccia utente vengono generati dalle funzioni Ui:C:."
|
||||||
output: "Output"
|
output: "Output"
|
||||||
script: "Script"
|
script: "Script"
|
||||||
disablePagesScript: "Disabilita AiScript nelle pagine"
|
disablePagesScript: "Disabilitare AiScript nelle pagine"
|
||||||
updateRemoteUser: "Aggiorna dati dal profilo remoto"
|
updateRemoteUser: "Aggiorna dati dal profilo remoto"
|
||||||
unsetUserAvatar: "Rimozione foto profilo"
|
unsetUserAvatar: "Rimozione foto profilo"
|
||||||
unsetUserAvatarConfirm: "Vuoi davvero rimuovere la foto profilo?"
|
unsetUserAvatarConfirm: "Vuoi davvero rimuovere la foto profilo?"
|
||||||
|
@ -663,7 +664,7 @@ generateAccessToken: "Genera token di accesso"
|
||||||
permission: "Autorizzazioni "
|
permission: "Autorizzazioni "
|
||||||
adminPermission: "Privilegi amministrativi"
|
adminPermission: "Privilegi amministrativi"
|
||||||
enableAll: "Abilita tutto"
|
enableAll: "Abilita tutto"
|
||||||
disableAll: "Disabilita tutto"
|
disableAll: "Disabilitare tutto"
|
||||||
tokenRequested: "Autorizza accesso al profilo"
|
tokenRequested: "Autorizza accesso al profilo"
|
||||||
pluginTokenRequestedDescription: "Il plugin potrà utilizzare le autorizzazioni impostate qui."
|
pluginTokenRequestedDescription: "Il plugin potrà utilizzare le autorizzazioni impostate qui."
|
||||||
notificationType: "Tipo di notifiche"
|
notificationType: "Tipo di notifiche"
|
||||||
|
@ -766,7 +767,7 @@ noCrawleDescription: "Richiedi che i motori di ricerca non indicizzino la tua pa
|
||||||
lockedAccountInfo: "A meno che non imposti la visibilità delle tue note su \"Solo ai follower\", le tue note sono visibili da tutti, anche se hai configurato l'account per confermare manualmente le richieste di follow."
|
lockedAccountInfo: "A meno che non imposti la visibilità delle tue note su \"Solo ai follower\", le tue note sono visibili da tutti, anche se hai configurato l'account per confermare manualmente le richieste di follow."
|
||||||
alwaysMarkSensitive: "Segnare automaticamente come espliciti gli allegati"
|
alwaysMarkSensitive: "Segnare automaticamente come espliciti gli allegati"
|
||||||
loadRawImages: "Visualizza le intere immagini allegate invece delle miniature."
|
loadRawImages: "Visualizza le intere immagini allegate invece delle miniature."
|
||||||
disableShowingAnimatedImages: "Disabilita le immagini animate"
|
disableShowingAnimatedImages: "Disabilitare le immagini animate"
|
||||||
highlightSensitiveMedia: "Evidenzia i media espliciti"
|
highlightSensitiveMedia: "Evidenzia i media espliciti"
|
||||||
verificationEmailSent: "Una mail di verifica è stata inviata. Si prega di accedere al collegamento per compiere la verifica."
|
verificationEmailSent: "Una mail di verifica è stata inviata. Si prega di accedere al collegamento per compiere la verifica."
|
||||||
notSet: "Non impostato"
|
notSet: "Non impostato"
|
||||||
|
@ -1192,7 +1193,7 @@ renotes: "Rinota"
|
||||||
loadReplies: "Leggi le risposte"
|
loadReplies: "Leggi le risposte"
|
||||||
loadConversation: "Leggi la conversazione"
|
loadConversation: "Leggi la conversazione"
|
||||||
pinnedList: "Elenco in primo piano"
|
pinnedList: "Elenco in primo piano"
|
||||||
keepScreenOn: "Mantieni lo schermo acceso"
|
keepScreenOn: "Mantenere lo schermo acceso"
|
||||||
verifiedLink: "Abbiamo confermato la validità di questo collegamento"
|
verifiedLink: "Abbiamo confermato la validità di questo collegamento"
|
||||||
notifyNotes: "Notifica nuove Note"
|
notifyNotes: "Notifica nuove Note"
|
||||||
unnotifyNotes: "Interrompi le notifiche di nuove Note"
|
unnotifyNotes: "Interrompi le notifiche di nuove Note"
|
||||||
|
@ -1234,7 +1235,7 @@ flip: "Inverti"
|
||||||
showAvatarDecorations: "Mostra decorazione della foto profilo"
|
showAvatarDecorations: "Mostra decorazione della foto profilo"
|
||||||
releaseToRefresh: "Rilascia per aggiornare"
|
releaseToRefresh: "Rilascia per aggiornare"
|
||||||
refreshing: "Aggiornamento..."
|
refreshing: "Aggiornamento..."
|
||||||
pullDownToRefresh: "Trascina per aggiornare"
|
pullDownToRefresh: "Trascinare per aggiornare"
|
||||||
disableStreamingTimeline: "Disabilitare gli aggiornamenti della TL in tempo reale"
|
disableStreamingTimeline: "Disabilitare gli aggiornamenti della TL in tempo reale"
|
||||||
useGroupedNotifications: "Mostra le notifiche raggruppate"
|
useGroupedNotifications: "Mostra le notifiche raggruppate"
|
||||||
signupPendingError: "Si è verificato un problema durante la verifica del tuo indirizzo email. Potrebbe essere scaduto il collegamento temporaneo."
|
signupPendingError: "Si è verificato un problema durante la verifica del tuo indirizzo email. Potrebbe essere scaduto il collegamento temporaneo."
|
||||||
|
@ -1262,7 +1263,7 @@ backToTitle: "Torna al titolo"
|
||||||
hemisphere: "Geolocalizzazione"
|
hemisphere: "Geolocalizzazione"
|
||||||
withSensitive: "Mostra le Note con allegati espliciti"
|
withSensitive: "Mostra le Note con allegati espliciti"
|
||||||
userSaysSomethingSensitive: "Note da {name} con allegati espliciti"
|
userSaysSomethingSensitive: "Note da {name} con allegati espliciti"
|
||||||
enableHorizontalSwipe: "Trascina per invertire i tab"
|
enableHorizontalSwipe: "Trascinare per invertire le colonne"
|
||||||
loading: "Caricamento"
|
loading: "Caricamento"
|
||||||
surrender: "Annulla"
|
surrender: "Annulla"
|
||||||
gameRetry: "Riprova"
|
gameRetry: "Riprova"
|
||||||
|
@ -1336,6 +1337,10 @@ chat: "Chat"
|
||||||
migrateOldSettings: "Migrare le vecchie impostazioni"
|
migrateOldSettings: "Migrare le vecchie impostazioni"
|
||||||
migrateOldSettings_description: "Di solito, viene fatto automaticamente. Se per qualche motivo non fossero migrate con successo, è possibile avviare il processo di migrazione manualmente, sovrascrivendo le configurazioni attuali."
|
migrateOldSettings_description: "Di solito, viene fatto automaticamente. Se per qualche motivo non fossero migrate con successo, è possibile avviare il processo di migrazione manualmente, sovrascrivendo le configurazioni attuali."
|
||||||
compress: "Comprimi"
|
compress: "Comprimi"
|
||||||
|
right: "Destra"
|
||||||
|
bottom: "Sotto"
|
||||||
|
top: "Sopra"
|
||||||
|
embed: "Incorporare"
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "Ancora nessun messaggio"
|
noMessagesYet: "Ancora nessun messaggio"
|
||||||
newMessage: "Nuovo messaggio"
|
newMessage: "Nuovo messaggio"
|
||||||
|
@ -1406,9 +1411,11 @@ _settings:
|
||||||
timelineAndNote: "Note e Timeline"
|
timelineAndNote: "Note e Timeline"
|
||||||
makeEveryTextElementsSelectable: "Imposta ogni elemento come selezionabile"
|
makeEveryTextElementsSelectable: "Imposta ogni elemento come selezionabile"
|
||||||
makeEveryTextElementsSelectable_description: "Potrebbe ridurre l'usabilità in alcune situazioni."
|
makeEveryTextElementsSelectable_description: "Potrebbe ridurre l'usabilità in alcune situazioni."
|
||||||
|
useStickyIcons: "Fissa le icone durante lo scorrimento"
|
||||||
showNavbarSubButtons: "Mostra i pulsanti secondari nella barra di navigazione"
|
showNavbarSubButtons: "Mostra i pulsanti secondari nella barra di navigazione"
|
||||||
ifOn: "Quando attivato"
|
ifOn: "Quando attivato"
|
||||||
ifOff: "Quando disattivato"
|
ifOff: "Quando disattivato"
|
||||||
|
enableSyncThemesBetweenDevices: "Sincronizzare il tema tra i dispositivi"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "Mostra il nome del mittente"
|
showSenderName: "Mostra il nome del mittente"
|
||||||
sendOnEnter: "Invio spedisce"
|
sendOnEnter: "Invio spedisce"
|
||||||
|
@ -1881,6 +1888,8 @@ _role:
|
||||||
descriptionOfIsExplorable: "Selezionandolo, la timeline del ruolo diventerà accessibile pubblicamente. Tranne se il ruolo non è pubblico."
|
descriptionOfIsExplorable: "Selezionandolo, la timeline del ruolo diventerà accessibile pubblicamente. Tranne se il ruolo non è pubblico."
|
||||||
displayOrder: "Ordine di visualizzazione"
|
displayOrder: "Ordine di visualizzazione"
|
||||||
descriptionOfDisplayOrder: "I valori più alti vengono visualizzati per primi"
|
descriptionOfDisplayOrder: "I valori più alti vengono visualizzati per primi"
|
||||||
|
preserveAssignmentOnMoveAccount: "Mantenere l'assegnazione alla migrazione del profilo"
|
||||||
|
preserveAssignmentOnMoveAccount_description: "Attivando, il ruolo verrà portato sul profilo destinatario, durante la migrazione."
|
||||||
canEditMembersByModerator: "Anche i Moderatori assegnano profili a questo ruolo"
|
canEditMembersByModerator: "Anche i Moderatori assegnano profili a questo ruolo"
|
||||||
descriptionOfCanEditMembersByModerator: "Se disattivo, potranno farlo solamente gli Amministratori."
|
descriptionOfCanEditMembersByModerator: "Se disattivo, potranno farlo solamente gli Amministratori."
|
||||||
priority: "Priorità"
|
priority: "Priorità"
|
||||||
|
@ -2118,14 +2127,13 @@ _theme:
|
||||||
header: "Intestazione"
|
header: "Intestazione"
|
||||||
navBg: "Sfondo della barra laterale"
|
navBg: "Sfondo della barra laterale"
|
||||||
navFg: "Testo della barra laterale"
|
navFg: "Testo della barra laterale"
|
||||||
navHoverFg: "Testo della barra laterale (al passaggio del mouse)"
|
|
||||||
navActive: "Testo della barra laterale (attivo)"
|
navActive: "Testo della barra laterale (attivo)"
|
||||||
navIndicator: "Indicatore di barra laterale"
|
navIndicator: "Indicatore di barra laterale"
|
||||||
link: "Link"
|
link: "Link"
|
||||||
hashtag: "Hashtag"
|
hashtag: "Hashtag"
|
||||||
mention: "Menzioni"
|
mention: "Menzioni"
|
||||||
mentionMe: "Menzioni (di me)"
|
mentionMe: "Menzioni (di me)"
|
||||||
renote: "Rinota"
|
renote: "Renota"
|
||||||
modalBg: "Sfondo modale."
|
modalBg: "Sfondo modale."
|
||||||
divider: "Interruzione di linea"
|
divider: "Interruzione di linea"
|
||||||
scrollbarHandle: "Maniglie della barra di scorrimento"
|
scrollbarHandle: "Maniglie della barra di scorrimento"
|
||||||
|
@ -2141,11 +2149,8 @@ _theme:
|
||||||
buttonHoverBg: "Sfondo del pulsante (sorvolato)"
|
buttonHoverBg: "Sfondo del pulsante (sorvolato)"
|
||||||
inputBorder: "Inquadra casella di testo"
|
inputBorder: "Inquadra casella di testo"
|
||||||
driveFolderBg: "Sfondo della cartella di disco"
|
driveFolderBg: "Sfondo della cartella di disco"
|
||||||
wallpaperOverlay: "Sovrapposizione dello sfondo"
|
|
||||||
badge: "Distintivo"
|
badge: "Distintivo"
|
||||||
messageBg: "Sfondo della chat"
|
messageBg: "Sfondo della chat"
|
||||||
accentDarken: "Temi (scuri)"
|
|
||||||
accentLighten: "Temi (luminosi)"
|
|
||||||
fgHighlighted: "Testo in evidenza."
|
fgHighlighted: "Testo in evidenza."
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Nota"
|
note: "Nota"
|
||||||
|
@ -2592,6 +2597,9 @@ _notification:
|
||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "Mostra sempre la colonna principale"
|
alwaysShowMainColumn: "Mostra sempre la colonna principale"
|
||||||
columnAlign: "Allineare colonne"
|
columnAlign: "Allineare colonne"
|
||||||
|
columnGap: "Margine tra le colonne"
|
||||||
|
deckMenuPosition: "Posizione del menu Deck"
|
||||||
|
navbarPosition: "Posizione barra di navigazione"
|
||||||
addColumn: "Aggiungi colonna"
|
addColumn: "Aggiungi colonna"
|
||||||
newNoteNotificationSettings: "Preferenze per le notifiche di nuove Note"
|
newNoteNotificationSettings: "Preferenze per le notifiche di nuove Note"
|
||||||
configureColumn: "Impostazioni colonna"
|
configureColumn: "Impostazioni colonna"
|
||||||
|
@ -2908,7 +2916,7 @@ _customEmojisManager:
|
||||||
directoryToCategoryLabel: "Inseriscile in una cartella omonima alla categoria"
|
directoryToCategoryLabel: "Inseriscile in una cartella omonima alla categoria"
|
||||||
directoryToCategoryCaption: "Crea il campo categoria in base alla cartella."
|
directoryToCategoryCaption: "Crea il campo categoria in base alla cartella."
|
||||||
emojiInputAreaCaption: "Seleziona l'emoji da registrare utilizzando uno dei metodi."
|
emojiInputAreaCaption: "Seleziona l'emoji da registrare utilizzando uno dei metodi."
|
||||||
emojiInputAreaList1: "Trascina una immagine o una cartella in quest'area"
|
emojiInputAreaList1: "Trascinare una immagine o una cartella in quest'area"
|
||||||
emojiInputAreaList2: "Clicca per scegliere file dal tuo dispositivo"
|
emojiInputAreaList2: "Clicca per scegliere file dal tuo dispositivo"
|
||||||
emojiInputAreaList3: "Clicca per selezionare dal Drive"
|
emojiInputAreaList3: "Clicca per selezionare dal Drive"
|
||||||
confirmRegisterEmojisDescription: "Registrazione delle emoji elencate come nuove emoji personalizzate. Vuoi davvero procedere? (Per evitare sovraccarichi, puoi registrare al massimo {count} emoji per volta)"
|
confirmRegisterEmojisDescription: "Registrazione delle emoji elencate come nuove emoji personalizzate. Vuoi davvero procedere? (Per evitare sovraccarichi, puoi registrare al massimo {count} emoji per volta)"
|
||||||
|
|
|
@ -425,6 +425,7 @@ antennaExcludeBots: "Botアカウントを除外"
|
||||||
antennaKeywordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
antennaKeywordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
|
||||||
notifyAntenna: "新しいノートを通知する"
|
notifyAntenna: "新しいノートを通知する"
|
||||||
withFileAntenna: "ファイルが添付されたノートのみ"
|
withFileAntenna: "ファイルが添付されたノートのみ"
|
||||||
|
hideNotesInSensitiveChannel: "センシティブなチャンネルのノートを非表示"
|
||||||
enableServiceworker: "ブラウザへのプッシュ通知を有効にする"
|
enableServiceworker: "ブラウザへのプッシュ通知を有効にする"
|
||||||
antennaUsersDescription: "ユーザー名を改行で区切って指定します"
|
antennaUsersDescription: "ユーザー名を改行で区切って指定します"
|
||||||
caseSensitive: "大文字小文字を区別する"
|
caseSensitive: "大文字小文字を区別する"
|
||||||
|
@ -1340,6 +1341,9 @@ compress: "圧縮"
|
||||||
right: "右"
|
right: "右"
|
||||||
bottom: "下"
|
bottom: "下"
|
||||||
top: "上"
|
top: "上"
|
||||||
|
embed: "埋め込み"
|
||||||
|
settingsMigrating: "設定を移行しています。しばらくお待ちください... (後ほど、設定→その他→旧設定情報を移行 で手動で移行することもできます)"
|
||||||
|
readonly: "読み取り専用"
|
||||||
|
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "まだメッセージはありません"
|
noMessagesYet: "まだメッセージはありません"
|
||||||
|
@ -1370,6 +1374,7 @@ _chat:
|
||||||
muteThisRoom: "このルームをミュート"
|
muteThisRoom: "このルームをミュート"
|
||||||
deleteRoom: "ルームを削除"
|
deleteRoom: "ルームを削除"
|
||||||
chatNotAvailableForThisAccountOrServer: "このサーバー、またはこのアカウントでチャットは有効化されていません。"
|
chatNotAvailableForThisAccountOrServer: "このサーバー、またはこのアカウントでチャットは有効化されていません。"
|
||||||
|
chatIsReadOnlyForThisAccountOrServer: "このサーバー、またはこのアカウントでチャットは読み取り専用となっています。新たに書き込んだり、チャットルームを作成・参加したりすることはできません。"
|
||||||
chatNotAvailableInOtherAccount: "相手のアカウントでチャット機能が使えない状態になっています。"
|
chatNotAvailableInOtherAccount: "相手のアカウントでチャット機能が使えない状態になっています。"
|
||||||
cannotChatWithTheUser: "このユーザーとのチャットを開始できません"
|
cannotChatWithTheUser: "このユーザーとのチャットを開始できません"
|
||||||
cannotChatWithTheUser_description: "チャットが使えない状態になっているか、相手がチャットを開放していません。"
|
cannotChatWithTheUser_description: "チャットが使えない状態になっているか、相手がチャットを開放していません。"
|
||||||
|
@ -1909,6 +1914,8 @@ _role:
|
||||||
descriptionOfIsExplorable: "オンにすると、「みつける」でメンバー一覧が公開されるほか、ロールのタイムラインが利用可能になります。"
|
descriptionOfIsExplorable: "オンにすると、「みつける」でメンバー一覧が公開されるほか、ロールのタイムラインが利用可能になります。"
|
||||||
displayOrder: "表示順"
|
displayOrder: "表示順"
|
||||||
descriptionOfDisplayOrder: "数値が大きいほどUI上で先頭に表示されます。"
|
descriptionOfDisplayOrder: "数値が大きいほどUI上で先頭に表示されます。"
|
||||||
|
preserveAssignmentOnMoveAccount: "アサイン状態を移行先アカウントにも引き継ぐ"
|
||||||
|
preserveAssignmentOnMoveAccount_description: "オンにすると、このロールが付与されたアカウントが移行された際に、移行先アカウントにもこのロールが引き継がれるようになります。"
|
||||||
canEditMembersByModerator: "モデレーターのメンバー編集を許可"
|
canEditMembersByModerator: "モデレーターのメンバー編集を許可"
|
||||||
descriptionOfCanEditMembersByModerator: "オンにすると、管理者に加えてモデレーターもこのロールへユーザーをアサイン/アサイン解除できるようになります。オフにすると管理者のみが行えます。"
|
descriptionOfCanEditMembersByModerator: "オンにすると、管理者に加えてモデレーターもこのロールへユーザーをアサイン/アサイン解除できるようになります。オフにすると管理者のみが行えます。"
|
||||||
priority: "優先度"
|
priority: "優先度"
|
||||||
|
@ -1949,7 +1956,7 @@ _role:
|
||||||
canImportFollowing: "フォローのインポートを許可"
|
canImportFollowing: "フォローのインポートを許可"
|
||||||
canImportMuting: "ミュートのインポートを許可"
|
canImportMuting: "ミュートのインポートを許可"
|
||||||
canImportUserLists: "リストのインポートを許可"
|
canImportUserLists: "リストのインポートを許可"
|
||||||
canChat: "チャットを許可"
|
chatAvailability: "チャットを許可"
|
||||||
_condition:
|
_condition:
|
||||||
roleAssignedTo: "マニュアルロールにアサイン済み"
|
roleAssignedTo: "マニュアルロールにアサイン済み"
|
||||||
isLocal: "ローカルユーザー"
|
isLocal: "ローカルユーザー"
|
||||||
|
|
|
@ -2007,7 +2007,6 @@ _theme:
|
||||||
header: "ヘッダー"
|
header: "ヘッダー"
|
||||||
navBg: "サイドバーの背景"
|
navBg: "サイドバーの背景"
|
||||||
navFg: "サイドバーの文字"
|
navFg: "サイドバーの文字"
|
||||||
navHoverFg: "サイドバー文字(ホバー)"
|
|
||||||
navActive: "サイドバー文字(アクティブ)"
|
navActive: "サイドバー文字(アクティブ)"
|
||||||
navIndicator: "サイドバーのインジケーター"
|
navIndicator: "サイドバーのインジケーター"
|
||||||
link: "リンク"
|
link: "リンク"
|
||||||
|
@ -2030,11 +2029,8 @@ _theme:
|
||||||
buttonHoverBg: "ボタンの背景 (ホバー)"
|
buttonHoverBg: "ボタンの背景 (ホバー)"
|
||||||
inputBorder: "入力ボックスの縁取り"
|
inputBorder: "入力ボックスの縁取り"
|
||||||
driveFolderBg: "ドライブフォルダーの背景"
|
driveFolderBg: "ドライブフォルダーの背景"
|
||||||
wallpaperOverlay: "壁紙のオーバーレイ"
|
|
||||||
badge: "バッジ"
|
badge: "バッジ"
|
||||||
messageBg: "チャットの背景"
|
messageBg: "チャットの背景"
|
||||||
accentDarken: "アクセント (暗め)"
|
|
||||||
accentLighten: "アクセント (明るめ)"
|
|
||||||
fgHighlighted: "強調されとる文字"
|
fgHighlighted: "強調されとる文字"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "ノート"
|
note: "ノート"
|
||||||
|
|
|
@ -747,6 +747,7 @@ _theme:
|
||||||
description: "설멩"
|
description: "설멩"
|
||||||
keys:
|
keys:
|
||||||
mention: "멘션"
|
mention: "멘션"
|
||||||
|
renote: "리노트"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "새 노트"
|
note: "새 노트"
|
||||||
notification: "알림"
|
notification: "알림"
|
||||||
|
|
|
@ -301,6 +301,7 @@ uploadFromUrlMayTakeTime: "업로드가 완료될 때까지 시간이 소요될
|
||||||
explore: "둘러보기"
|
explore: "둘러보기"
|
||||||
messageRead: "읽음"
|
messageRead: "읽음"
|
||||||
noMoreHistory: "이것보다 과거의 기록이 없습니다"
|
noMoreHistory: "이것보다 과거의 기록이 없습니다"
|
||||||
|
startChat: "채팅을 시작하기"
|
||||||
nUsersRead: "{n}명이 읽음"
|
nUsersRead: "{n}명이 읽음"
|
||||||
agreeTo: "{0}에 동의"
|
agreeTo: "{0}에 동의"
|
||||||
agree: "동의합니다"
|
agree: "동의합니다"
|
||||||
|
@ -423,6 +424,7 @@ antennaExcludeBots: "봇 계정 제외"
|
||||||
antennaKeywordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다"
|
antennaKeywordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다"
|
||||||
notifyAntenna: "새로운 노트를 알림"
|
notifyAntenna: "새로운 노트를 알림"
|
||||||
withFileAntenna: "파일이 첨부된 노트만"
|
withFileAntenna: "파일이 첨부된 노트만"
|
||||||
|
hideNotesInSensitiveChannel: "민감한 채널의 노트 숨기기"
|
||||||
enableServiceworker: "ServiceWorker 사용"
|
enableServiceworker: "ServiceWorker 사용"
|
||||||
antennaUsersDescription: "유저명을 한 줄에 한 명씩 적습니다"
|
antennaUsersDescription: "유저명을 한 줄에 한 명씩 적습니다"
|
||||||
caseSensitive: "대소문자를 구분"
|
caseSensitive: "대소문자를 구분"
|
||||||
|
@ -1331,12 +1333,59 @@ emojiPalette: "이모지 팔레트"
|
||||||
postForm: "글 입력란"
|
postForm: "글 입력란"
|
||||||
textCount: "문자 수"
|
textCount: "문자 수"
|
||||||
information: "정보"
|
information: "정보"
|
||||||
|
chat: "채팅"
|
||||||
|
migrateOldSettings: "기존 설정 정보를 이전"
|
||||||
|
migrateOldSettings_description: "보통은 자동으로 이루어지지만, 어떤 이유로 인해 성공적으로 이전이 이루어지지 않는 경우 수동으로 이전을 실행할 수 있습니다. 현재 설정 정보는 덮어쓰게 됩니다."
|
||||||
|
compress: "압축"
|
||||||
|
right: "오른쪽"
|
||||||
|
bottom: "아래"
|
||||||
|
top: "위"
|
||||||
|
embed: "임베드"
|
||||||
_chat:
|
_chat:
|
||||||
|
noMessagesYet: "아직 메시지가 없습니다"
|
||||||
|
newMessage: "새로운 메시지"
|
||||||
|
individualChat: "개인 대화"
|
||||||
|
individualChat_description: "특정 사용자와 일대일 채팅을 할 수 있습니다."
|
||||||
|
roomChat: "룸 채팅"
|
||||||
|
roomChat_description: "여러 명이 함께 채팅할 수 있습니다.\n또한, 개인 채팅을 허용하지 않은 사용자와도 상대방이 수락하면 채팅을 할 수 있습니다."
|
||||||
|
createRoom: "룸을 생성"
|
||||||
|
inviteUserToChat: "사용자를 초대하여 채팅을 시작하세요"
|
||||||
|
yourRooms: "생성한 룸"
|
||||||
|
joiningRooms: "참가 중인 룸"
|
||||||
invitations: "초대"
|
invitations: "초대"
|
||||||
|
noInvitations: "초대장이 없습니다"
|
||||||
|
history: "이력"
|
||||||
noHistory: "기록이 없습니다"
|
noHistory: "기록이 없습니다"
|
||||||
|
noRooms: "룸이 없습니다"
|
||||||
|
inviteUser: "사용자를 초대"
|
||||||
|
sentInvitations: "초대를 보내기"
|
||||||
|
join: "참여"
|
||||||
|
ignore: "무시"
|
||||||
|
leave: "룸을 떠나기"
|
||||||
members: "멤버"
|
members: "멤버"
|
||||||
|
searchMessages: "메시지 검색"
|
||||||
home: "홈"
|
home: "홈"
|
||||||
send: "전송"
|
send: "전송"
|
||||||
|
newline: "줄바꿈"
|
||||||
|
muteThisRoom: "이 룸을 뮤트"
|
||||||
|
deleteRoom: "룸을 삭제"
|
||||||
|
chatNotAvailableForThisAccountOrServer: "이 서버 또는 이 계정에서 채팅이 활성화되어 있지 않습니다."
|
||||||
|
chatNotAvailableInOtherAccount: "상대방 계정에서 채팅 기능을 사용할 수 없는 상태입니다."
|
||||||
|
cannotChatWithTheUser: "이 사용자와 채팅을 시작할 수 없습니다"
|
||||||
|
cannotChatWithTheUser_description: "채팅을 사용할 수 없는 상태이거나 상대방이 채팅을 열지 않은 상태입니다."
|
||||||
|
chatWithThisUser: "채팅하기"
|
||||||
|
thisUserAllowsChatOnlyFromFollowers: "이 사용자는 팔로워만 채팅을 할 수 있습니다."
|
||||||
|
thisUserAllowsChatOnlyFromFollowing: "이 사용자는 이 사용자가 팔로우하는 사용자만 채팅을 허용합니다."
|
||||||
|
thisUserAllowsChatOnlyFromMutualFollowing: "이 사용자는 상호 팔로우하는 사용자만 채팅을 허용합니다."
|
||||||
|
thisUserNotAllowedChatAnyone: "이 사용자는 다른 사람의 채팅을 받지 않습니다."
|
||||||
|
chatAllowedUsers: "채팅을 허용한 상대"
|
||||||
|
chatAllowedUsers_note: "내가 채팅 메시지를 보낸 상대와는 이 설정과 상관없이 채팅이 가능합니다."
|
||||||
|
_chatAllowedUsers:
|
||||||
|
everyone: "누구나"
|
||||||
|
followers: "자신의 팔로워만"
|
||||||
|
following: "자신이 팔로우한 사용자만"
|
||||||
|
mutual: "상호 팔로우한 사용자만"
|
||||||
|
none: "아무도 허락하지 않기"
|
||||||
_emojiPalette:
|
_emojiPalette:
|
||||||
palettes: "팔레트"
|
palettes: "팔레트"
|
||||||
enableSyncBetweenDevicesForPalettes: "팔레트의 디바이스 간 동기화를 활성화"
|
enableSyncBetweenDevicesForPalettes: "팔레트의 디바이스 간 동기화를 활성화"
|
||||||
|
@ -1362,6 +1411,14 @@ _settings:
|
||||||
timelineAndNote: "타임라인과 노트"
|
timelineAndNote: "타임라인과 노트"
|
||||||
makeEveryTextElementsSelectable: "모든 텍스트 요소를 선택할 수 있도록 함"
|
makeEveryTextElementsSelectable: "모든 텍스트 요소를 선택할 수 있도록 함"
|
||||||
makeEveryTextElementsSelectable_description: "활성화 시, 일부 동작에서 사용자의 접근성이 나빠질 수도 있습니다."
|
makeEveryTextElementsSelectable_description: "활성화 시, 일부 동작에서 사용자의 접근성이 나빠질 수도 있습니다."
|
||||||
|
useStickyIcons: "아이콘이 스크롤을 따라가도록 하기"
|
||||||
|
showNavbarSubButtons: "내비게이션 바에 보조 버튼 표시"
|
||||||
|
ifOn: "켜져 있을 때"
|
||||||
|
ifOff: "꺼져 있을 때"
|
||||||
|
enableSyncThemesBetweenDevices: "기기 간 설치한 테마 동기화"
|
||||||
|
_chat:
|
||||||
|
showSenderName: "발신자 이름 표시"
|
||||||
|
sendOnEnter: "엔터로 보내기"
|
||||||
_preferencesProfile:
|
_preferencesProfile:
|
||||||
profileName: "프로필 이름"
|
profileName: "프로필 이름"
|
||||||
profileNameDescription: "이 디바이스를 식별할 이름을 설정해 주세요."
|
profileNameDescription: "이 디바이스를 식별할 이름을 설정해 주세요."
|
||||||
|
@ -1831,6 +1888,8 @@ _role:
|
||||||
descriptionOfIsExplorable: "활성화하면 역할 타임라인을 공개합니다. 비활성화 시 타임라인이 공개되지 않습니다."
|
descriptionOfIsExplorable: "활성화하면 역할 타임라인을 공개합니다. 비활성화 시 타임라인이 공개되지 않습니다."
|
||||||
displayOrder: "표시 순서"
|
displayOrder: "표시 순서"
|
||||||
descriptionOfDisplayOrder: "값이 클 수록 UI에서 먼저 표시됩니다."
|
descriptionOfDisplayOrder: "값이 클 수록 UI에서 먼저 표시됩니다."
|
||||||
|
preserveAssignmentOnMoveAccount: "마이그레이션 대상 계정에도 할당 상태 전달"
|
||||||
|
preserveAssignmentOnMoveAccount_description: "켜면 이 역할이 부여된 계정이 마이그레이션될 때 마이그레이션 대상 계정에도 이 역할이 승계됩니다."
|
||||||
canEditMembersByModerator: "모더레이터의 역할 수정 허용"
|
canEditMembersByModerator: "모더레이터의 역할 수정 허용"
|
||||||
descriptionOfCanEditMembersByModerator: "이 옵션을 켜면 모더레이터도 이 역할에 사용자를 할당하거나 삭제할 수 있습니다. 꺼져 있으면 관리자만 할당이 가능합니다."
|
descriptionOfCanEditMembersByModerator: "이 옵션을 켜면 모더레이터도 이 역할에 사용자를 할당하거나 삭제할 수 있습니다. 꺼져 있으면 관리자만 할당이 가능합니다."
|
||||||
priority: "우선순위"
|
priority: "우선순위"
|
||||||
|
@ -1871,6 +1930,7 @@ _role:
|
||||||
canImportFollowing: "팔로우 가져오기 허용"
|
canImportFollowing: "팔로우 가져오기 허용"
|
||||||
canImportMuting: "뮤트 목록 가져오기 허용"
|
canImportMuting: "뮤트 목록 가져오기 허용"
|
||||||
canImportUserLists: "리스트 목록 가져오기 허용"
|
canImportUserLists: "리스트 목록 가져오기 허용"
|
||||||
|
canChat: "채팅을 허락"
|
||||||
_condition:
|
_condition:
|
||||||
roleAssignedTo: "수동 역할에 이미 할당됨"
|
roleAssignedTo: "수동 역할에 이미 할당됨"
|
||||||
isLocal: "로컬 사용자"
|
isLocal: "로컬 사용자"
|
||||||
|
@ -2067,7 +2127,6 @@ _theme:
|
||||||
header: "헤더"
|
header: "헤더"
|
||||||
navBg: "사이드바 배경"
|
navBg: "사이드바 배경"
|
||||||
navFg: "사이드바 텍스트"
|
navFg: "사이드바 텍스트"
|
||||||
navHoverFg: "사이드바 텍스트 (호버)"
|
|
||||||
navActive: "사이드바 텍스트 (활성)"
|
navActive: "사이드바 텍스트 (활성)"
|
||||||
navIndicator: "사이드바 인디케이터"
|
navIndicator: "사이드바 인디케이터"
|
||||||
link: "링크"
|
link: "링크"
|
||||||
|
@ -2090,17 +2149,15 @@ _theme:
|
||||||
buttonHoverBg: "버튼 배경 (호버)"
|
buttonHoverBg: "버튼 배경 (호버)"
|
||||||
inputBorder: "입력 필드 테두리"
|
inputBorder: "입력 필드 테두리"
|
||||||
driveFolderBg: "드라이브 폴더 배경"
|
driveFolderBg: "드라이브 폴더 배경"
|
||||||
wallpaperOverlay: "배경화면 오버레이"
|
|
||||||
badge: "배지"
|
badge: "배지"
|
||||||
messageBg: "대화 배경"
|
messageBg: "대화 배경"
|
||||||
accentDarken: "강조 색상 (어두움)"
|
|
||||||
accentLighten: "강조 색상 (밝음)"
|
|
||||||
fgHighlighted: "강조된 텍스트"
|
fgHighlighted: "강조된 텍스트"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "새 노트"
|
note: "새 노트"
|
||||||
noteMy: "내 노트"
|
noteMy: "내 노트"
|
||||||
notification: "알림"
|
notification: "알림"
|
||||||
reaction: "리액션 선택"
|
reaction: "리액션 선택"
|
||||||
|
chatMessage: "채팅 메시지"
|
||||||
_soundSettings:
|
_soundSettings:
|
||||||
driveFile: "드라이브에 있는 오디오를 사용"
|
driveFile: "드라이브에 있는 오디오를 사용"
|
||||||
driveFileWarn: "드라이브에 있는 파일을 선택하세요."
|
driveFileWarn: "드라이브에 있는 파일을 선택하세요."
|
||||||
|
@ -2248,6 +2305,7 @@ _permissions:
|
||||||
"read:federation": "연합 정보 불러오기"
|
"read:federation": "연합 정보 불러오기"
|
||||||
"write:report-abuse": "위반 내용 신고하기"
|
"write:report-abuse": "위반 내용 신고하기"
|
||||||
"write:chat": "대화를 시작하거나 메시지를 보냅니다"
|
"write:chat": "대화를 시작하거나 메시지를 보냅니다"
|
||||||
|
"read:chat": "채팅 열람하기"
|
||||||
_auth:
|
_auth:
|
||||||
shareAccessTitle: "어플리케이션의 접근 허가"
|
shareAccessTitle: "어플리케이션의 접근 허가"
|
||||||
shareAccess: "‘{name}’에서 계정에 접근하는 것을 허용하시겠습니까?"
|
shareAccess: "‘{name}’에서 계정에 접근하는 것을 허용하시겠습니까?"
|
||||||
|
@ -2496,6 +2554,7 @@ _notification:
|
||||||
newNote: "새 게시물"
|
newNote: "새 게시물"
|
||||||
unreadAntennaNote: "안테나 {name}"
|
unreadAntennaNote: "안테나 {name}"
|
||||||
roleAssigned: "역할이 부여 되었습니다."
|
roleAssigned: "역할이 부여 되었습니다."
|
||||||
|
chatRoomInvitationReceived: "채팅 룸에 초대받았습니다"
|
||||||
emptyPushNotificationMessage: "푸시 알림이 갱신되었습니다"
|
emptyPushNotificationMessage: "푸시 알림이 갱신되었습니다"
|
||||||
achievementEarned: "도전 과제를 달성했습니다"
|
achievementEarned: "도전 과제를 달성했습니다"
|
||||||
testNotification: "알림 테스트"
|
testNotification: "알림 테스트"
|
||||||
|
@ -2524,6 +2583,7 @@ _notification:
|
||||||
receiveFollowRequest: "팔로우 요청을 받았을 때"
|
receiveFollowRequest: "팔로우 요청을 받았을 때"
|
||||||
followRequestAccepted: "팔로우 요청이 승인되었을 때"
|
followRequestAccepted: "팔로우 요청이 승인되었을 때"
|
||||||
roleAssigned: "역할이 부여 됨"
|
roleAssigned: "역할이 부여 됨"
|
||||||
|
chatRoomInvitationReceived: "채팅 룸에 초대받았습니다"
|
||||||
achievementEarned: "도전 과제 획득"
|
achievementEarned: "도전 과제 획득"
|
||||||
exportCompleted: "추출을 성공함"
|
exportCompleted: "추출을 성공함"
|
||||||
login: "로그인"
|
login: "로그인"
|
||||||
|
@ -2537,6 +2597,9 @@ _notification:
|
||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "메인 칼럼 항상 표시"
|
alwaysShowMainColumn: "메인 칼럼 항상 표시"
|
||||||
columnAlign: "칼럼 정렬"
|
columnAlign: "칼럼 정렬"
|
||||||
|
columnGap: "칼럼 간 여백"
|
||||||
|
deckMenuPosition: "덱 메뉴 위치"
|
||||||
|
navbarPosition: "내비게이션 바 위치"
|
||||||
addColumn: "칼럼 추가"
|
addColumn: "칼럼 추가"
|
||||||
newNoteNotificationSettings: "새 노트 알림 설정"
|
newNoteNotificationSettings: "새 노트 알림 설정"
|
||||||
configureColumn: "칼럼 설정"
|
configureColumn: "칼럼 설정"
|
||||||
|
@ -2663,6 +2726,7 @@ _moderationLogTypes:
|
||||||
deletePage: "페이지를 삭제"
|
deletePage: "페이지를 삭제"
|
||||||
deleteFlash: "Play를 삭제"
|
deleteFlash: "Play를 삭제"
|
||||||
deleteGalleryPost: "갤러리 포스트를 삭제"
|
deleteGalleryPost: "갤러리 포스트를 삭제"
|
||||||
|
deleteChatRoom: "채팅 룸 삭제"
|
||||||
updateProxyAccountDescription: "프록시 계정의 설명 업데이트"
|
updateProxyAccountDescription: "프록시 계정의 설명 업데이트"
|
||||||
_fileViewer:
|
_fileViewer:
|
||||||
title: "파일 상세"
|
title: "파일 상세"
|
||||||
|
|
|
@ -5,6 +5,7 @@ introMisskey: "Welkom! Misskey is een open source, gedecentraliseerde microblogd
|
||||||
poweredByMisskeyDescription: "{name} is één van de services die door het open source platform <b>Misskey</b> wordt geleverd (het wordt ook wel een \"Misskey server genmoemd\")."
|
poweredByMisskeyDescription: "{name} is één van de services die door het open source platform <b>Misskey</b> wordt geleverd (het wordt ook wel een \"Misskey server genmoemd\")."
|
||||||
monthAndDay: "{day} {month}"
|
monthAndDay: "{day} {month}"
|
||||||
search: "Zoeken"
|
search: "Zoeken"
|
||||||
|
reset: "Herstellen"
|
||||||
notifications: "Meldingen"
|
notifications: "Meldingen"
|
||||||
username: "Gebruikersnaam"
|
username: "Gebruikersnaam"
|
||||||
password: "Wachtwoord"
|
password: "Wachtwoord"
|
||||||
|
@ -48,6 +49,7 @@ pin: "Vastmaken aan profielpagina"
|
||||||
unpin: "Losmaken van profielpagina"
|
unpin: "Losmaken van profielpagina"
|
||||||
copyContent: "Kopiëren inhoud"
|
copyContent: "Kopiëren inhoud"
|
||||||
copyLink: "Kopiëren link"
|
copyLink: "Kopiëren link"
|
||||||
|
copyRemoteLink: "Remote-link kopiëren"
|
||||||
copyLinkRenote: ""
|
copyLinkRenote: ""
|
||||||
delete: "Verwijderen"
|
delete: "Verwijderen"
|
||||||
deleteAndEdit: "Verwijderen en bewerken"
|
deleteAndEdit: "Verwijderen en bewerken"
|
||||||
|
@ -63,6 +65,7 @@ copyFileId: "Kopieer veld ID"
|
||||||
copyFolderId: "Kopieer folder ID"
|
copyFolderId: "Kopieer folder ID"
|
||||||
copyProfileUrl: "Kopieer profiel URL"
|
copyProfileUrl: "Kopieer profiel URL"
|
||||||
searchUser: "Zoeken een gebruiker"
|
searchUser: "Zoeken een gebruiker"
|
||||||
|
searchThisUsersNotes: "Notities van deze gebruiker doorzoeken"
|
||||||
reply: "Antwoord"
|
reply: "Antwoord"
|
||||||
loadMore: "Laad meer"
|
loadMore: "Laad meer"
|
||||||
showMore: "Toon meer"
|
showMore: "Toon meer"
|
||||||
|
@ -129,9 +132,12 @@ emojiPicker: "Emoji kiezer"
|
||||||
pinnedEmojisForReactionSettingDescription: "Kies de emojis die als eerste getoond worden tijdens het reageren"
|
pinnedEmojisForReactionSettingDescription: "Kies de emojis die als eerste getoond worden tijdens het reageren"
|
||||||
pinnedEmojisSettingDescription: "Kies de emojis die als eerste getoond worden tijdens het reageren"
|
pinnedEmojisSettingDescription: "Kies de emojis die als eerste getoond worden tijdens het reageren"
|
||||||
emojiPickerDisplay: "Emoji kiezer weergave"
|
emojiPickerDisplay: "Emoji kiezer weergave"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "Overschrijven met reactieinstellingen"
|
||||||
|
overwriteFromPinnedEmojis: "Overschrijven met algemene instellingen"
|
||||||
reactionSettingDescription2: "Sleep om opnieuw te ordenen, Klik om te verwijderen, Druk op \"+\" om toe te voegen"
|
reactionSettingDescription2: "Sleep om opnieuw te ordenen, Klik om te verwijderen, Druk op \"+\" om toe te voegen"
|
||||||
rememberNoteVisibility: "Vergeet niet de notitie zichtbaarheidsinstellingen"
|
rememberNoteVisibility: "Vergeet niet de notitie zichtbaarheidsinstellingen"
|
||||||
attachCancel: "Verwijder bijlage"
|
attachCancel: "Verwijder bijlage"
|
||||||
|
deleteFile: "Bestand verwijderen"
|
||||||
markAsSensitive: "Markeren als NSFW"
|
markAsSensitive: "Markeren als NSFW"
|
||||||
unmarkAsSensitive: "Geen NSFW"
|
unmarkAsSensitive: "Geen NSFW"
|
||||||
enterFileName: "Invoeren bestandsnaam"
|
enterFileName: "Invoeren bestandsnaam"
|
||||||
|
@ -147,6 +153,7 @@ suspendConfirm: "Ben je zeker dat je deze account wil suspenderen?"
|
||||||
unsuspendConfirm: "Ben je zeker dat je deze account wil opnieuw aanstellen?"
|
unsuspendConfirm: "Ben je zeker dat je deze account wil opnieuw aanstellen?"
|
||||||
selectList: "Kies een lijst."
|
selectList: "Kies een lijst."
|
||||||
selectAntenna: "Kies een antenne"
|
selectAntenna: "Kies een antenne"
|
||||||
|
createAntenna: "Antenne aanmaken"
|
||||||
selectWidget: "Kies een widget"
|
selectWidget: "Kies een widget"
|
||||||
editWidgets: "Bewerk widgets"
|
editWidgets: "Bewerk widgets"
|
||||||
editWidgetsExit: "Klaar"
|
editWidgetsExit: "Klaar"
|
||||||
|
@ -158,6 +165,7 @@ emojiUrl: "URL emoji"
|
||||||
addEmoji: "Toevoegen emoji"
|
addEmoji: "Toevoegen emoji"
|
||||||
settingGuide: "Aanbevolen instellingen"
|
settingGuide: "Aanbevolen instellingen"
|
||||||
cacheRemoteFiles: "Externe bestanden cachen"
|
cacheRemoteFiles: "Externe bestanden cachen"
|
||||||
|
cacheRemoteFilesDescription: "Als deze instelling uitgeschakeld is worden bestanden altijd direct van remote servers geladen. Hiermee wordt opslagruimte bespaard, maar doordat er geen thumbnails worden gegenereerd, zal netwerkverkeer toenemen."
|
||||||
flagAsBot: "Markeer dit account als een robot."
|
flagAsBot: "Markeer dit account als een robot."
|
||||||
flagAsBotDescription: "Als dit account van een programma wordt beheerd, zet deze vlag aan. Het aanzetten helpt andere ontwikkelaars om bijvoorbeeld onbedoelde feedback loops te doorbreken of om Misskey meer geschikt te maken."
|
flagAsBotDescription: "Als dit account van een programma wordt beheerd, zet deze vlag aan. Het aanzetten helpt andere ontwikkelaars om bijvoorbeeld onbedoelde feedback loops te doorbreken of om Misskey meer geschikt te maken."
|
||||||
flagAsCat: "Markeer dit account als een kat."
|
flagAsCat: "Markeer dit account als een kat."
|
||||||
|
@ -168,6 +176,10 @@ autoAcceptFollowed: "Accepteer verzoeken om jezelf te volgen vanzelf als je de v
|
||||||
addAccount: "Account toevoegen"
|
addAccount: "Account toevoegen"
|
||||||
loginFailed: "Aanmelding mislukt."
|
loginFailed: "Aanmelding mislukt."
|
||||||
showOnRemote: "Toon op de externe instantie."
|
showOnRemote: "Toon op de externe instantie."
|
||||||
|
continueOnRemote: "Verder op remote server"
|
||||||
|
chooseServerOnMisskeyHub: "Kies een server van de Misskey Hub"
|
||||||
|
specifyServerHost: "Serverhost uitkiezen"
|
||||||
|
inputHostName: "Domein invullen"
|
||||||
general: "Algemeen"
|
general: "Algemeen"
|
||||||
wallpaper: "Achtergrond"
|
wallpaper: "Achtergrond"
|
||||||
setWallpaper: "Achtergrond instellen"
|
setWallpaper: "Achtergrond instellen"
|
||||||
|
@ -178,6 +190,7 @@ followConfirm: "Weet je zeker dat je {name} wilt volgen?"
|
||||||
proxyAccount: "Proxy account"
|
proxyAccount: "Proxy account"
|
||||||
proxyAccountDescription: "Een proxy-account is een account dat onder bepaalde voorwaarden fungeert als externe volger voor gebruikers. Als een gebruiker bijvoorbeeld een externe gebruiker aan de lijst toevoegt, wordt de activiteit van de externe gebruiker niet aan de server geleverd als geen lokale gebruiker die gebruiker volgt, dus het proxy-account volgt in plaats daarvan."
|
proxyAccountDescription: "Een proxy-account is een account dat onder bepaalde voorwaarden fungeert als externe volger voor gebruikers. Als een gebruiker bijvoorbeeld een externe gebruiker aan de lijst toevoegt, wordt de activiteit van de externe gebruiker niet aan de server geleverd als geen lokale gebruiker die gebruiker volgt, dus het proxy-account volgt in plaats daarvan."
|
||||||
host: "Server"
|
host: "Server"
|
||||||
|
selectSelf: "Mezelf kiezen"
|
||||||
selectUser: "Kies een gebruiker"
|
selectUser: "Kies een gebruiker"
|
||||||
recipient: "Ontvanger"
|
recipient: "Ontvanger"
|
||||||
annotation: "Reacties"
|
annotation: "Reacties"
|
||||||
|
@ -192,6 +205,7 @@ perHour: "Per uur"
|
||||||
perDay: "Per dag"
|
perDay: "Per dag"
|
||||||
stopActivityDelivery: "Stop met versturen activiteiten"
|
stopActivityDelivery: "Stop met versturen activiteiten"
|
||||||
blockThisInstance: "Blokkeer deze server"
|
blockThisInstance: "Blokkeer deze server"
|
||||||
|
mediaSilenceThisInstance: "Media van deze server dempen"
|
||||||
operations: "Verwerkingen"
|
operations: "Verwerkingen"
|
||||||
software: "Software"
|
software: "Software"
|
||||||
version: "Versie"
|
version: "Versie"
|
||||||
|
@ -211,6 +225,11 @@ clearCachedFiles: "Cache opschonen"
|
||||||
clearCachedFilesConfirm: "Weet je zeker dat je alle externe bestanden in de cache wilt verwijderen?"
|
clearCachedFilesConfirm: "Weet je zeker dat je alle externe bestanden in de cache wilt verwijderen?"
|
||||||
blockedInstances: "Geblokkeerde servers"
|
blockedInstances: "Geblokkeerde servers"
|
||||||
blockedInstancesDescription: "Maak een lijst van de servers die moeten worden geblokkeerd, gescheiden door regeleinden. Geblokkeerde servers kunnen niet meer communiceren met deze server."
|
blockedInstancesDescription: "Maak een lijst van de servers die moeten worden geblokkeerd, gescheiden door regeleinden. Geblokkeerde servers kunnen niet meer communiceren met deze server."
|
||||||
|
silencedInstancesDescription: "Geef de hostnamen van de servers die je wil dempen op, elk op hun eigen regel. Alle accounts die bij de opgegeven servers horen worden als gedempt behandeld, kunnen alleen maar volgverzoeken maken, en kunnen lokale accounts niet vermelden als ze niet gevolgd worden. Geblokkeerde servers worden hier niet door beïnvloed."
|
||||||
|
mediaSilencedInstances: "Media-gedempte servers"
|
||||||
|
mediaSilencedInstancesDescription: "Geef de hostnamen van de servers die je wil media-dempen op, elk op hun eigen regel. Alle accounts die bij de opgegeven servers horen worden als gedempt behandeld, en kunnen geen eigen emojis gebruiken. Geblokkeerde servers worden hier niet door beïnvloed."
|
||||||
|
federationAllowedHosts: "Servers die mogen federeren "
|
||||||
|
federationAllowedHostsDescription: "Geef de hostnamen van de servers die mogen federeren op, elk op hun eigen regel."
|
||||||
muteAndBlock: "Gedempt en geblokkeerd"
|
muteAndBlock: "Gedempt en geblokkeerd"
|
||||||
mutedUsers: "Gedempte gebruikers"
|
mutedUsers: "Gedempte gebruikers"
|
||||||
blockedUsers: "Geblokkeerde gebruikers"
|
blockedUsers: "Geblokkeerde gebruikers"
|
||||||
|
@ -255,6 +274,7 @@ removed: "Succesvol verwijderd"
|
||||||
removeAreYouSure: "Weet je zeker dat je \"{x}\" wil verwijderen?"
|
removeAreYouSure: "Weet je zeker dat je \"{x}\" wil verwijderen?"
|
||||||
deleteAreYouSure: "Weet je zeker dat je \"{x}\" wil verwijderen?"
|
deleteAreYouSure: "Weet je zeker dat je \"{x}\" wil verwijderen?"
|
||||||
resetAreYouSure: "Resetten?"
|
resetAreYouSure: "Resetten?"
|
||||||
|
areYouSure: "Weet je het zeker?"
|
||||||
saved: "Opgeslagen"
|
saved: "Opgeslagen"
|
||||||
upload: "Uploaden"
|
upload: "Uploaden"
|
||||||
keepOriginalUploading: "Origineel beeld behouden."
|
keepOriginalUploading: "Origineel beeld behouden."
|
||||||
|
@ -268,6 +288,7 @@ uploadFromUrlMayTakeTime: "Het kan even duren voordat het uploaden voltooid is."
|
||||||
explore: "Verkennen"
|
explore: "Verkennen"
|
||||||
messageRead: "Lezen"
|
messageRead: "Lezen"
|
||||||
noMoreHistory: "Er is geen verdere geschiedenis"
|
noMoreHistory: "Er is geen verdere geschiedenis"
|
||||||
|
startChat: "Chat starten"
|
||||||
nUsersRead: "gelezen door {n}"
|
nUsersRead: "gelezen door {n}"
|
||||||
agreeTo: "Ik stem in met {0}"
|
agreeTo: "Ik stem in met {0}"
|
||||||
start: "Aan de slag"
|
start: "Aan de slag"
|
||||||
|
@ -294,12 +315,15 @@ selectFile: "Kies een bestand"
|
||||||
selectFiles: "Selecteer bestanden"
|
selectFiles: "Selecteer bestanden"
|
||||||
selectFolder: "Kies een map"
|
selectFolder: "Kies een map"
|
||||||
selectFolders: "Kies mappen"
|
selectFolders: "Kies mappen"
|
||||||
|
fileNotSelected: "Geen bestand geselecteerd"
|
||||||
renameFile: "Wijzig bestandsnaam"
|
renameFile: "Wijzig bestandsnaam"
|
||||||
folderName: "Mapnaam"
|
folderName: "Mapnaam"
|
||||||
createFolder: "Map aanmaken"
|
createFolder: "Map aanmaken"
|
||||||
renameFolder: "Map hernoemen"
|
renameFolder: "Map hernoemen"
|
||||||
deleteFolder: "Map verwijderen"
|
deleteFolder: "Map verwijderen"
|
||||||
|
folder: "Map"
|
||||||
addFile: "Bestand toevoegen"
|
addFile: "Bestand toevoegen"
|
||||||
|
showFile: "Bestanden weergeven"
|
||||||
emptyDrive: "Jouw Drive is leeg."
|
emptyDrive: "Jouw Drive is leeg."
|
||||||
emptyFolder: "Deze map is leeg"
|
emptyFolder: "Deze map is leeg"
|
||||||
unableToDelete: "Kan niet worden verwijderd"
|
unableToDelete: "Kan niet worden verwijderd"
|
||||||
|
@ -355,8 +379,11 @@ hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Inschakelen hCaptcha"
|
enableHcaptcha: "Inschakelen hCaptcha"
|
||||||
hcaptchaSiteKey: "Site sleutel"
|
hcaptchaSiteKey: "Site sleutel"
|
||||||
hcaptchaSecretKey: "Geheime sleutel"
|
hcaptchaSecretKey: "Geheime sleutel"
|
||||||
|
mcaptcha: "mCaptcha"
|
||||||
|
enableMcaptcha: "mCaptcha activeren"
|
||||||
mcaptchaSiteKey: "Site sleutel"
|
mcaptchaSiteKey: "Site sleutel"
|
||||||
mcaptchaSecretKey: "Geheime sleutel"
|
mcaptchaSecretKey: "Geheime sleutel"
|
||||||
|
mcaptchaInstanceUrl: "mCaptcha server-URL"
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
enableRecaptcha: "Inschakelen reCAPTCHA"
|
enableRecaptcha: "Inschakelen reCAPTCHA"
|
||||||
recaptchaSiteKey: "Site sleutel"
|
recaptchaSiteKey: "Site sleutel"
|
||||||
|
@ -371,6 +398,7 @@ name: "Naam"
|
||||||
antennaSource: "Bron antenne"
|
antennaSource: "Bron antenne"
|
||||||
antennaKeywords: "Sleutelwoorden"
|
antennaKeywords: "Sleutelwoorden"
|
||||||
antennaExcludeKeywords: "Blokkeerwoorden"
|
antennaExcludeKeywords: "Blokkeerwoorden"
|
||||||
|
antennaExcludeBots: "Bot-accounts uitsluiten"
|
||||||
withReplies: "Antwoorden toevoegen"
|
withReplies: "Antwoorden toevoegen"
|
||||||
connectedTo: "De volgende accounts zijn verbonden"
|
connectedTo: "De volgende accounts zijn verbonden"
|
||||||
notesAndReplies: "Berichten en reacties"
|
notesAndReplies: "Berichten en reacties"
|
||||||
|
@ -421,7 +449,13 @@ retype: "Opnieuw invoeren"
|
||||||
noteOf: "Notitie van {user}"
|
noteOf: "Notitie van {user}"
|
||||||
quoteAttached: "Citaat"
|
quoteAttached: "Citaat"
|
||||||
quoteQuestion: "Toevoegen als citaat?"
|
quoteQuestion: "Toevoegen als citaat?"
|
||||||
|
signinOrContinueOnRemote: "Ga naar je eigen instantie of registreer je/log in op deze server om door te gaan."
|
||||||
invitations: "Uitnodigen"
|
invitations: "Uitnodigen"
|
||||||
|
menuStyle: "Menustijl"
|
||||||
|
style: "Stijl"
|
||||||
|
drawer: "Lade"
|
||||||
|
popup: "Pop-up"
|
||||||
|
showReactionsCount: "Zie het aantal reacties op notities"
|
||||||
dashboard: "Overzicht"
|
dashboard: "Overzicht"
|
||||||
local: "Lokaal"
|
local: "Lokaal"
|
||||||
remote: "Remote"
|
remote: "Remote"
|
||||||
|
@ -437,16 +471,41 @@ numberOfDays: "Aantal dagen"
|
||||||
hideThisNote: "Verberg deze notitie"
|
hideThisNote: "Verberg deze notitie"
|
||||||
showFeaturedNotesInTimeline: "Laat featured notities in tijdlijn zien"
|
showFeaturedNotesInTimeline: "Laat featured notities in tijdlijn zien"
|
||||||
sound: "Geluid"
|
sound: "Geluid"
|
||||||
|
notUseSound: "Geluid uitschakelen"
|
||||||
|
useSoundOnlyWhenActive: "Geluid alleen inschakelen wanneer Misskey actief is"
|
||||||
|
uiInspector: "UI-inspecteur"
|
||||||
|
unsetUserAvatar: "Avatar verwijderen"
|
||||||
|
unsetUserAvatarConfirm: "Weet je zeker dat je je avatar wil verwijderen?"
|
||||||
|
unsetUserBanner: "Banner verwijderen"
|
||||||
|
unsetUserBannerConfirm: "Weet je zeker dat je je banner wil verwijderen?"
|
||||||
|
expandTweet: "Notitie uitklappen"
|
||||||
|
adminPermission: "Administratorrechten"
|
||||||
smtpHost: "Server"
|
smtpHost: "Server"
|
||||||
smtpUser: "Gebruikersnaam"
|
smtpUser: "Gebruikersnaam"
|
||||||
smtpPass: "Wachtwoord"
|
smtpPass: "Wachtwoord"
|
||||||
|
wordMuteDescription: "Minimaliseert notities die het gespecificeerde woord of zin bevatten. Geminimaliseerde notities kunnen worden weergegeven door er op te klikken."
|
||||||
|
hardWordMute: "Harde woorddemping"
|
||||||
|
showMutedWord: "Gedempte woorden weergeven"
|
||||||
|
hardWordMuteDescription: "Verbert notities die het gespecificeerde woord of zin bevatten. In tegenstelling tot woorddemping wordt de notitie volledig verborgen."
|
||||||
|
userSaysSomethingAbout: "{name} zei iets over '{word}'"
|
||||||
|
copiedToClipboard: "Naar het klembord gekopieerd"
|
||||||
|
theKeywordWhenSearchingForCustomEmoji: "Dit is het keyword dat gebruikt wordt bij het zoeken naar eigen emojis."
|
||||||
|
fillAbuseReportDescription: "Vul s.v.p. de details in over deze melding. Geef, als het over een specifieke notitie gaat, ook de URL op."
|
||||||
|
reloadToApplySetting: "Deze instelling gaat pas in nadat de pagina herladen is. Nu herladen?"
|
||||||
clearCache: "Cache opschonen"
|
clearCache: "Cache opschonen"
|
||||||
info: "Over"
|
info: "Over"
|
||||||
user: "Gebruikers"
|
user: "Gebruikers"
|
||||||
|
noInquiryUrlWarning: "Contact-URL niet opgegeven"
|
||||||
muteThread: "Discussies dempen "
|
muteThread: "Discussies dempen "
|
||||||
unmuteThread: "Dempen van discussie ongedaan maken"
|
unmuteThread: "Dempen van discussie ongedaan maken"
|
||||||
|
followingVisibility: "Zichtbaarheid van gevolgden"
|
||||||
|
followersVisibility: "Zichtbaarheid van volgers"
|
||||||
|
incorrectTotp: "Het eenmalige wachtwoord is incorrect of verlopen"
|
||||||
hide: "Verbergen"
|
hide: "Verbergen"
|
||||||
searchByGoogle: "Zoeken"
|
searchByGoogle: "Zoeken"
|
||||||
|
threeMonths: "3 maanden"
|
||||||
|
oneYear: "1 jaar"
|
||||||
|
threeDays: "3 dagen"
|
||||||
cropImage: "Afbeelding bijsnijden"
|
cropImage: "Afbeelding bijsnijden"
|
||||||
cropImageAsk: "Bijsnijdengevraagd"
|
cropImageAsk: "Bijsnijdengevraagd"
|
||||||
file: "Bestanden"
|
file: "Bestanden"
|
||||||
|
@ -457,9 +516,28 @@ pushNotificationAlreadySubscribed: "Pushberichtrn al ingeschakeld"
|
||||||
windowMaximize: "Maximaliseren"
|
windowMaximize: "Maximaliseren"
|
||||||
windowRestore: "Herstellen"
|
windowRestore: "Herstellen"
|
||||||
loggedInAsBot: "Momenteel als bot ingelogd"
|
loggedInAsBot: "Momenteel als bot ingelogd"
|
||||||
|
correspondingSourceIsAvailable: "De bijbehorende broncode is beschikbaar bij {anchor}"
|
||||||
|
invalidParamErrorDescription: "De aanvraagparameters zijn ongeldig. Dit komt meestal door een bug, maar kan ook omdat de invoer te lang is of iets dergelijks."
|
||||||
|
collapseRenotes: "Renotes die je al gezien hebt, inklappen"
|
||||||
|
collapseRenotesDescription: "Klapt notities in waar je al op gereageerd hebt of die je al gerenotet hebt."
|
||||||
|
prohibitedWords: "Verboden woorden"
|
||||||
|
prohibitedWordsDescription: "Activeert een foutmelding als er geprobeerd wordt een notitie met de ingestelde woorden te plaatsen. Meerdere woorden kunnen worden ingesteld, elk op hun eigen regel."
|
||||||
|
hiddenTags: "Verborgen hashtags"
|
||||||
|
hiddenTagsDescription: "Selecteer tags die niet worden weergegeven in de trends. Meerdere tags kunnen worden geregistreerd, elk op hun eigen regel."
|
||||||
|
enableStatsForFederatedInstances: "Statistieken van remote servers ontvangen"
|
||||||
|
limitWidthOfReaction: "Limiteert de maximale breedte van reacties en geef ze verkleind weer"
|
||||||
|
audio: "Audio"
|
||||||
|
audioFiles: "Audio"
|
||||||
|
archived: "Gearchiveerd"
|
||||||
|
unarchive: "Dearchiveren"
|
||||||
|
lookupConfirm: "Weet je zeker dat je dit wil opzoeken?"
|
||||||
|
openTagPageConfirm: "Wil je deze hashtagpagina openen?"
|
||||||
|
specifyHost: "Specificeer host"
|
||||||
icon: "Avatar"
|
icon: "Avatar"
|
||||||
replies: "Antwoord"
|
replies: "Antwoord"
|
||||||
renotes: "Herdelen"
|
renotes: "Herdelen"
|
||||||
|
followingOrFollower: "Gevolgd of volger"
|
||||||
|
confirmShowRepliesAll: "Dit is een onomkeerbare operatie. Weet je zeker dat reacties op anderen van iedereen die je volgt, wil weergeven in je tijdlijn?"
|
||||||
information: "Over"
|
information: "Over"
|
||||||
_chat:
|
_chat:
|
||||||
invitations: "Uitnodigen"
|
invitations: "Uitnodigen"
|
||||||
|
|
|
@ -1212,7 +1212,6 @@ _theme:
|
||||||
header: "Nagłówek"
|
header: "Nagłówek"
|
||||||
navBg: "Tło paska bocznego"
|
navBg: "Tło paska bocznego"
|
||||||
navFg: "Tekst paska bocznego"
|
navFg: "Tekst paska bocznego"
|
||||||
navHoverFg: "Tekst paska bocznego (zbliżenie)"
|
|
||||||
navActive: "Tekst paska bocznego (aktywny)"
|
navActive: "Tekst paska bocznego (aktywny)"
|
||||||
navIndicator: "Wskaźnik paska bocznego"
|
navIndicator: "Wskaźnik paska bocznego"
|
||||||
link: "Odnośnik"
|
link: "Odnośnik"
|
||||||
|
@ -1235,11 +1234,8 @@ _theme:
|
||||||
buttonHoverBg: "Tło przycisku (po najechaniu)"
|
buttonHoverBg: "Tło przycisku (po najechaniu)"
|
||||||
inputBorder: "Obramowanie pola wejścia"
|
inputBorder: "Obramowanie pola wejścia"
|
||||||
driveFolderBg: "Tło folderu na dysku"
|
driveFolderBg: "Tło folderu na dysku"
|
||||||
wallpaperOverlay: "Nakładka tapety"
|
|
||||||
badge: "Odznaka"
|
badge: "Odznaka"
|
||||||
messageBg: "Tło czatu"
|
messageBg: "Tło czatu"
|
||||||
accentDarken: "Akcent (ciemniejszy)"
|
|
||||||
accentLighten: "Akcent (jaśniejszy)"
|
|
||||||
fgHighlighted: "Wyróżniony tekst"
|
fgHighlighted: "Wyróżniony tekst"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Wpisy"
|
note: "Wpisy"
|
||||||
|
|
|
@ -1997,7 +1997,6 @@ _theme:
|
||||||
header: "Cabeçalho"
|
header: "Cabeçalho"
|
||||||
navBg: "Plano de fundo da barra lateral"
|
navBg: "Plano de fundo da barra lateral"
|
||||||
navFg: "Texto da barra lateral"
|
navFg: "Texto da barra lateral"
|
||||||
navHoverFg: "Texto da coluna lateral (Selecionado)"
|
|
||||||
navActive: "Texto da coluna lateral (Ativa)"
|
navActive: "Texto da coluna lateral (Ativa)"
|
||||||
navIndicator: "Indicador da coluna lateral"
|
navIndicator: "Indicador da coluna lateral"
|
||||||
link: "Link"
|
link: "Link"
|
||||||
|
@ -2020,11 +2019,8 @@ _theme:
|
||||||
buttonHoverBg: "Plano de fundo de botão (Selecionado)"
|
buttonHoverBg: "Plano de fundo de botão (Selecionado)"
|
||||||
inputBorder: "Borda de campo digitável"
|
inputBorder: "Borda de campo digitável"
|
||||||
driveFolderBg: "Plano de fundo da pasta no Drive"
|
driveFolderBg: "Plano de fundo da pasta no Drive"
|
||||||
wallpaperOverlay: "Sobreposição do papel de parede."
|
|
||||||
badge: "Emblema"
|
badge: "Emblema"
|
||||||
messageBg: "Plano de fundo do chat"
|
messageBg: "Plano de fundo do chat"
|
||||||
accentDarken: "Cor de destaque (Escurecida)"
|
|
||||||
accentLighten: "Cor de destaque (Esclarecida)"
|
|
||||||
fgHighlighted: "Texto Destacado"
|
fgHighlighted: "Texto Destacado"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Posts"
|
note: "Posts"
|
||||||
|
|
|
@ -1689,7 +1689,6 @@ _theme:
|
||||||
header: "Заголовок"
|
header: "Заголовок"
|
||||||
navBg: "Фон боковой панели"
|
navBg: "Фон боковой панели"
|
||||||
navFg: "Текст на боковой панели"
|
navFg: "Текст на боковой панели"
|
||||||
navHoverFg: "Текст на боковой панели (под указателем)"
|
|
||||||
navActive: "Текст на боковой панели (активирован)"
|
navActive: "Текст на боковой панели (активирован)"
|
||||||
navIndicator: "Индикатор на боковой панели"
|
navIndicator: "Индикатор на боковой панели"
|
||||||
link: "Ссылка"
|
link: "Ссылка"
|
||||||
|
@ -1712,11 +1711,8 @@ _theme:
|
||||||
buttonHoverBg: "Текст кнопки"
|
buttonHoverBg: "Текст кнопки"
|
||||||
inputBorder: "Рамка поля ввода"
|
inputBorder: "Рамка поля ввода"
|
||||||
driveFolderBg: "Фон папки «Диска»"
|
driveFolderBg: "Фон папки «Диска»"
|
||||||
wallpaperOverlay: "Слой обоев"
|
|
||||||
badge: "Значок"
|
badge: "Значок"
|
||||||
messageBg: "Фон беседы"
|
messageBg: "Фон беседы"
|
||||||
accentDarken: "Фон (затемнённый)"
|
|
||||||
accentLighten: "Фон (осветлённый)"
|
|
||||||
fgHighlighted: "Подсвеченный текст"
|
fgHighlighted: "Подсвеченный текст"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Заметки"
|
note: "Заметки"
|
||||||
|
|
|
@ -1089,7 +1089,6 @@ _theme:
|
||||||
header: "Hlavička"
|
header: "Hlavička"
|
||||||
navBg: "Pozadie bočného panela"
|
navBg: "Pozadie bočného panela"
|
||||||
navFg: "Text bočného panela"
|
navFg: "Text bočného panela"
|
||||||
navHoverFg: "Text bočného panela (pod kurzorom)"
|
|
||||||
navActive: "Text bočného panela (aktívny)"
|
navActive: "Text bočného panela (aktívny)"
|
||||||
navIndicator: "Indikátor bočného panela"
|
navIndicator: "Indikátor bočného panela"
|
||||||
link: "Odkaz"
|
link: "Odkaz"
|
||||||
|
@ -1112,11 +1111,8 @@ _theme:
|
||||||
buttonHoverBg: "Pozadie tlačidla (pod kurzorom)"
|
buttonHoverBg: "Pozadie tlačidla (pod kurzorom)"
|
||||||
inputBorder: "Okraj vstupného poľa"
|
inputBorder: "Okraj vstupného poľa"
|
||||||
driveFolderBg: "Pozadie priečinu disku"
|
driveFolderBg: "Pozadie priečinu disku"
|
||||||
wallpaperOverlay: "Vrstvenie pozadia"
|
|
||||||
badge: "Odznak"
|
badge: "Odznak"
|
||||||
messageBg: "Pozadie chatu"
|
messageBg: "Pozadie chatu"
|
||||||
accentDarken: "Akcent (stmavené)"
|
|
||||||
accentLighten: "Akcent (zosvetlené)"
|
|
||||||
fgHighlighted: "Zvýraznený text"
|
fgHighlighted: "Zvýraznený text"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Poznámky"
|
note: "Poznámky"
|
||||||
|
|
|
@ -1974,7 +1974,6 @@ _theme:
|
||||||
header: "ส่วนหัว"
|
header: "ส่วนหัว"
|
||||||
navBg: "พื้นหลังแถบด้านข้าง"
|
navBg: "พื้นหลังแถบด้านข้าง"
|
||||||
navFg: "ข้อความแถบด้านข้าง"
|
navFg: "ข้อความแถบด้านข้าง"
|
||||||
navHoverFg: "ข้อความแถบด้านข้าง (โฮเวอร์)"
|
|
||||||
navActive: "ข้อความแถบด้านข้าง (ใช้งานอยู่)"
|
navActive: "ข้อความแถบด้านข้าง (ใช้งานอยู่)"
|
||||||
navIndicator: "ตัวระบุแถบด้านข้าง"
|
navIndicator: "ตัวระบุแถบด้านข้าง"
|
||||||
link: "ลิงก์"
|
link: "ลิงก์"
|
||||||
|
@ -1997,11 +1996,8 @@ _theme:
|
||||||
buttonHoverBg: "ปุ่มพื้นหลัง (โฮเวอร์)"
|
buttonHoverBg: "ปุ่มพื้นหลัง (โฮเวอร์)"
|
||||||
inputBorder: "เส้นขอบของช่องป้อนข้อมูล"
|
inputBorder: "เส้นขอบของช่องป้อนข้อมูล"
|
||||||
driveFolderBg: "พื้นหลังโฟลเดอร์ไดรฟ์"
|
driveFolderBg: "พื้นหลังโฟลเดอร์ไดรฟ์"
|
||||||
wallpaperOverlay: "วอลล์เปเปอร์ซ้อนทับ"
|
|
||||||
badge: "ตรา"
|
badge: "ตรา"
|
||||||
messageBg: "พื้นหลังแชท"
|
messageBg: "พื้นหลังแชท"
|
||||||
accentDarken: "สีหลัก (มืด)"
|
|
||||||
accentLighten: "สีหลัก (สว่าง)"
|
|
||||||
fgHighlighted: "ข้อความที่ไฮไลต์"
|
fgHighlighted: "ข้อความที่ไฮไลต์"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "โน้ต"
|
note: "โน้ต"
|
||||||
|
|
|
@ -1283,7 +1283,6 @@ _theme:
|
||||||
header: "Заголовок"
|
header: "Заголовок"
|
||||||
navBg: "Фон бокової панелі"
|
navBg: "Фон бокової панелі"
|
||||||
navFg: "Текст бокової панелі"
|
navFg: "Текст бокової панелі"
|
||||||
navHoverFg: "Текст бокової панелі (під курсором)"
|
|
||||||
navActive: "Текст бокової панелі (активне)"
|
navActive: "Текст бокової панелі (активне)"
|
||||||
navIndicator: "Індикатор бокової панелі"
|
navIndicator: "Індикатор бокової панелі"
|
||||||
link: "Посилання"
|
link: "Посилання"
|
||||||
|
@ -1306,11 +1305,8 @@ _theme:
|
||||||
buttonHoverBg: "Фон кнопки (при наведенні)"
|
buttonHoverBg: "Фон кнопки (при наведенні)"
|
||||||
inputBorder: "Край поля вводу"
|
inputBorder: "Край поля вводу"
|
||||||
driveFolderBg: "Фон папки на диску"
|
driveFolderBg: "Фон папки на диску"
|
||||||
wallpaperOverlay: "Накладання шпалер"
|
|
||||||
badge: "Значок"
|
badge: "Значок"
|
||||||
messageBg: "Фон переписки"
|
messageBg: "Фон переписки"
|
||||||
accentDarken: "Акцент (Затемлений)"
|
|
||||||
accentLighten: "Акцент (Освітлений)"
|
|
||||||
fgHighlighted: "Виділений текст"
|
fgHighlighted: "Виділений текст"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Нотатки"
|
note: "Нотатки"
|
||||||
|
|
|
@ -907,8 +907,6 @@ _theme:
|
||||||
mention: "Murojat"
|
mention: "Murojat"
|
||||||
renote: "Qayta qayd etish"
|
renote: "Qayta qayd etish"
|
||||||
divider: "Ajratrmoq"
|
divider: "Ajratrmoq"
|
||||||
accentDarken: "Urg'u (Qoraytirilgan)"
|
|
||||||
accentLighten: "Urg'u (Yoritilgan)"
|
|
||||||
fgHighlighted: "Belgilangan matn"
|
fgHighlighted: "Belgilangan matn"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Qaydlar"
|
note: "Qaydlar"
|
||||||
|
|
|
@ -1530,7 +1530,6 @@ _theme:
|
||||||
header: "Ảnh bìa"
|
header: "Ảnh bìa"
|
||||||
navBg: "Nền thanh bên"
|
navBg: "Nền thanh bên"
|
||||||
navFg: "Chữ thanh bên"
|
navFg: "Chữ thanh bên"
|
||||||
navHoverFg: "Chữ thanh bên (Khi chạm)"
|
|
||||||
navActive: "Chữ thanh bên (Khi chọn)"
|
navActive: "Chữ thanh bên (Khi chọn)"
|
||||||
navIndicator: "Chỉ báo thanh bên"
|
navIndicator: "Chỉ báo thanh bên"
|
||||||
link: "Đường dẫn"
|
link: "Đường dẫn"
|
||||||
|
@ -1553,11 +1552,8 @@ _theme:
|
||||||
buttonHoverBg: "Nền nút (Chạm)"
|
buttonHoverBg: "Nền nút (Chạm)"
|
||||||
inputBorder: "Đường viền khung soạn thảo"
|
inputBorder: "Đường viền khung soạn thảo"
|
||||||
driveFolderBg: "Nền thư mục Ổ đĩa"
|
driveFolderBg: "Nền thư mục Ổ đĩa"
|
||||||
wallpaperOverlay: "Lớp phủ hình nền"
|
|
||||||
badge: "Huy hiệu"
|
badge: "Huy hiệu"
|
||||||
messageBg: "Nền chat"
|
messageBg: "Nền chat"
|
||||||
accentDarken: "Màu phụ (Tối)"
|
|
||||||
accentLighten: "Màu phụ (Sáng)"
|
|
||||||
fgHighlighted: "Chữ nổi bật"
|
fgHighlighted: "Chữ nổi bật"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Tút"
|
note: "Tút"
|
||||||
|
|
|
@ -424,6 +424,7 @@ antennaExcludeBots: "排除机器人账户"
|
||||||
antennaKeywordsDescription: "AND 条件用空格分隔,OR 条件用换行符分隔。"
|
antennaKeywordsDescription: "AND 条件用空格分隔,OR 条件用换行符分隔。"
|
||||||
notifyAntenna: "开启通知"
|
notifyAntenna: "开启通知"
|
||||||
withFileAntenna: "仅带有附件的帖子"
|
withFileAntenna: "仅带有附件的帖子"
|
||||||
|
hideNotesInSensitiveChannel: "隐藏敏感频道内的帖子"
|
||||||
enableServiceworker: "启用 ServiceWorker"
|
enableServiceworker: "启用 ServiceWorker"
|
||||||
antennaUsersDescription: "指定用户名,一行一个"
|
antennaUsersDescription: "指定用户名,一行一个"
|
||||||
caseSensitive: "区分大小写"
|
caseSensitive: "区分大小写"
|
||||||
|
@ -1339,6 +1340,7 @@ compress: "压缩"
|
||||||
right: "右"
|
right: "右"
|
||||||
bottom: "下"
|
bottom: "下"
|
||||||
top: "上"
|
top: "上"
|
||||||
|
embed: "嵌入"
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "还没有消息"
|
noMessagesYet: "还没有消息"
|
||||||
newMessage: "新消息"
|
newMessage: "新消息"
|
||||||
|
@ -1885,6 +1887,8 @@ _role:
|
||||||
descriptionOfIsExplorable: "打开后将公开角色时间线。如果角色不是公开的,就无法公开时间线。"
|
descriptionOfIsExplorable: "打开后将公开角色时间线。如果角色不是公开的,就无法公开时间线。"
|
||||||
displayOrder: "显示顺序"
|
displayOrder: "显示顺序"
|
||||||
descriptionOfDisplayOrder: "数字越大,显示位置越靠前。"
|
descriptionOfDisplayOrder: "数字越大,显示位置越靠前。"
|
||||||
|
preserveAssignmentOnMoveAccount: "将分配状态继承到目标账户"
|
||||||
|
preserveAssignmentOnMoveAccount_description: "启用后,当迁移具有该角色的账户时,目标账户也会继承该角色。"
|
||||||
canEditMembersByModerator: "允许监察员编辑成员"
|
canEditMembersByModerator: "允许监察员编辑成员"
|
||||||
descriptionOfCanEditMembersByModerator: "如果选中,监察员和管理员都能够为用户分配/取消分配角色。如果未选中,则只有管理员可以执行此操作。"
|
descriptionOfCanEditMembersByModerator: "如果选中,监察员和管理员都能够为用户分配/取消分配角色。如果未选中,则只有管理员可以执行此操作。"
|
||||||
priority: "优先级"
|
priority: "优先级"
|
||||||
|
@ -2122,7 +2126,6 @@ _theme:
|
||||||
header: "顶栏"
|
header: "顶栏"
|
||||||
navBg: "侧边栏背景"
|
navBg: "侧边栏背景"
|
||||||
navFg: "侧栏文本"
|
navFg: "侧栏文本"
|
||||||
navHoverFg: "侧栏文本(悬停)"
|
|
||||||
navActive: "侧栏文本(活动)"
|
navActive: "侧栏文本(活动)"
|
||||||
navIndicator: "侧栏标记"
|
navIndicator: "侧栏标记"
|
||||||
link: "链接"
|
link: "链接"
|
||||||
|
@ -2145,11 +2148,8 @@ _theme:
|
||||||
buttonHoverBg: "按钮背景(悬停)"
|
buttonHoverBg: "按钮背景(悬停)"
|
||||||
inputBorder: "输入框边框"
|
inputBorder: "输入框边框"
|
||||||
driveFolderBg: "网盘的文件夹背景"
|
driveFolderBg: "网盘的文件夹背景"
|
||||||
wallpaperOverlay: "壁纸叠加层"
|
|
||||||
badge: "徽章"
|
badge: "徽章"
|
||||||
messageBg: "聊天背景"
|
messageBg: "聊天背景"
|
||||||
accentDarken: "强调色(深)"
|
|
||||||
accentLighten: "强调色(浅)"
|
|
||||||
fgHighlighted: "高亮显示文本"
|
fgHighlighted: "高亮显示文本"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "帖子"
|
note: "帖子"
|
||||||
|
|
|
@ -424,6 +424,7 @@ antennaExcludeBots: "排除機器人帳戶"
|
||||||
antennaKeywordsDescription: "空格代表「以及」(AND),換行代表「或者」(OR)"
|
antennaKeywordsDescription: "空格代表「以及」(AND),換行代表「或者」(OR)"
|
||||||
notifyAntenna: "通知有新貼文"
|
notifyAntenna: "通知有新貼文"
|
||||||
withFileAntenna: "僅帶有附件的貼文"
|
withFileAntenna: "僅帶有附件的貼文"
|
||||||
|
hideNotesInSensitiveChannel: "隱藏敏感頻道的貼文"
|
||||||
enableServiceworker: "啟用瀏覽器的推播通知"
|
enableServiceworker: "啟用瀏覽器的推播通知"
|
||||||
antennaUsersDescription: "填寫使用者名稱,以換行分隔"
|
antennaUsersDescription: "填寫使用者名稱,以換行分隔"
|
||||||
caseSensitive: "區分大小寫"
|
caseSensitive: "區分大小寫"
|
||||||
|
@ -1339,6 +1340,8 @@ compress: "壓縮"
|
||||||
right: "右"
|
right: "右"
|
||||||
bottom: "下"
|
bottom: "下"
|
||||||
top: "上"
|
top: "上"
|
||||||
|
embed: "嵌入"
|
||||||
|
settingsMigrating: "正在移轉設定。請稍候……(之後也可以到「設定 → 其他 → 舊設定資訊移轉」中手動進行移轉)"
|
||||||
_chat:
|
_chat:
|
||||||
noMessagesYet: "尚無訊息"
|
noMessagesYet: "尚無訊息"
|
||||||
newMessage: "新訊息"
|
newMessage: "新訊息"
|
||||||
|
@ -1413,6 +1416,7 @@ _settings:
|
||||||
showNavbarSubButtons: "在導覽列顯示輔助按鈕"
|
showNavbarSubButtons: "在導覽列顯示輔助按鈕"
|
||||||
ifOn: "開啟時"
|
ifOn: "開啟時"
|
||||||
ifOff: "關閉時"
|
ifOff: "關閉時"
|
||||||
|
enableSyncThemesBetweenDevices: "在裝置之間同步已安裝的主題"
|
||||||
_chat:
|
_chat:
|
||||||
showSenderName: "顯示發送者的名稱"
|
showSenderName: "顯示發送者的名稱"
|
||||||
sendOnEnter: "按下 Enter 發送訊息"
|
sendOnEnter: "按下 Enter 發送訊息"
|
||||||
|
@ -1885,6 +1889,8 @@ _role:
|
||||||
descriptionOfIsExplorable: "若開啟則公開角色時間軸。若角色不是公開的,則無法公開時間軸。"
|
descriptionOfIsExplorable: "若開啟則公開角色時間軸。若角色不是公開的,則無法公開時間軸。"
|
||||||
displayOrder: "顯示順序"
|
displayOrder: "顯示順序"
|
||||||
descriptionOfDisplayOrder: "數字越大,顯示在UI上的越上面。"
|
descriptionOfDisplayOrder: "數字越大,顯示在UI上的越上面。"
|
||||||
|
preserveAssignmentOnMoveAccount: "將指派狀態承接至轉移後的帳戶"
|
||||||
|
preserveAssignmentOnMoveAccount_description: "開啟此選項後,當具備此角色的帳戶被移轉時,該角色也會承接至轉移後的帳戶。"
|
||||||
canEditMembersByModerator: "允許編輯審查員的成員"
|
canEditMembersByModerator: "允許編輯審查員的成員"
|
||||||
descriptionOfCanEditMembersByModerator: "如果開啟,管理員與審查員都可以為使用者指派/解除指派該角色。如果關閉,則只有管理員可以執行。"
|
descriptionOfCanEditMembersByModerator: "如果開啟,管理員與審查員都可以為使用者指派/解除指派該角色。如果關閉,則只有管理員可以執行。"
|
||||||
priority: "優先級"
|
priority: "優先級"
|
||||||
|
@ -2122,7 +2128,6 @@ _theme:
|
||||||
header: "標題"
|
header: "標題"
|
||||||
navBg: "側邊欄的背景 "
|
navBg: "側邊欄的背景 "
|
||||||
navFg: "側邊欄的文字"
|
navFg: "側邊欄的文字"
|
||||||
navHoverFg: "側邊欄文字(懸浮) "
|
|
||||||
navActive: "側邊欄文字(活動)"
|
navActive: "側邊欄文字(活動)"
|
||||||
navIndicator: "側邊欄指示符"
|
navIndicator: "側邊欄指示符"
|
||||||
link: "連結"
|
link: "連結"
|
||||||
|
@ -2145,11 +2150,8 @@ _theme:
|
||||||
buttonHoverBg: "按鈕背景 (漂浮)"
|
buttonHoverBg: "按鈕背景 (漂浮)"
|
||||||
inputBorder: "輸入框邊框"
|
inputBorder: "輸入框邊框"
|
||||||
driveFolderBg: "雲端硬碟文件夾背景"
|
driveFolderBg: "雲端硬碟文件夾背景"
|
||||||
wallpaperOverlay: "壁紙覆蓋層"
|
|
||||||
badge: "徽章"
|
badge: "徽章"
|
||||||
messageBg: "私訊背景"
|
messageBg: "私訊背景"
|
||||||
accentDarken: "強調色(黑暗)"
|
|
||||||
accentLighten: "強調色(明亮)"
|
|
||||||
fgHighlighted: "突顯文字"
|
fgHighlighted: "突顯文字"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "貼文"
|
note: "貼文"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "2025.4.0-beta.1",
|
"version": "2025.4.0-rc.3",
|
||||||
"codename": "nasubi",
|
"codename": "nasubi",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -24,7 +24,6 @@
|
||||||
"build": "pnpm build-pre && pnpm -r build && pnpm build-assets",
|
"build": "pnpm build-pre && pnpm -r build && pnpm build-assets",
|
||||||
"build-storybook": "pnpm --filter frontend build-storybook",
|
"build-storybook": "pnpm --filter frontend build-storybook",
|
||||||
"build-misskey-js-with-types": "pnpm build-pre && pnpm --filter backend... --filter=!misskey-js build && pnpm --filter backend generate-api-json --no-build && ncp packages/backend/built/api.json packages/misskey-js/generator/api.json && pnpm --filter misskey-js update-autogen-code && pnpm --filter misskey-js build && pnpm --filter misskey-js api",
|
"build-misskey-js-with-types": "pnpm build-pre && pnpm --filter backend... --filter=!misskey-js build && pnpm --filter backend generate-api-json --no-build && ncp packages/backend/built/api.json packages/misskey-js/generator/api.json && pnpm --filter misskey-js update-autogen-code && pnpm --filter misskey-js build && pnpm --filter misskey-js api",
|
||||||
"build-frontend-search-index": "pnpm --filter frontend build-search-index",
|
|
||||||
"start": "pnpm check:connect && cd packages/backend && node ./built/boot/entry.js",
|
"start": "pnpm check:connect && cd packages/backend && node ./built/boot/entry.js",
|
||||||
"start:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js",
|
"start:test": "ncp ./.github/misskey/test.yml ./.config/test.yml && cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js",
|
||||||
"init": "pnpm migrate",
|
"init": "pnpm migrate",
|
||||||
|
@ -85,7 +84,8 @@
|
||||||
"@aiscript-dev/aiscript-languageserver": "-"
|
"@aiscript-dev/aiscript-languageserver": "-"
|
||||||
},
|
},
|
||||||
"patchedDependencies": {
|
"patchedDependencies": {
|
||||||
"re2": "scripts/dependency-patches/re2.patch"
|
"re2": "scripts/dependency-patches/re2.patch",
|
||||||
|
"vite": "scripts/dependency-patches/vite.patch"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class AddAntennaHideNotesInSensitiveChannel1736230492103 {
|
||||||
|
name = 'AddAntennaHideNotesInSensitiveChannel1736230492103'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "antenna" ADD "hideNotesInSensitiveChannel" boolean NOT NULL DEFAULT false`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "hideNotesInSensitiveChannel"`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class RoleCopyOnMoveAccount1743558299182 {
|
||||||
|
name = 'RoleCopyOnMoveAccount1743558299182'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "role" ADD "preserveAssignmentOnMoveAccount" boolean NOT NULL DEFAULT false`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "role" DROP COLUMN "preserveAssignmentOnMoveAccount"`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -187,6 +187,7 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@jest/globals": "29.7.0",
|
"@jest/globals": "29.7.0",
|
||||||
"@nestjs/platform-express": "10.4.15",
|
"@nestjs/platform-express": "10.4.15",
|
||||||
|
"@sentry/vue": "9.8.0",
|
||||||
"@simplewebauthn/types": "12.0.0",
|
"@simplewebauthn/types": "12.0.0",
|
||||||
"@swc/jest": "0.2.37",
|
"@swc/jest": "0.2.37",
|
||||||
"@types/accepts": "1.3.7",
|
"@types/accepts": "1.3.7",
|
||||||
|
|
|
@ -7,7 +7,8 @@ import * as fs from 'node:fs';
|
||||||
import { fileURLToPath } from 'node:url';
|
import { fileURLToPath } from 'node:url';
|
||||||
import { dirname, resolve } from 'node:path';
|
import { dirname, resolve } from 'node:path';
|
||||||
import * as yaml from 'js-yaml';
|
import * as yaml from 'js-yaml';
|
||||||
import * as Sentry from '@sentry/node';
|
import type * as Sentry from '@sentry/node';
|
||||||
|
import type * as SentryVue from '@sentry/vue';
|
||||||
import type { RedisOptions } from 'ioredis';
|
import type { RedisOptions } from 'ioredis';
|
||||||
|
|
||||||
type RedisOptionsSource = Partial<RedisOptions> & {
|
type RedisOptionsSource = Partial<RedisOptions> & {
|
||||||
|
@ -62,7 +63,12 @@ type Source = {
|
||||||
scope?: 'local' | 'global' | string[];
|
scope?: 'local' | 'global' | string[];
|
||||||
};
|
};
|
||||||
sentryForBackend?: { options: Partial<Sentry.NodeOptions>; enableNodeProfiling: boolean; };
|
sentryForBackend?: { options: Partial<Sentry.NodeOptions>; enableNodeProfiling: boolean; };
|
||||||
sentryForFrontend?: { options: Partial<Sentry.NodeOptions> };
|
sentryForFrontend?: {
|
||||||
|
options: Partial<SentryVue.BrowserOptions> & { dsn: string };
|
||||||
|
vueIntegration?: SentryVue.VueIntegrationOptions | null;
|
||||||
|
browserTracingIntegration?: Parameters<typeof SentryVue.browserTracingIntegration>[0] | null;
|
||||||
|
replayIntegration?: Parameters<typeof SentryVue.replayIntegration>[0] | null;
|
||||||
|
};
|
||||||
|
|
||||||
publishTarballInsteadOfProvideRepositoryUrl?: boolean;
|
publishTarballInsteadOfProvideRepositoryUrl?: boolean;
|
||||||
|
|
||||||
|
@ -198,7 +204,12 @@ export type Config = {
|
||||||
redisForTimelines: RedisOptions & RedisOptionsSource;
|
redisForTimelines: RedisOptions & RedisOptionsSource;
|
||||||
redisForReactions: RedisOptions & RedisOptionsSource;
|
redisForReactions: RedisOptions & RedisOptionsSource;
|
||||||
sentryForBackend: { options: Partial<Sentry.NodeOptions>; enableNodeProfiling: boolean; } | undefined;
|
sentryForBackend: { options: Partial<Sentry.NodeOptions>; enableNodeProfiling: boolean; } | undefined;
|
||||||
sentryForFrontend: { options: Partial<Sentry.NodeOptions> } | undefined;
|
sentryForFrontend: {
|
||||||
|
options: Partial<SentryVue.BrowserOptions> & { dsn: string };
|
||||||
|
vueIntegration?: SentryVue.VueIntegrationOptions | null;
|
||||||
|
browserTracingIntegration?: Parameters<typeof SentryVue.browserTracingIntegration>[0] | null;
|
||||||
|
replayIntegration?: Parameters<typeof SentryVue.replayIntegration>[0] | null;
|
||||||
|
} | undefined;
|
||||||
perChannelMaxNoteCacheCount: number;
|
perChannelMaxNoteCacheCount: number;
|
||||||
perUserNotificationsMaxCount: number;
|
perUserNotificationsMaxCount: number;
|
||||||
deactivateAntennaThreshold: number;
|
deactivateAntennaThreshold: number;
|
||||||
|
|
|
@ -24,6 +24,7 @@ import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
|
||||||
import InstanceChart from '@/core/chart/charts/instance.js';
|
import InstanceChart from '@/core/chart/charts/instance.js';
|
||||||
import PerUserFollowingChart from '@/core/chart/charts/per-user-following.js';
|
import PerUserFollowingChart from '@/core/chart/charts/per-user-following.js';
|
||||||
import { SystemAccountService } from '@/core/SystemAccountService.js';
|
import { SystemAccountService } from '@/core/SystemAccountService.js';
|
||||||
|
import { RoleService } from '@/core/RoleService.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AccountMoveService {
|
export class AccountMoveService {
|
||||||
|
@ -61,6 +62,7 @@ export class AccountMoveService {
|
||||||
private relayService: RelayService,
|
private relayService: RelayService,
|
||||||
private queueService: QueueService,
|
private queueService: QueueService,
|
||||||
private systemAccountService: SystemAccountService,
|
private systemAccountService: SystemAccountService,
|
||||||
|
private roleService: RoleService,
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,6 +121,7 @@ export class AccountMoveService {
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
this.copyBlocking(src, dst),
|
this.copyBlocking(src, dst),
|
||||||
this.copyMutings(src, dst),
|
this.copyMutings(src, dst),
|
||||||
|
this.copyRoles(src, dst),
|
||||||
this.updateLists(src, dst),
|
this.updateLists(src, dst),
|
||||||
]);
|
]);
|
||||||
} catch {
|
} catch {
|
||||||
|
@ -201,6 +204,32 @@ export class AccountMoveService {
|
||||||
await this.mutingsRepository.insert(arrayToInsert);
|
await this.mutingsRepository.insert(arrayToInsert);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async copyRoles(src: ThinUser, dst: ThinUser): Promise<void> {
|
||||||
|
// Insert new roles with the same values except userId
|
||||||
|
// role service may have cache for roles so retrieve roles from service
|
||||||
|
const [oldRoleAssignments, roles] = await Promise.all([
|
||||||
|
this.roleService.getUserAssigns(src.id),
|
||||||
|
this.roleService.getRoles(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (oldRoleAssignments.length === 0) return;
|
||||||
|
|
||||||
|
// No promise all since the only async operation is writing to the database
|
||||||
|
for (const oldRoleAssignment of oldRoleAssignments) {
|
||||||
|
const role = roles.find(x => x.id === oldRoleAssignment.roleId);
|
||||||
|
if (role == null) continue; // Very unlikely however removing role may cause this case
|
||||||
|
if (!role.preserveAssignmentOnMoveAccount) continue;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await this.roleService.assign(dst.id, role.id, oldRoleAssignment.expiresAt);
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof RoleService.AlreadyAssignedError) continue;
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update lists while moving accounts.
|
* Update lists while moving accounts.
|
||||||
* - No removal of the old account from the lists
|
* - No removal of the old account from the lists
|
||||||
|
|
|
@ -114,6 +114,8 @@ export class AntennaService implements OnApplicationShutdown {
|
||||||
if (note.visibility === 'specified') return false;
|
if (note.visibility === 'specified') return false;
|
||||||
if (note.visibility === 'followers') return false;
|
if (note.visibility === 'followers') return false;
|
||||||
|
|
||||||
|
if (antenna.hideNotesInSensitiveChannel && note.channel?.isSensitive) return false;
|
||||||
|
|
||||||
if (antenna.excludeBots && noteUser.isBot) return false;
|
if (antenna.excludeBots && noteUser.isBot) return false;
|
||||||
|
|
||||||
if (antenna.localOnly && noteUser.host != null) return false;
|
if (antenna.localOnly && noteUser.host != null) return false;
|
||||||
|
|
|
@ -94,12 +94,46 @@ export class ChatService {
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async getChatAvailability(userId: MiUser['id']): Promise<{ read: boolean; write: boolean; }> {
|
||||||
|
const policies = await this.roleService.getUserPolicies(userId);
|
||||||
|
|
||||||
|
switch (policies.chatAvailability) {
|
||||||
|
case 'available':
|
||||||
|
return {
|
||||||
|
read: true,
|
||||||
|
write: true,
|
||||||
|
};
|
||||||
|
case 'readonly':
|
||||||
|
return {
|
||||||
|
read: true,
|
||||||
|
write: false,
|
||||||
|
};
|
||||||
|
case 'unavailable':
|
||||||
|
return {
|
||||||
|
read: false,
|
||||||
|
write: false,
|
||||||
|
};
|
||||||
|
default:
|
||||||
|
throw new Error('invalid chat availability (unreachable)');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** getChatAvailabilityの糖衣。主にAPI呼び出し時に走らせて、権限的に問題ない場合はそのまま続行する */
|
||||||
|
@bindThis
|
||||||
|
public async checkChatAvailability(userId: MiUser['id'], permission: 'read' | 'write') {
|
||||||
|
const policy = await this.getChatAvailability(userId);
|
||||||
|
if (policy[permission] === false) {
|
||||||
|
throw new Error('ROLE_PERMISSION_DENIED');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async createMessageToUser(fromUser: { id: MiUser['id']; host: MiUser['host']; }, toUser: MiUser, params: {
|
public async createMessageToUser(fromUser: { id: MiUser['id']; host: MiUser['host']; }, toUser: MiUser, params: {
|
||||||
text?: string | null;
|
text?: string | null;
|
||||||
file?: MiDriveFile | null;
|
file?: MiDriveFile | null;
|
||||||
uri?: string | null;
|
uri?: string | null;
|
||||||
}): Promise<Packed<'ChatMessageLite'>> {
|
}): Promise<Packed<'ChatMessageLiteFor1on1'>> {
|
||||||
if (fromUser.id === toUser.id) {
|
if (fromUser.id === toUser.id) {
|
||||||
throw new Error('yourself');
|
throw new Error('yourself');
|
||||||
}
|
}
|
||||||
|
@ -140,7 +174,7 @@ export class ChatService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(await this.roleService.getUserPolicies(toUser.id)).canChat) {
|
if (!(await this.getChatAvailability(toUser.id)).write) {
|
||||||
throw new Error('recipient is cannot chat (policy)');
|
throw new Error('recipient is cannot chat (policy)');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,10 +244,16 @@ export class ChatService {
|
||||||
text?: string | null;
|
text?: string | null;
|
||||||
file?: MiDriveFile | null;
|
file?: MiDriveFile | null;
|
||||||
uri?: string | null;
|
uri?: string | null;
|
||||||
}): Promise<Packed<'ChatMessageLite'>> {
|
}): Promise<Packed<'ChatMessageLiteForRoom'>> {
|
||||||
const memberships = await this.chatRoomMembershipsRepository.findBy({ roomId: toRoom.id });
|
const memberships = (await this.chatRoomMembershipsRepository.findBy({ roomId: toRoom.id })).map(m => ({
|
||||||
|
userId: m.userId,
|
||||||
|
isMuted: m.isMuted,
|
||||||
|
})).concat({ // ownerはmembershipレコードを作らないため
|
||||||
|
userId: toRoom.ownerId,
|
||||||
|
isMuted: false,
|
||||||
|
});
|
||||||
|
|
||||||
if (toRoom.ownerId !== fromUser.id && !memberships.some(member => member.userId === fromUser.id)) {
|
if (!memberships.some(member => member.userId === fromUser.id)) {
|
||||||
throw new Error('you are not a member of the room');
|
throw new Error('you are not a member of the room');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -532,7 +532,10 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||||
|
|
||||||
this.pushToTl(note, user);
|
this.pushToTl(note, user);
|
||||||
|
|
||||||
this.antennaService.addNoteToAntennas(note, user);
|
this.antennaService.addNoteToAntennas({
|
||||||
|
...note,
|
||||||
|
channel: data.channel ?? null,
|
||||||
|
}, user);
|
||||||
|
|
||||||
if (data.reply) {
|
if (data.reply) {
|
||||||
this.saveReply(data.reply, note);
|
this.saveReply(data.reply, note);
|
||||||
|
|
|
@ -63,7 +63,7 @@ export type RolePolicies = {
|
||||||
canImportFollowing: boolean;
|
canImportFollowing: boolean;
|
||||||
canImportMuting: boolean;
|
canImportMuting: boolean;
|
||||||
canImportUserLists: boolean;
|
canImportUserLists: boolean;
|
||||||
canChat: boolean;
|
chatAvailability: 'available' | 'readonly' | 'unavailable';
|
||||||
};
|
};
|
||||||
|
|
||||||
export const DEFAULT_POLICIES: RolePolicies = {
|
export const DEFAULT_POLICIES: RolePolicies = {
|
||||||
|
@ -98,7 +98,7 @@ export const DEFAULT_POLICIES: RolePolicies = {
|
||||||
canImportFollowing: true,
|
canImportFollowing: true,
|
||||||
canImportMuting: true,
|
canImportMuting: true,
|
||||||
canImportUserLists: true,
|
canImportUserLists: true,
|
||||||
canChat: true,
|
chatAvailability: 'available',
|
||||||
};
|
};
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -370,6 +370,12 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
|
||||||
return aggregate(policies.map(policy => policy.useDefault ? basePolicies[name] : policy.value));
|
return aggregate(policies.map(policy => policy.useDefault ? basePolicies[name] : policy.value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function aggregateChatAvailability(vs: RolePolicies['chatAvailability'][]) {
|
||||||
|
if (vs.some(v => v === 'available')) return 'available';
|
||||||
|
if (vs.some(v => v === 'readonly')) return 'readonly';
|
||||||
|
return 'unavailable';
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
gtlAvailable: calc('gtlAvailable', vs => vs.some(v => v === true)),
|
gtlAvailable: calc('gtlAvailable', vs => vs.some(v => v === true)),
|
||||||
ltlAvailable: calc('ltlAvailable', vs => vs.some(v => v === true)),
|
ltlAvailable: calc('ltlAvailable', vs => vs.some(v => v === true)),
|
||||||
|
@ -402,7 +408,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
|
||||||
canImportFollowing: calc('canImportFollowing', vs => vs.some(v => v === true)),
|
canImportFollowing: calc('canImportFollowing', vs => vs.some(v => v === true)),
|
||||||
canImportMuting: calc('canImportMuting', vs => vs.some(v => v === true)),
|
canImportMuting: calc('canImportMuting', vs => vs.some(v => v === true)),
|
||||||
canImportUserLists: calc('canImportUserLists', vs => vs.some(v => v === true)),
|
canImportUserLists: calc('canImportUserLists', vs => vs.some(v => v === true)),
|
||||||
canChat: calc('canChat', vs => vs.some(v => v === true)),
|
chatAvailability: calc('chatAvailability', aggregateChatAvailability),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -630,6 +636,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
|
||||||
isModerator: values.isModerator,
|
isModerator: values.isModerator,
|
||||||
isExplorable: values.isExplorable,
|
isExplorable: values.isExplorable,
|
||||||
asBadge: values.asBadge,
|
asBadge: values.asBadge,
|
||||||
|
preserveAssignmentOnMoveAccount: values.preserveAssignmentOnMoveAccount,
|
||||||
canEditMembersByModerator: values.canEditMembersByModerator,
|
canEditMembersByModerator: values.canEditMembersByModerator,
|
||||||
displayOrder: values.displayOrder,
|
displayOrder: values.displayOrder,
|
||||||
policies: values.policies,
|
policies: values.policies,
|
||||||
|
|
|
@ -41,6 +41,7 @@ export class AntennaEntityService {
|
||||||
excludeBots: antenna.excludeBots,
|
excludeBots: antenna.excludeBots,
|
||||||
withReplies: antenna.withReplies,
|
withReplies: antenna.withReplies,
|
||||||
withFile: antenna.withFile,
|
withFile: antenna.withFile,
|
||||||
|
hideNotesInSensitiveChannel: antenna.hideNotesInSensitiveChannel,
|
||||||
isActive: antenna.isActive,
|
isActive: antenna.isActive,
|
||||||
hasUnreadNote: false, // TODO
|
hasUnreadNote: false, // TODO
|
||||||
notify: false, // 後方互換性のため
|
notify: false, // 後方互換性のため
|
||||||
|
|
|
@ -128,7 +128,7 @@ export class ChatEntityService {
|
||||||
packedFiles: Map<MiChatMessage['fileId'], Packed<'DriveFile'> | null>;
|
packedFiles: Map<MiChatMessage['fileId'], Packed<'DriveFile'> | null>;
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
): Promise<Packed<'ChatMessageLite'>> {
|
): Promise<Packed<'ChatMessageLiteFor1on1'>> {
|
||||||
const packedFiles = options?._hint_?.packedFiles;
|
const packedFiles = options?._hint_?.packedFiles;
|
||||||
|
|
||||||
const message = typeof src === 'object' ? src : await this.chatMessagesRepository.findOneByOrFail({ id: src });
|
const message = typeof src === 'object' ? src : await this.chatMessagesRepository.findOneByOrFail({ id: src });
|
||||||
|
@ -147,7 +147,7 @@ export class ChatEntityService {
|
||||||
createdAt: this.idService.parse(message.id).date.toISOString(),
|
createdAt: this.idService.parse(message.id).date.toISOString(),
|
||||||
text: message.text,
|
text: message.text,
|
||||||
fromUserId: message.fromUserId,
|
fromUserId: message.fromUserId,
|
||||||
toUserId: message.toUserId,
|
toUserId: message.toUserId!,
|
||||||
fileId: message.fileId,
|
fileId: message.fileId,
|
||||||
file: message.fileId ? (packedFiles?.get(message.fileId) ?? await this.driveFileEntityService.pack(message.file ?? message.fileId)) : null,
|
file: message.fileId ? (packedFiles?.get(message.fileId) ?? await this.driveFileEntityService.pack(message.file ?? message.fileId)) : null,
|
||||||
reactions,
|
reactions,
|
||||||
|
@ -177,7 +177,7 @@ export class ChatEntityService {
|
||||||
packedUsers: Map<MiUser['id'], Packed<'UserLite'>>;
|
packedUsers: Map<MiUser['id'], Packed<'UserLite'>>;
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
): Promise<Packed<'ChatMessageLite'>> {
|
): Promise<Packed<'ChatMessageLiteForRoom'>> {
|
||||||
const packedFiles = options?._hint_?.packedFiles;
|
const packedFiles = options?._hint_?.packedFiles;
|
||||||
const packedUsers = options?._hint_?.packedUsers;
|
const packedUsers = options?._hint_?.packedUsers;
|
||||||
|
|
||||||
|
@ -199,7 +199,7 @@ export class ChatEntityService {
|
||||||
text: message.text,
|
text: message.text,
|
||||||
fromUserId: message.fromUserId,
|
fromUserId: message.fromUserId,
|
||||||
fromUser: packedUsers?.get(message.fromUserId) ?? await this.userEntityService.pack(message.fromUser ?? message.fromUserId),
|
fromUser: packedUsers?.get(message.fromUserId) ?? await this.userEntityService.pack(message.fromUser ?? message.fromUserId),
|
||||||
toRoomId: message.toRoomId,
|
toRoomId: message.toRoomId!,
|
||||||
fileId: message.fileId,
|
fileId: message.fileId,
|
||||||
file: message.fileId ? (packedFiles?.get(message.fileId) ?? await this.driveFileEntityService.pack(message.file ?? message.fileId)) : null,
|
file: message.fileId ? (packedFiles?.get(message.fileId) ?? await this.driveFileEntityService.pack(message.file ?? message.fileId)) : null,
|
||||||
reactions,
|
reactions,
|
||||||
|
|
|
@ -127,6 +127,7 @@ export class MetaEntityService {
|
||||||
|
|
||||||
policies: { ...DEFAULT_POLICIES, ...instance.policies },
|
policies: { ...DEFAULT_POLICIES, ...instance.policies },
|
||||||
|
|
||||||
|
sentryForFrontend: this.config.sentryForFrontend ?? null,
|
||||||
mediaProxy: this.config.mediaProxy,
|
mediaProxy: this.config.mediaProxy,
|
||||||
enableUrlPreview: instance.urlPreviewEnabled,
|
enableUrlPreview: instance.urlPreviewEnabled,
|
||||||
noteSearchableScope: (this.config.meilisearch == null || this.config.meilisearch.scope !== 'local') ? 'global' : 'local',
|
noteSearchableScope: (this.config.meilisearch == null || this.config.meilisearch.scope !== 'local') ? 'global' : 'local',
|
||||||
|
|
|
@ -13,6 +13,7 @@ import type { MiRole } from '@/models/Role.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { DEFAULT_POLICIES } from '@/core/RoleService.js';
|
import { DEFAULT_POLICIES } from '@/core/RoleService.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
|
import { Packed } from '@/misc/json-schema.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class RoleEntityService {
|
export class RoleEntityService {
|
||||||
|
@ -31,7 +32,7 @@ export class RoleEntityService {
|
||||||
public async pack(
|
public async pack(
|
||||||
src: MiRole['id'] | MiRole,
|
src: MiRole['id'] | MiRole,
|
||||||
me?: { id: MiUser['id'] } | null | undefined,
|
me?: { id: MiUser['id'] } | null | undefined,
|
||||||
) {
|
): Promise<Packed<'Role'>> {
|
||||||
const role = typeof src === 'object' ? src : await this.rolesRepository.findOneByOrFail({ id: src });
|
const role = typeof src === 'object' ? src : await this.rolesRepository.findOneByOrFail({ id: src });
|
||||||
|
|
||||||
const assignedCount = await this.roleAssignmentsRepository.createQueryBuilder('assign')
|
const assignedCount = await this.roleAssignmentsRepository.createQueryBuilder('assign')
|
||||||
|
@ -67,6 +68,7 @@ export class RoleEntityService {
|
||||||
isModerator: role.isModerator,
|
isModerator: role.isModerator,
|
||||||
isExplorable: role.isExplorable,
|
isExplorable: role.isExplorable,
|
||||||
asBadge: role.asBadge,
|
asBadge: role.asBadge,
|
||||||
|
preserveAssignmentOnMoveAccount: role.preserveAssignmentOnMoveAccount,
|
||||||
canEditMembersByModerator: role.canEditMembersByModerator,
|
canEditMembersByModerator: role.canEditMembersByModerator,
|
||||||
displayOrder: role.displayOrder,
|
displayOrder: role.displayOrder,
|
||||||
policies: policies,
|
policies: policies,
|
||||||
|
|
|
@ -557,7 +557,7 @@ export class UserEntityService implements OnModuleInit {
|
||||||
followersVisibility: profile!.followersVisibility,
|
followersVisibility: profile!.followersVisibility,
|
||||||
followingVisibility: profile!.followingVisibility,
|
followingVisibility: profile!.followingVisibility,
|
||||||
chatScope: user.chatScope,
|
chatScope: user.chatScope,
|
||||||
canChat: this.roleService.getUserPolicies(user.id).then(r => r.canChat),
|
canChat: this.roleService.getUserPolicies(user.id).then(r => r.chatAvailability === 'available'),
|
||||||
roles: this.roleService.getUserRoles(user.id).then(roles => roles.filter(role => role.isPublic).sort((a, b) => b.displayOrder - a.displayOrder).map(role => ({
|
roles: this.roleService.getUserRoles(user.id).then(roles => roles.filter(role => role.isPublic).sort((a, b) => b.displayOrder - a.displayOrder).map(role => ({
|
||||||
id: role.id,
|
id: role.id,
|
||||||
name: role.name,
|
name: role.name,
|
||||||
|
|
|
@ -63,7 +63,7 @@ import {
|
||||||
} from '@/models/json-schema/meta.js';
|
} from '@/models/json-schema/meta.js';
|
||||||
import { packedSystemWebhookSchema } from '@/models/json-schema/system-webhook.js';
|
import { packedSystemWebhookSchema } from '@/models/json-schema/system-webhook.js';
|
||||||
import { packedAbuseReportNotificationRecipientSchema } from '@/models/json-schema/abuse-report-notification-recipient.js';
|
import { packedAbuseReportNotificationRecipientSchema } from '@/models/json-schema/abuse-report-notification-recipient.js';
|
||||||
import { packedChatMessageSchema, packedChatMessageLiteSchema } from '@/models/json-schema/chat-message.js';
|
import { packedChatMessageSchema, packedChatMessageLiteSchema, packedChatMessageLiteForRoomSchema, packedChatMessageLiteFor1on1Schema } from '@/models/json-schema/chat-message.js';
|
||||||
import { packedChatRoomSchema } from '@/models/json-schema/chat-room.js';
|
import { packedChatRoomSchema } from '@/models/json-schema/chat-room.js';
|
||||||
import { packedChatRoomInvitationSchema } from '@/models/json-schema/chat-room-invitation.js';
|
import { packedChatRoomInvitationSchema } from '@/models/json-schema/chat-room-invitation.js';
|
||||||
import { packedChatRoomMembershipSchema } from '@/models/json-schema/chat-room-membership.js';
|
import { packedChatRoomMembershipSchema } from '@/models/json-schema/chat-room-membership.js';
|
||||||
|
@ -126,6 +126,8 @@ export const refs = {
|
||||||
AbuseReportNotificationRecipient: packedAbuseReportNotificationRecipientSchema,
|
AbuseReportNotificationRecipient: packedAbuseReportNotificationRecipientSchema,
|
||||||
ChatMessage: packedChatMessageSchema,
|
ChatMessage: packedChatMessageSchema,
|
||||||
ChatMessageLite: packedChatMessageLiteSchema,
|
ChatMessageLite: packedChatMessageLiteSchema,
|
||||||
|
ChatMessageLiteFor1on1: packedChatMessageLiteFor1on1Schema,
|
||||||
|
ChatMessageLiteForRoom: packedChatMessageLiteForRoomSchema,
|
||||||
ChatRoom: packedChatRoomSchema,
|
ChatRoom: packedChatRoomSchema,
|
||||||
ChatRoomInvitation: packedChatRoomInvitationSchema,
|
ChatRoomInvitation: packedChatRoomInvitationSchema,
|
||||||
ChatRoomMembership: packedChatRoomMembershipSchema,
|
ChatRoomMembership: packedChatRoomMembershipSchema,
|
||||||
|
|
|
@ -100,4 +100,9 @@ export class MiAntenna {
|
||||||
default: false,
|
default: false,
|
||||||
})
|
})
|
||||||
public localOnly: boolean;
|
public localOnly: boolean;
|
||||||
|
|
||||||
|
@Column('boolean', {
|
||||||
|
default: false,
|
||||||
|
})
|
||||||
|
public hideNotesInSensitiveChannel: boolean;
|
||||||
}
|
}
|
||||||
|
|
|
@ -248,6 +248,11 @@ export class MiRole {
|
||||||
})
|
})
|
||||||
public isExplorable: boolean;
|
public isExplorable: boolean;
|
||||||
|
|
||||||
|
@Column('boolean', {
|
||||||
|
default: false,
|
||||||
|
})
|
||||||
|
public preserveAssignmentOnMoveAccount: boolean;
|
||||||
|
|
||||||
@Column('boolean', {
|
@Column('boolean', {
|
||||||
default: false,
|
default: false,
|
||||||
})
|
})
|
||||||
|
|
|
@ -100,5 +100,10 @@ export const packedAntennaSchema = {
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
hideNotesInSensitiveChannel: {
|
||||||
|
type: 'boolean',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -72,7 +72,7 @@ export const packedChatMessageSchema = {
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
optional: true, nullable: true,
|
optional: false, nullable: false,
|
||||||
ref: 'UserLite',
|
ref: 'UserLite',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -144,3 +144,113 @@ export const packedChatMessageLiteSchema = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
|
export const packedChatMessageLiteFor1on1Schema = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
createdAt: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'date-time',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
fromUserId: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
toUserId: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
type: 'string',
|
||||||
|
optional: true, nullable: true,
|
||||||
|
},
|
||||||
|
fileId: {
|
||||||
|
type: 'string',
|
||||||
|
optional: true, nullable: true,
|
||||||
|
},
|
||||||
|
file: {
|
||||||
|
type: 'object',
|
||||||
|
optional: true, nullable: true,
|
||||||
|
ref: 'DriveFile',
|
||||||
|
},
|
||||||
|
reactions: {
|
||||||
|
type: 'array',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
properties: {
|
||||||
|
reaction: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const packedChatMessageLiteForRoomSchema = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
createdAt: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'date-time',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
fromUserId: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
fromUser: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
ref: 'UserLite',
|
||||||
|
},
|
||||||
|
toRoomId: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
type: 'string',
|
||||||
|
optional: true, nullable: true,
|
||||||
|
},
|
||||||
|
fileId: {
|
||||||
|
type: 'string',
|
||||||
|
optional: true, nullable: true,
|
||||||
|
},
|
||||||
|
file: {
|
||||||
|
type: 'object',
|
||||||
|
optional: true, nullable: true,
|
||||||
|
ref: 'DriveFile',
|
||||||
|
},
|
||||||
|
reactions: {
|
||||||
|
type: 'array',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
properties: {
|
||||||
|
reaction: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
user: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
ref: 'UserLite',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
|
@ -211,6 +211,38 @@ export const packedMetaLiteSchema = {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
},
|
},
|
||||||
|
sentryForFrontend: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: true,
|
||||||
|
properties: {
|
||||||
|
options: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
properties: {
|
||||||
|
dsn: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
additionalProperties: true,
|
||||||
|
},
|
||||||
|
vueIntegration: {
|
||||||
|
type: 'object',
|
||||||
|
optional: true, nullable: true,
|
||||||
|
additionalProperties: true,
|
||||||
|
},
|
||||||
|
browserTracingIntegration: {
|
||||||
|
type: 'object',
|
||||||
|
optional: true, nullable: true,
|
||||||
|
additionalProperties: true,
|
||||||
|
},
|
||||||
|
replayIntegration: {
|
||||||
|
type: 'object',
|
||||||
|
optional: true, nullable: true,
|
||||||
|
additionalProperties: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
mediaProxy: {
|
mediaProxy: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
|
@ -292,9 +292,10 @@ export const packedRolePoliciesSchema = {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
},
|
},
|
||||||
canChat: {
|
chatAvailability: {
|
||||||
type: 'boolean',
|
type: 'string',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
enum: ['available', 'readonly', 'unavailable'],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
@ -389,6 +390,11 @@ export const packedRoleSchema = {
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
example: false,
|
example: false,
|
||||||
},
|
},
|
||||||
|
preserveAssignmentOnMoveAccount: {
|
||||||
|
type: 'boolean',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
example: false,
|
||||||
|
},
|
||||||
canEditMembersByModerator: {
|
canEditMembersByModerator: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
|
@ -36,6 +36,7 @@ export const paramDef = {
|
||||||
isAdministrator: { type: 'boolean' },
|
isAdministrator: { type: 'boolean' },
|
||||||
isExplorable: { type: 'boolean', default: false }, // optional for backward compatibility
|
isExplorable: { type: 'boolean', default: false }, // optional for backward compatibility
|
||||||
asBadge: { type: 'boolean' },
|
asBadge: { type: 'boolean' },
|
||||||
|
preserveAssignmentOnMoveAccount: { type: 'boolean' },
|
||||||
canEditMembersByModerator: { type: 'boolean' },
|
canEditMembersByModerator: { type: 'boolean' },
|
||||||
displayOrder: { type: 'number' },
|
displayOrder: { type: 'number' },
|
||||||
policies: {
|
policies: {
|
||||||
|
|
|
@ -41,6 +41,7 @@ export const paramDef = {
|
||||||
isAdministrator: { type: 'boolean' },
|
isAdministrator: { type: 'boolean' },
|
||||||
isExplorable: { type: 'boolean' },
|
isExplorable: { type: 'boolean' },
|
||||||
asBadge: { type: 'boolean' },
|
asBadge: { type: 'boolean' },
|
||||||
|
preserveAssignmentOnMoveAccount: { type: 'boolean' },
|
||||||
canEditMembersByModerator: { type: 'boolean' },
|
canEditMembersByModerator: { type: 'boolean' },
|
||||||
displayOrder: { type: 'number' },
|
displayOrder: { type: 'number' },
|
||||||
policies: {
|
policies: {
|
||||||
|
@ -78,6 +79,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
isAdministrator: ps.isAdministrator,
|
isAdministrator: ps.isAdministrator,
|
||||||
isExplorable: ps.isExplorable,
|
isExplorable: ps.isExplorable,
|
||||||
asBadge: ps.asBadge,
|
asBadge: ps.asBadge,
|
||||||
|
preserveAssignmentOnMoveAccount: ps.preserveAssignmentOnMoveAccount,
|
||||||
canEditMembersByModerator: ps.canEditMembersByModerator,
|
canEditMembersByModerator: ps.canEditMembersByModerator,
|
||||||
displayOrder: ps.displayOrder,
|
displayOrder: ps.displayOrder,
|
||||||
policies: ps.policies,
|
policies: ps.policies,
|
||||||
|
|
|
@ -73,6 +73,7 @@ export const paramDef = {
|
||||||
excludeBots: { type: 'boolean' },
|
excludeBots: { type: 'boolean' },
|
||||||
withReplies: { type: 'boolean' },
|
withReplies: { type: 'boolean' },
|
||||||
withFile: { type: 'boolean' },
|
withFile: { type: 'boolean' },
|
||||||
|
hideNotesInSensitiveChannel: { type: 'boolean' },
|
||||||
},
|
},
|
||||||
required: ['name', 'src', 'keywords', 'excludeKeywords', 'users', 'caseSensitive', 'withReplies', 'withFile'],
|
required: ['name', 'src', 'keywords', 'excludeKeywords', 'users', 'caseSensitive', 'withReplies', 'withFile'],
|
||||||
} as const;
|
} as const;
|
||||||
|
@ -133,6 +134,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
excludeBots: ps.excludeBots,
|
excludeBots: ps.excludeBots,
|
||||||
withReplies: ps.withReplies,
|
withReplies: ps.withReplies,
|
||||||
withFile: ps.withFile,
|
withFile: ps.withFile,
|
||||||
|
hideNotesInSensitiveChannel: ps.hideNotesInSensitiveChannel,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.globalEventService.publishInternalEvent('antennaCreated', antenna);
|
this.globalEventService.publishInternalEvent('antennaCreated', antenna);
|
||||||
|
|
|
@ -108,6 +108,9 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
.leftJoinAndSelect('reply.user', 'replyUser')
|
.leftJoinAndSelect('reply.user', 'replyUser')
|
||||||
.leftJoinAndSelect('renote.user', 'renoteUser');
|
.leftJoinAndSelect('renote.user', 'renoteUser');
|
||||||
|
|
||||||
|
// NOTE: センシティブ除外の設定はこのエンドポイントでは無視する。
|
||||||
|
// https://github.com/misskey-dev/misskey/pull/15346#discussion_r1929950255
|
||||||
|
|
||||||
this.queryService.generateVisibilityQuery(query, me);
|
this.queryService.generateVisibilityQuery(query, me);
|
||||||
this.queryService.generateMutedUserQueryForNotes(query, me);
|
this.queryService.generateMutedUserQueryForNotes(query, me);
|
||||||
this.queryService.generateBlockedUserQueryForNotes(query, me);
|
this.queryService.generateBlockedUserQueryForNotes(query, me);
|
||||||
|
|
|
@ -72,6 +72,7 @@ export const paramDef = {
|
||||||
excludeBots: { type: 'boolean' },
|
excludeBots: { type: 'boolean' },
|
||||||
withReplies: { type: 'boolean' },
|
withReplies: { type: 'boolean' },
|
||||||
withFile: { type: 'boolean' },
|
withFile: { type: 'boolean' },
|
||||||
|
hideNotesInSensitiveChannel: { type: 'boolean' },
|
||||||
},
|
},
|
||||||
required: ['antennaId'],
|
required: ['antennaId'],
|
||||||
} as const;
|
} as const;
|
||||||
|
@ -129,6 +130,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
excludeBots: ps.excludeBots,
|
excludeBots: ps.excludeBots,
|
||||||
withReplies: ps.withReplies,
|
withReplies: ps.withReplies,
|
||||||
withFile: ps.withFile,
|
withFile: ps.withFile,
|
||||||
|
hideNotesInSensitiveChannel: ps.hideNotesInSensitiveChannel,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
lastUsedAt: new Date(),
|
lastUsedAt: new Date(),
|
||||||
});
|
});
|
||||||
|
|
|
@ -46,6 +46,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'read');
|
||||||
|
|
||||||
const history = ps.room ? await this.chatService.roomHistory(me.id, ps.limit) : await this.chatService.userHistory(me.id, ps.limit);
|
const history = ps.room ? await this.chatService.roomHistory(me.id, ps.limit) : await this.chatService.userHistory(me.id, ps.limit);
|
||||||
|
|
||||||
const packedMessages = await this.chatEntityService.packMessagesDetailed(history, me);
|
const packedMessages = await this.chatEntityService.packMessagesDetailed(history, me);
|
||||||
|
|
|
@ -16,7 +16,6 @@ export const meta = {
|
||||||
tags: ['chat'],
|
tags: ['chat'],
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requiredRolePolicy: 'canChat',
|
|
||||||
|
|
||||||
prohibitMoved: true,
|
prohibitMoved: true,
|
||||||
|
|
||||||
|
@ -30,7 +29,7 @@ export const meta = {
|
||||||
res: {
|
res: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
ref: 'ChatMessageLite',
|
ref: 'ChatMessageLiteForRoom',
|
||||||
},
|
},
|
||||||
|
|
||||||
errors: {
|
errors: {
|
||||||
|
@ -74,6 +73,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
const room = await this.chatService.findRoomById(ps.toRoomId);
|
const room = await this.chatService.findRoomById(ps.toRoomId);
|
||||||
if (room == null) {
|
if (room == null) {
|
||||||
throw new ApiError(meta.errors.noSuchRoom);
|
throw new ApiError(meta.errors.noSuchRoom);
|
||||||
|
|
|
@ -16,7 +16,6 @@ export const meta = {
|
||||||
tags: ['chat'],
|
tags: ['chat'],
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requiredRolePolicy: 'canChat',
|
|
||||||
|
|
||||||
prohibitMoved: true,
|
prohibitMoved: true,
|
||||||
|
|
||||||
|
@ -30,7 +29,7 @@ export const meta = {
|
||||||
res: {
|
res: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
ref: 'ChatMessageLite',
|
ref: 'ChatMessageLiteFor1on1',
|
||||||
},
|
},
|
||||||
|
|
||||||
errors: {
|
errors: {
|
||||||
|
@ -86,6 +85,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
let file = null;
|
let file = null;
|
||||||
if (ps.fileId != null) {
|
if (ps.fileId != null) {
|
||||||
file = await this.driveFilesRepository.findOneBy({
|
file = await this.driveFilesRepository.findOneBy({
|
||||||
|
|
|
@ -42,6 +42,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
const message = await this.chatService.findMyMessageById(me.id, ps.messageId);
|
const message = await this.chatService.findMyMessageById(me.id, ps.messageId);
|
||||||
if (message == null) {
|
if (message == null) {
|
||||||
throw new ApiError(meta.errors.noSuchMessage);
|
throw new ApiError(meta.errors.noSuchMessage);
|
||||||
|
|
|
@ -43,6 +43,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
await this.chatService.react(ps.messageId, me.id, ps.reaction);
|
await this.chatService.react(ps.messageId, me.id, ps.reaction);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ export const meta = {
|
||||||
items: {
|
items: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
ref: 'ChatMessageLite',
|
ref: 'ChatMessageLiteForRoom',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -54,6 +54,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'read');
|
||||||
|
|
||||||
const room = await this.chatService.findRoomById(ps.roomId);
|
const room = await this.chatService.findRoomById(ps.roomId);
|
||||||
if (room == null) {
|
if (room == null) {
|
||||||
throw new ApiError(meta.errors.noSuchRoom);
|
throw new ApiError(meta.errors.noSuchRoom);
|
||||||
|
|
|
@ -54,6 +54,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'read');
|
||||||
|
|
||||||
if (ps.roomId != null) {
|
if (ps.roomId != null) {
|
||||||
const room = await this.chatService.findRoomById(ps.roomId);
|
const room = await this.chatService.findRoomById(ps.roomId);
|
||||||
if (room == null) {
|
if (room == null) {
|
||||||
|
|
|
@ -50,6 +50,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatEntityService: ChatEntityService,
|
private chatEntityService: ChatEntityService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'read');
|
||||||
|
|
||||||
const message = await this.chatService.findMessageById(ps.messageId);
|
const message = await this.chatService.findMessageById(ps.messageId);
|
||||||
if (message == null) {
|
if (message == null) {
|
||||||
throw new ApiError(meta.errors.noSuchMessage);
|
throw new ApiError(meta.errors.noSuchMessage);
|
||||||
|
|
|
@ -43,6 +43,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
await this.chatService.unreact(ps.messageId, me.id, ps.reaction);
|
await this.chatService.unreact(ps.messageId, me.id, ps.reaction);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ export const meta = {
|
||||||
items: {
|
items: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
ref: 'ChatMessageLite',
|
ref: 'ChatMessageLiteFor1on1',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -56,6 +56,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private getterService: GetterService,
|
private getterService: GetterService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'read');
|
||||||
|
|
||||||
const other = await this.getterService.getUser(ps.userId).catch(err => {
|
const other = await this.getterService.getUser(ps.userId).catch(err => {
|
||||||
if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
|
if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
|
||||||
throw err;
|
throw err;
|
||||||
|
|
|
@ -15,7 +15,6 @@ export const meta = {
|
||||||
tags: ['chat'],
|
tags: ['chat'],
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requiredRolePolicy: 'canChat',
|
|
||||||
|
|
||||||
prohibitMoved: true,
|
prohibitMoved: true,
|
||||||
|
|
||||||
|
@ -52,6 +51,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatEntityService: ChatEntityService,
|
private chatEntityService: ChatEntityService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
const room = await this.chatService.createRoom(me, {
|
const room = await this.chatService.createRoom(me, {
|
||||||
name: ps.name,
|
name: ps.name,
|
||||||
description: ps.description ?? '',
|
description: ps.description ?? '',
|
||||||
|
|
|
@ -42,6 +42,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
const room = await this.chatService.findRoomById(ps.roomId);
|
const room = await this.chatService.findRoomById(ps.roomId);
|
||||||
if (room == null) {
|
if (room == null) {
|
||||||
throw new ApiError(meta.errors.noSuchRoom);
|
throw new ApiError(meta.errors.noSuchRoom);
|
||||||
|
|
|
@ -15,7 +15,6 @@ export const meta = {
|
||||||
tags: ['chat'],
|
tags: ['chat'],
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requiredRolePolicy: 'canChat',
|
|
||||||
|
|
||||||
prohibitMoved: true,
|
prohibitMoved: true,
|
||||||
|
|
||||||
|
@ -57,6 +56,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatEntityService: ChatEntityService,
|
private chatEntityService: ChatEntityService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
const room = await this.chatService.findMyRoomById(me.id, ps.roomId);
|
const room = await this.chatService.findMyRoomById(me.id, ps.roomId);
|
||||||
if (room == null) {
|
if (room == null) {
|
||||||
throw new ApiError(meta.errors.noSuchRoom);
|
throw new ApiError(meta.errors.noSuchRoom);
|
||||||
|
|
|
@ -42,6 +42,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
await this.chatService.ignoreRoomInvitation(me.id, ps.roomId);
|
await this.chatService.ignoreRoomInvitation(me.id, ps.roomId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'read');
|
||||||
|
|
||||||
const invitations = await this.chatService.getReceivedRoomInvitationsWithPagination(me.id, ps.limit, ps.sinceId, ps.untilId);
|
const invitations = await this.chatService.getReceivedRoomInvitationsWithPagination(me.id, ps.limit, ps.sinceId, ps.untilId);
|
||||||
return this.chatEntityService.packRoomInvitations(invitations, me);
|
return this.chatEntityService.packRoomInvitations(invitations, me);
|
||||||
});
|
});
|
||||||
|
|
|
@ -55,6 +55,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatEntityService: ChatEntityService,
|
private chatEntityService: ChatEntityService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'read');
|
||||||
|
|
||||||
const room = await this.chatService.findMyRoomById(me.id, ps.roomId);
|
const room = await this.chatService.findMyRoomById(me.id, ps.roomId);
|
||||||
if (room == null) {
|
if (room == null) {
|
||||||
throw new ApiError(meta.errors.noSuchRoom);
|
throw new ApiError(meta.errors.noSuchRoom);
|
||||||
|
|
|
@ -42,6 +42,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
await this.chatService.joinToRoom(me.id, ps.roomId);
|
await this.chatService.joinToRoom(me.id, ps.roomId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatEntityService: ChatEntityService,
|
private chatEntityService: ChatEntityService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'read');
|
||||||
|
|
||||||
const memberships = await this.chatService.getMyMemberships(me.id, ps.limit, ps.sinceId, ps.untilId);
|
const memberships = await this.chatService.getMyMemberships(me.id, ps.limit, ps.sinceId, ps.untilId);
|
||||||
|
|
||||||
return this.chatEntityService.packRoomMemberships(memberships, me, {
|
return this.chatEntityService.packRoomMemberships(memberships, me, {
|
||||||
|
|
|
@ -42,6 +42,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
await this.chatService.leaveRoom(me.id, ps.roomId);
|
await this.chatService.leaveRoom(me.id, ps.roomId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatEntityService: ChatEntityService,
|
private chatEntityService: ChatEntityService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'read');
|
||||||
|
|
||||||
const room = await this.chatService.findRoomById(ps.roomId);
|
const room = await this.chatService.findRoomById(ps.roomId);
|
||||||
if (room == null) {
|
if (room == null) {
|
||||||
throw new ApiError(meta.errors.noSuchRoom);
|
throw new ApiError(meta.errors.noSuchRoom);
|
||||||
|
|
|
@ -43,6 +43,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
await this.chatService.muteRoom(me.id, ps.roomId, ps.mute);
|
await this.chatService.muteRoom(me.id, ps.roomId, ps.mute);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatService: ChatService,
|
private chatService: ChatService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'read');
|
||||||
|
|
||||||
const rooms = await this.chatService.getOwnedRoomsWithPagination(me.id, ps.limit, ps.sinceId, ps.untilId);
|
const rooms = await this.chatService.getOwnedRoomsWithPagination(me.id, ps.limit, ps.sinceId, ps.untilId);
|
||||||
return this.chatEntityService.packRooms(rooms, me);
|
return this.chatEntityService.packRooms(rooms, me);
|
||||||
});
|
});
|
||||||
|
|
|
@ -47,6 +47,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatEntityService: ChatEntityService,
|
private chatEntityService: ChatEntityService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'read');
|
||||||
|
|
||||||
const room = await this.chatService.findRoomById(ps.roomId);
|
const room = await this.chatService.findRoomById(ps.roomId);
|
||||||
if (room == null) {
|
if (room == null) {
|
||||||
throw new ApiError(meta.errors.noSuchRoom);
|
throw new ApiError(meta.errors.noSuchRoom);
|
||||||
|
|
|
@ -49,6 +49,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private chatEntityService: ChatEntityService,
|
private chatEntityService: ChatEntityService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
await this.chatService.checkChatAvailability(me.id, 'write');
|
||||||
|
|
||||||
const room = await this.chatService.findMyRoomById(me.id, ps.roomId);
|
const room = await this.chatService.findMyRoomById(me.id, ps.roomId);
|
||||||
if (room == null) {
|
if (room == null) {
|
||||||
throw new ApiError(meta.errors.noSuchRoom);
|
throw new ApiError(meta.errors.noSuchRoom);
|
||||||
|
|
|
@ -50,6 +50,9 @@ class GlobalTimelineChannel extends Channel {
|
||||||
|
|
||||||
if (note.visibility !== 'public') return;
|
if (note.visibility !== 'public') return;
|
||||||
if (note.channelId != null) return;
|
if (note.channelId != null) return;
|
||||||
|
if (note.user.requireSigninToViewContents && this.user == null) return;
|
||||||
|
if (note.renote && note.renote.user.requireSigninToViewContents && this.user == null) return;
|
||||||
|
if (note.reply && note.reply.user.requireSigninToViewContents && this.user == null) return;
|
||||||
|
|
||||||
if (isRenotePacked(note) && !isQuotePacked(note) && !this.withRenotes) return;
|
if (isRenotePacked(note) && !isQuotePacked(note) && !this.withRenotes) return;
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,9 @@ class LocalTimelineChannel extends Channel {
|
||||||
if (note.user.host !== null) return;
|
if (note.user.host !== null) return;
|
||||||
if (note.visibility !== 'public') return;
|
if (note.visibility !== 'public') return;
|
||||||
if (note.channelId != null) return;
|
if (note.channelId != null) return;
|
||||||
|
if (note.user.requireSigninToViewContents && this.user == null) return;
|
||||||
|
if (note.renote && note.renote.user.requireSigninToViewContents && this.user == null) return;
|
||||||
|
if (note.reply && note.reply.user.requireSigninToViewContents && this.user == null) return;
|
||||||
|
|
||||||
// 関係ない返信は除外
|
// 関係ない返信は除外
|
||||||
if (note.reply && this.user && !this.following[note.userId]?.withReplies && !this.withReplies) {
|
if (note.reply && this.user && !this.following[note.userId]?.withReplies && !this.withReplies) {
|
||||||
|
|
|
@ -146,6 +146,7 @@ describe('アンテナ', () => {
|
||||||
caseSensitive: false,
|
caseSensitive: false,
|
||||||
createdAt: new Date(response.createdAt).toISOString(),
|
createdAt: new Date(response.createdAt).toISOString(),
|
||||||
excludeKeywords: [['']],
|
excludeKeywords: [['']],
|
||||||
|
hideNotesInSensitiveChannel: false,
|
||||||
hasUnreadNote: false,
|
hasUnreadNote: false,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
keywords: [['keyword']],
|
keywords: [['keyword']],
|
||||||
|
@ -217,6 +218,8 @@ describe('アンテナ', () => {
|
||||||
{ parameters: () => ({ withReplies: true }) },
|
{ parameters: () => ({ withReplies: true }) },
|
||||||
{ parameters: () => ({ withFile: false }) },
|
{ parameters: () => ({ withFile: false }) },
|
||||||
{ parameters: () => ({ withFile: true }) },
|
{ parameters: () => ({ withFile: true }) },
|
||||||
|
{ parameters: () => ({ hideNotesInSensitiveChannel: false }) },
|
||||||
|
{ parameters: () => ({ hideNotesInSensitiveChannel: true }) },
|
||||||
];
|
];
|
||||||
test.each(antennaParamPattern)('を作成できること($#)', async ({ parameters }) => {
|
test.each(antennaParamPattern)('を作成できること($#)', async ({ parameters }) => {
|
||||||
const response = await successfulApiCall({
|
const response = await successfulApiCall({
|
||||||
|
@ -626,6 +629,42 @@ describe('アンテナ', () => {
|
||||||
assert.deepStrictEqual(response, expected);
|
assert.deepStrictEqual(response, expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('が取得できること(センシティブチャンネルのノートを除く)', async () => {
|
||||||
|
const keyword = 'キーワード';
|
||||||
|
const antenna = await successfulApiCall({
|
||||||
|
endpoint: 'antennas/create',
|
||||||
|
parameters: { ...defaultParam, keywords: [[keyword]], hideNotesInSensitiveChannel: true },
|
||||||
|
user: alice,
|
||||||
|
});
|
||||||
|
const nonSensitiveChannel = await successfulApiCall({
|
||||||
|
endpoint: 'channels/create',
|
||||||
|
parameters: { name: 'test', isSensitive: false },
|
||||||
|
user: alice,
|
||||||
|
});
|
||||||
|
const sensitiveChannel = await successfulApiCall({
|
||||||
|
endpoint: 'channels/create',
|
||||||
|
parameters: { name: 'test', isSensitive: true },
|
||||||
|
user: alice,
|
||||||
|
});
|
||||||
|
|
||||||
|
const noteInLocal = await post(bob, { text: `test ${keyword}` });
|
||||||
|
const noteInNonSensitiveChannel = await post(bob, { text: `test ${keyword}`, channelId: nonSensitiveChannel.id });
|
||||||
|
await post(bob, { text: `test ${keyword}`, channelId: sensitiveChannel.id });
|
||||||
|
|
||||||
|
const response = await successfulApiCall({
|
||||||
|
endpoint: 'antennas/notes',
|
||||||
|
parameters: { antennaId: antenna.id },
|
||||||
|
user: alice,
|
||||||
|
});
|
||||||
|
// 最後に投稿したものが先頭に来る。
|
||||||
|
const expected = [
|
||||||
|
noteInNonSensitiveChannel,
|
||||||
|
noteInLocal,
|
||||||
|
];
|
||||||
|
assert.deepStrictEqual(response, expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
test.skip('が取得でき、日付指定のPaginationに一貫性があること', async () => { });
|
test.skip('が取得でき、日付指定のPaginationに一貫性があること', async () => { });
|
||||||
test.each([
|
test.each([
|
||||||
{ label: 'ID指定', offsetBy: 'id' },
|
{ label: 'ID指定', offsetBy: 'id' },
|
||||||
|
|
|
@ -108,7 +108,7 @@ export const ROLE_POLICIES = [
|
||||||
'canImportFollowing',
|
'canImportFollowing',
|
||||||
'canImportMuting',
|
'canImportMuting',
|
||||||
'canImportUserLists',
|
'canImportUserLists',
|
||||||
'canChat',
|
'chatAvailability',
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export const DEFAULT_SERVER_ERROR_IMAGE_URL = 'https://xn--931a.moe/assets/error.jpg';
|
export const DEFAULT_SERVER_ERROR_IMAGE_URL = 'https://xn--931a.moe/assets/error.jpg';
|
||||||
|
|
|
@ -15,8 +15,6 @@
|
||||||
focus: ':alpha<0.3<@accent',
|
focus: ':alpha<0.3<@accent',
|
||||||
bg: '#000',
|
bg: '#000',
|
||||||
fg: '#dadada',
|
fg: '#dadada',
|
||||||
fgTransparentWeak: ':alpha<0.75<@fg',
|
|
||||||
fgTransparent: ':alpha<0.5<@fg',
|
|
||||||
fgHighlighted: ':lighten<3<@fg',
|
fgHighlighted: ':lighten<3<@fg',
|
||||||
fgOnAccent: '#fff',
|
fgOnAccent: '#fff',
|
||||||
fgOnWhite: '#333',
|
fgOnWhite: '#333',
|
||||||
|
@ -26,7 +24,6 @@
|
||||||
panelHighlight: ':lighten<3<@panel',
|
panelHighlight: ':lighten<3<@panel',
|
||||||
panelHeaderBg: ':lighten<3<@panel',
|
panelHeaderBg: ':lighten<3<@panel',
|
||||||
panelHeaderFg: '@fg',
|
panelHeaderFg: '@fg',
|
||||||
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
|
|
||||||
panelBorder: '" solid 1px var(--MI_THEME-divider)',
|
panelBorder: '" solid 1px var(--MI_THEME-divider)',
|
||||||
windowHeader: ':alpha<0.85<@panel',
|
windowHeader: ':alpha<0.85<@panel',
|
||||||
popup: ':lighten<3<@panel',
|
popup: ':lighten<3<@panel',
|
||||||
|
|
|
@ -15,8 +15,6 @@
|
||||||
focus: ':alpha<0.3<@accent',
|
focus: ':alpha<0.3<@accent',
|
||||||
bg: '#fff',
|
bg: '#fff',
|
||||||
fg: '#5f5f5f',
|
fg: '#5f5f5f',
|
||||||
fgTransparentWeak: ':alpha<0.75<@fg',
|
|
||||||
fgTransparent: ':alpha<0.5<@fg',
|
|
||||||
fgHighlighted: ':darken<3<@fg',
|
fgHighlighted: ':darken<3<@fg',
|
||||||
fgOnAccent: '#fff',
|
fgOnAccent: '#fff',
|
||||||
fgOnWhite: '#333',
|
fgOnWhite: '#333',
|
||||||
|
@ -26,7 +24,6 @@
|
||||||
panelHighlight: ':darken<3<@panel',
|
panelHighlight: ':darken<3<@panel',
|
||||||
panelHeaderBg: ':lighten<3<@panel',
|
panelHeaderBg: ':lighten<3<@panel',
|
||||||
panelHeaderFg: '@fg',
|
panelHeaderFg: '@fg',
|
||||||
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
|
|
||||||
panelBorder: '" solid 1px var(--MI_THEME-divider)',
|
panelBorder: '" solid 1px var(--MI_THEME-divider)',
|
||||||
windowHeader: ':alpha<0.85<@panel',
|
windowHeader: ':alpha<0.85<@panel',
|
||||||
popup: ':lighten<3<@panel',
|
popup: ':lighten<3<@panel',
|
||||||
|
|
|
@ -7,9 +7,9 @@
|
||||||
bg: '#232125',
|
bg: '#232125',
|
||||||
fg: '#efdab9',
|
fg: '#efdab9',
|
||||||
link: '#78b0a0',
|
link: '#78b0a0',
|
||||||
warn: '#ecb637',
|
warn: '#ffd152',
|
||||||
badge: '#31b1ce',
|
badge: '#31b1ce',
|
||||||
error: '#ec4137',
|
error: '#ff6652',
|
||||||
focus: ':alpha<0.3<@accent',
|
focus: ':alpha<0.3<@accent',
|
||||||
navBg: '@panel',
|
navBg: '@panel',
|
||||||
navFg: '@fg',
|
navFg: '@fg',
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
hashtag: '#ff9156',
|
hashtag: '#ff9156',
|
||||||
mention: '#ffd152',
|
mention: '#ffd152',
|
||||||
modalBg: 'rgba(0, 0, 0, 0.5)',
|
modalBg: 'rgba(0, 0, 0, 0.5)',
|
||||||
success: '#86b300',
|
success: '#78b07f',
|
||||||
indicator: '@accent',
|
indicator: '@accent',
|
||||||
mentionMe: '#fb5d38',
|
mentionMe: '#fb5d38',
|
||||||
messageBg: '@bg',
|
messageBg: '@bg',
|
||||||
|
@ -46,7 +46,6 @@
|
||||||
fgOnWhite: '@accent',
|
fgOnWhite: '@accent',
|
||||||
panelHighlight: ':lighten<3<@panel',
|
panelHighlight: ':lighten<3<@panel',
|
||||||
scrollbarHandle: 'rgba(255, 255, 255, 0.2)',
|
scrollbarHandle: 'rgba(255, 255, 255, 0.2)',
|
||||||
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
|
|
||||||
scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',
|
scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
fgOnWhite: '@accent',
|
fgOnWhite: '@accent',
|
||||||
divider: 'rgba(255, 255, 255, 0.14)',
|
divider: 'rgba(255, 255, 255, 0.14)',
|
||||||
panel: 'rgb(47, 47, 44)',
|
panel: 'rgb(47, 47, 44)',
|
||||||
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
|
|
||||||
header: ':alpha<0.7<@panel',
|
header: ':alpha<0.7<@panel',
|
||||||
navBg: '#363636',
|
navBg: '#363636',
|
||||||
renote: '@accent',
|
renote: '@accent',
|
||||||
|
@ -22,5 +21,8 @@
|
||||||
mentionMe: 'rgb(212, 210, 76)',
|
mentionMe: 'rgb(212, 210, 76)',
|
||||||
hashtag: '#5bcbb0',
|
hashtag: '#5bcbb0',
|
||||||
link: '@accent',
|
link: '@accent',
|
||||||
|
success: '@accent',
|
||||||
|
warn: 'rgb(255, 213, 82)',
|
||||||
|
error: 'rgb(255, 105, 82)',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
fgOnWhite: '@accent',
|
fgOnWhite: '@accent',
|
||||||
divider: 'rgba(255, 255, 255, 0.14)',
|
divider: 'rgba(255, 255, 255, 0.14)',
|
||||||
panel: '#2d2d2d',
|
panel: '#2d2d2d',
|
||||||
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
|
|
||||||
header: ':alpha<0.7<@panel',
|
header: ':alpha<0.7<@panel',
|
||||||
navBg: '#363636',
|
navBg: '#363636',
|
||||||
renote: '@accent',
|
renote: '@accent',
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
fgOnWhite: '@accent',
|
fgOnWhite: '@accent',
|
||||||
divider: 'rgba(255, 255, 255, 0.1)',
|
divider: 'rgba(255, 255, 255, 0.1)',
|
||||||
panel: '#18181c',
|
panel: '#18181c',
|
||||||
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
|
|
||||||
renote: '@accent',
|
renote: '@accent',
|
||||||
mention: '#f2c97d',
|
mention: '#f2c97d',
|
||||||
mentionMe: '@accent',
|
mentionMe: '@accent',
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
fgOnWhite: '@accent',
|
fgOnWhite: '@accent',
|
||||||
divider: '#e7fffb24',
|
divider: '#e7fffb24',
|
||||||
panel: '#192320',
|
panel: '#192320',
|
||||||
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
|
|
||||||
popup: '#293330',
|
popup: '#293330',
|
||||||
renote: '@accent',
|
renote: '@accent',
|
||||||
mentionMe: '#ffaa00',
|
mentionMe: '#ffaa00',
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
fgOnWhite: '@accent',
|
fgOnWhite: '@accent',
|
||||||
divider: '#e7fffb24',
|
divider: '#e7fffb24',
|
||||||
panel: '#192320',
|
panel: '#192320',
|
||||||
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
|
|
||||||
popup: '#293330',
|
popup: '#293330',
|
||||||
renote: '@accent',
|
renote: '@accent',
|
||||||
mentionMe: '#b4e900',
|
mentionMe: '#b4e900',
|
||||||
|
|
|
@ -22,5 +22,8 @@
|
||||||
mentionMe: '#de6161',
|
mentionMe: '#de6161',
|
||||||
hashtag: '#68bad0',
|
hashtag: '#68bad0',
|
||||||
link: '#a1c758',
|
link: '#a1c758',
|
||||||
|
error: '#ce5441',
|
||||||
|
warn: '#d0b868',
|
||||||
|
success: '#a1c758',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,6 @@
|
||||||
navIndicator: '@indicator',
|
navIndicator: '@indicator',
|
||||||
driveFolderBg: ':alpha<0.3<@accent',
|
driveFolderBg: ':alpha<0.3<@accent',
|
||||||
fgHighlighted: ':lighten<3<@fg',
|
fgHighlighted: ':lighten<3<@fg',
|
||||||
fgTransparent: ':alpha<0.5<@fg',
|
|
||||||
panelHeaderBg: ':lighten<3<@panel',
|
panelHeaderBg: ':lighten<3<@panel',
|
||||||
panelHeaderFg: '@fg',
|
panelHeaderFg: '@fg',
|
||||||
buttonGradateA: '@accent',
|
buttonGradateA: '@accent',
|
||||||
|
@ -58,8 +57,6 @@
|
||||||
panelHighlight: ':lighten<3<@panel',
|
panelHighlight: ':lighten<3<@panel',
|
||||||
scrollbarHandle: 'rgba(255, 255, 255, 0.2)',
|
scrollbarHandle: 'rgba(255, 255, 255, 0.2)',
|
||||||
inputBorderHover: 'rgba(255, 255, 255, 0.2)',
|
inputBorderHover: 'rgba(255, 255, 255, 0.2)',
|
||||||
fgTransparentWeak: ':alpha<0.75<@fg',
|
|
||||||
panelHeaderDivider: 'rgba(0, 0, 0, 0)',
|
|
||||||
scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',
|
scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)',
|
||||||
deckBg: '#142022',
|
deckBg: '#142022',
|
||||||
},
|
},
|
||||||
|
|
|
@ -13,18 +13,17 @@
|
||||||
fgHighlighted: '#6bc9a0',
|
fgHighlighted: '#6bc9a0',
|
||||||
fgOnWhite: '@accent',
|
fgOnWhite: '@accent',
|
||||||
divider: '#cfcfcf',
|
divider: '#cfcfcf',
|
||||||
panel: '@X14',
|
panel: '#ebe7e5',
|
||||||
panelHeaderBg: '@panel',
|
panelHeaderBg: '@panel',
|
||||||
panelHeaderDivider: '@divider',
|
|
||||||
header: ':alpha<0.7<@panel',
|
header: ':alpha<0.7<@panel',
|
||||||
navBg: '@X14',
|
navBg: '#ebe7e5',
|
||||||
renote: '#229e92',
|
renote: '#229e92',
|
||||||
mention: '#da6d35',
|
mention: '#da6d35',
|
||||||
mentionMe: '#d44c4c',
|
mentionMe: '#d44c4c',
|
||||||
hashtag: '#4cb8d4',
|
hashtag: '#4cb8d4',
|
||||||
link: '@accent',
|
link: '@accent',
|
||||||
buttonGradateB: ':hue<-70<@accent',
|
buttonGradateB: ':hue<-70<@accent',
|
||||||
success: '#86b300',
|
success: '@accent',
|
||||||
X14: '#ebe7e5'
|
error: '#da5635',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,5 +18,8 @@
|
||||||
mention: '@accent',
|
mention: '@accent',
|
||||||
mentionMe: 'rgb(170, 149, 98)',
|
mentionMe: 'rgb(170, 149, 98)',
|
||||||
hashtag: '@accent',
|
hashtag: '@accent',
|
||||||
|
error: '#db9184',
|
||||||
|
warn: '#dbc184',
|
||||||
|
success: '#a3c975',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue