mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-07 19:22:14 +09:00
feat(admin,api): restrict community creation on self-hosted (#3055)
This commit is contained in:
@@ -10659,6 +10659,7 @@
|
||||
"feature_custom_notification_sounds",
|
||||
"feature_early_access",
|
||||
"feature_global_expressions",
|
||||
"feature_guild_create",
|
||||
"feature_higher_video_quality",
|
||||
"feature_per_guild_profiles",
|
||||
"feature_voice_entrance_sounds",
|
||||
@@ -10966,6 +10967,7 @@
|
||||
"single_community_guild_id": {"nullable": true, "type": "string"},
|
||||
"direct_messages_disabled": {"type": "boolean"},
|
||||
"direct_messages_locked": {"type": "boolean"},
|
||||
"guild_create_access": {"type": "boolean"},
|
||||
"premium_mode": {"type": "string", "enum": ["mirror", "everyone"]},
|
||||
"services": {
|
||||
"type": "object",
|
||||
@@ -11003,6 +11005,7 @@
|
||||
"single_community_guild_id",
|
||||
"direct_messages_disabled",
|
||||
"direct_messages_locked",
|
||||
"guild_create_access",
|
||||
"premium_mode",
|
||||
"services",
|
||||
"services_resolved",
|
||||
@@ -11523,6 +11526,7 @@
|
||||
"direct_messages_disabled": {"type": "boolean"},
|
||||
"direct_messages_locked": {"type": "boolean", "enum": [false]},
|
||||
"premium_mode": {"type": "string", "enum": ["mirror", "everyone"]},
|
||||
"guild_create_access": {"type": "boolean"},
|
||||
"services": {
|
||||
"nullable": true,
|
||||
"type": "object",
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
use crate::templates::components::tooltip::{Hint, HintLink};
|
||||
|
||||
pub fn limit_key_hint(key: &str) -> Option<Hint<'static>> {
|
||||
match key {
|
||||
"feature_guild_create" => Some(Hint {
|
||||
name: Some("Community Creation Access"),
|
||||
body: "Admins with the wildcard ACL can always create communities.",
|
||||
link: Some(HintLink::new(
|
||||
"/instance-config#community-creation",
|
||||
"Community creation policy",
|
||||
)),
|
||||
}),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
@@ -43,6 +43,8 @@ pub struct InstancePolicyResponse {
|
||||
pub direct_messages_locked: bool,
|
||||
#[serde(default)]
|
||||
pub premium_mode: PremiumMode,
|
||||
#[serde(default = "default_guild_create_access")]
|
||||
pub guild_create_access: bool,
|
||||
#[serde(default)]
|
||||
pub services: InstanceServicesOverrides,
|
||||
#[serde(default)]
|
||||
@@ -51,6 +53,10 @@ pub struct InstancePolicyResponse {
|
||||
pub services_available: InstanceServicesAvailable,
|
||||
}
|
||||
|
||||
fn default_guild_create_access() -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
impl Default for InstancePolicyResponse {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
@@ -59,6 +65,7 @@ impl Default for InstancePolicyResponse {
|
||||
direct_messages_disabled: false,
|
||||
direct_messages_locked: false,
|
||||
premium_mode: PremiumMode::Everyone,
|
||||
guild_create_access: default_guild_create_access(),
|
||||
services: InstanceServicesOverrides::default(),
|
||||
services_resolved: InstanceServicesResolved::default(),
|
||||
services_available: InstanceServicesAvailable::default(),
|
||||
@@ -656,6 +663,8 @@ pub struct InstancePolicyUpdateRequest {
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub direct_messages_disabled: Option<bool>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub guild_create_access: Option<bool>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub premium_mode: Option<PremiumMode>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub services: Option<InstanceServicesUpdateRequest>,
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
pub mod acl;
|
||||
pub mod admin_flags;
|
||||
pub mod admin_hints;
|
||||
pub mod api;
|
||||
pub mod config;
|
||||
pub mod fonts;
|
||||
|
||||
@@ -734,6 +734,9 @@ fn build_policy_update(form: &MultiValueForm) -> InstanceConfigUpdateRequest {
|
||||
let direct_messages_disabled = form
|
||||
.first("policy_direct_messages_disabled")
|
||||
.map(|value| value == "true");
|
||||
let guild_create_access = form
|
||||
.first("policy_guild_create_access")
|
||||
.map(|value| value == "true");
|
||||
let premium_mode = match form.first("policy_premium_mode") {
|
||||
Some("mirror") => Some(PremiumMode::Mirror),
|
||||
Some("everyone") => Some(PremiumMode::Everyone),
|
||||
@@ -745,6 +748,7 @@ fn build_policy_update(form: &MultiValueForm) -> InstanceConfigUpdateRequest {
|
||||
single_community_enabled: None,
|
||||
single_community_name: None,
|
||||
direct_messages_disabled,
|
||||
guild_create_access,
|
||||
premium_mode,
|
||||
services,
|
||||
}),
|
||||
@@ -875,10 +879,7 @@ fn build_single_community_update(enabled: bool) -> InstanceConfigUpdateRequest {
|
||||
InstanceConfigUpdateRequest {
|
||||
policy: Some(InstancePolicyUpdateRequest {
|
||||
single_community_enabled: Some(enabled),
|
||||
single_community_name: None,
|
||||
direct_messages_disabled: None,
|
||||
premium_mode: None,
|
||||
services: None,
|
||||
..Default::default()
|
||||
}),
|
||||
..Default::default()
|
||||
}
|
||||
|
||||
@@ -238,3 +238,28 @@ input:disabled + .checkbox-custom {
|
||||
border: 2px solid transparent;
|
||||
background-clip: content-box;
|
||||
}
|
||||
|
||||
:target {
|
||||
padding: 0.5rem;
|
||||
border-radius: 0.25rem;
|
||||
scroll-margin-top: 6rem;
|
||||
animation: target-pulse 700ms ease-in-out 3;
|
||||
}
|
||||
|
||||
@keyframes target-pulse {
|
||||
0%,
|
||||
100% {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
50% {
|
||||
background-color: hsl(242 70% 55% / 0.18);
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
:target {
|
||||
background-color: hsl(242 70% 55% / 0.12);
|
||||
animation: none;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ pub mod resource_link;
|
||||
pub mod section_card;
|
||||
pub mod stack;
|
||||
pub mod table;
|
||||
pub mod tooltip;
|
||||
pub mod typography;
|
||||
pub mod user_display;
|
||||
pub mod user_profile_badges;
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
use super::icons::paperclip_icon;
|
||||
use maud::{Markup, html};
|
||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
|
||||
static HINT_TOGGLE_ID: AtomicUsize = AtomicUsize::new(0);
|
||||
|
||||
pub struct HintLink<'a> {
|
||||
href: &'a str,
|
||||
label: &'a str,
|
||||
}
|
||||
|
||||
impl<'a> HintLink<'a> {
|
||||
pub fn new(href: &'a str, label: &'a str) -> Self {
|
||||
debug_assert!(
|
||||
href.starts_with('/'),
|
||||
"hint link href must be admin-absolute: {href:?}"
|
||||
);
|
||||
debug_assert!(
|
||||
href.contains('#'),
|
||||
"hint link href should point at an anchor: {href:?}"
|
||||
);
|
||||
debug_assert!(!label.trim().is_empty(), "hint link needs a label");
|
||||
Self { href, label }
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Hint<'a> {
|
||||
pub name: Option<&'a str>,
|
||||
pub body: &'a str,
|
||||
pub link: Option<HintLink<'a>>,
|
||||
}
|
||||
|
||||
pub fn info(base: &str, hint: &Hint<'_>) -> Markup {
|
||||
let aria_label = match hint.name {
|
||||
Some(name) => format!("About {name}"),
|
||||
None => "More information".to_owned(),
|
||||
};
|
||||
let toggle_id = format!(
|
||||
"hint-toggle-{}",
|
||||
HINT_TOGGLE_ID.fetch_add(1, Ordering::Relaxed)
|
||||
);
|
||||
html! {
|
||||
span class="group relative inline-flex items-center" {
|
||||
input type="checkbox" id=(toggle_id) class="peer sr-only";
|
||||
label for=(toggle_id) tabindex="0" aria-label=(aria_label)
|
||||
class="flex h-4 w-4 shrink-0 cursor-pointer items-center justify-center rounded-full \
|
||||
font-semibold text-brand-primary leading-none active:scale-97 \
|
||||
hover:text-brand-primary-dark" {
|
||||
"?"
|
||||
}
|
||||
label for=(toggle_id) aria-hidden="true"
|
||||
class="invisible fixed inset-0 z-20 cursor-default peer-checked:visible" {}
|
||||
div class="invisible absolute bottom-full left-2 z-30 w-64 pb-3 pl-2 opacity-0 \
|
||||
transition-[opacity,visibility] duration-200 ease-out motion-reduce:transition-none \
|
||||
group-hover:visible group-hover:opacity-100 \
|
||||
group-focus-within:visible group-focus-within:opacity-100 \
|
||||
peer-checked:visible peer-checked:opacity-100" {
|
||||
div class="rounded-lg border border-neutral-200 bg-white p-3 text-neutral-600 \
|
||||
text-xs shadow-lg" {
|
||||
@if let Some(name) = hint.name {
|
||||
p class="font-semibold text-neutral-900" { (name) }
|
||||
}
|
||||
p class=[hint.name.is_some().then_some("mt-1")] { (hint.body) }
|
||||
@if let Some(link) = &hint.link {
|
||||
a href={(base) (link.href)} hx-boost="false"
|
||||
class="mt-2 inline-flex items-center gap-1 text-blue-600 hover:underline" {
|
||||
(paperclip_icon(""))(link.label)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::HintLink;
|
||||
|
||||
#[test]
|
||||
#[should_panic(expected = "anchor")]
|
||||
fn rejects_a_link_that_points_at_no_anchor() {
|
||||
let _ = HintLink::new("/instance-config", "Instance policy");
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic(expected = "label")]
|
||||
fn rejects_a_link_with_no_label() {
|
||||
let _ = HintLink::new("/instance-config#community-creation", " ");
|
||||
}
|
||||
}
|
||||
@@ -245,6 +245,7 @@ fn policy_config_section(
|
||||
(single_community_form(base, csrf_token, policy))
|
||||
(direct_messages_form(base, csrf_token, policy))
|
||||
(premium_mode_form(base, csrf_token, policy, premium_name))
|
||||
(community_creation_form(base, csrf_token, policy))
|
||||
(services_form(base, csrf_token, policy))
|
||||
}
|
||||
},
|
||||
@@ -364,6 +365,37 @@ fn premium_mode_form(
|
||||
}
|
||||
}
|
||||
|
||||
fn community_creation_form(
|
||||
base: &str,
|
||||
csrf_token: &str,
|
||||
policy: &InstancePolicyResponse,
|
||||
) -> Markup {
|
||||
html! {
|
||||
div id="community-creation" class="space-y-4 border-t border-neutral-200 pt-6" {
|
||||
h3 class="text-sm font-semibold text-neutral-900" { "Community creation" }
|
||||
form method="post" action={(base) "/instance-config?action=update_policy"} {
|
||||
(csrf_input(csrf_token))
|
||||
div class="space-y-4" {
|
||||
(select_input("policy_guild_create_access", "Who can create communities", &[
|
||||
("true", "Everyone"),
|
||||
("false", "Restricted"),
|
||||
], if policy.guild_create_access { "true" } else { "false" }))
|
||||
p class="text-xs text-neutral-500" {
|
||||
"When restricted, only admins with the wildcard ACL and users matched by a "
|
||||
a href={(base) "/limit-config"} class="text-blue-600 hover:underline" {
|
||||
"limit rule"
|
||||
}
|
||||
" that grants Community Creation Access can create communities."
|
||||
}
|
||||
(form_actions(html! {
|
||||
(submit_button("Save community creation policy"))
|
||||
}))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn service_select(name: &str, label: &str, override_value: Option<bool>, resolved: bool) -> Markup {
|
||||
let selected = match override_value {
|
||||
None => "inherit",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
use crate::{
|
||||
acl::{self, INSTANCE_LIMIT_CONFIG_UPDATE},
|
||||
admin_hints,
|
||||
api::types::{LimitConfigResponse, LimitKeyMetadata, LimitRule},
|
||||
config::AdminConfig,
|
||||
middleware::auth::AuthContext,
|
||||
@@ -9,6 +10,7 @@ use crate::{
|
||||
components::{
|
||||
form::{FORM_INPUT_CLASS, csrf_input, danger_button, form_actions, submit_button},
|
||||
page_container::{card_with_header, page_header},
|
||||
tooltip,
|
||||
},
|
||||
layout::admin_layout,
|
||||
},
|
||||
@@ -208,7 +210,7 @@ fn rule_editor(
|
||||
@for category in CATEGORY_ORDER {
|
||||
@let keys = keys_for_category(response, category);
|
||||
@if !keys.is_empty() {
|
||||
(category_section(response, rule, category, &keys, can_update))
|
||||
(category_section(&config.base_path, response, rule, category, &keys, can_update))
|
||||
}
|
||||
}
|
||||
@if can_update {
|
||||
@@ -274,6 +276,7 @@ fn keys_for_category(response: &LimitConfigResponse, category: &str) -> Vec<Stri
|
||||
}
|
||||
|
||||
fn category_section(
|
||||
base: &str,
|
||||
response: &LimitConfigResponse,
|
||||
rule: &LimitRule,
|
||||
category: &str,
|
||||
@@ -292,7 +295,7 @@ fn category_section(
|
||||
div class="space-y-4" {
|
||||
@for key in keys {
|
||||
@if let Some(metadata) = response.metadata.get(key) {
|
||||
(limit_field(response, rule, key, metadata, can_update))
|
||||
(limit_field(base, response, rule, key, metadata, can_update))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -301,6 +304,7 @@ fn category_section(
|
||||
}
|
||||
|
||||
fn limit_field(
|
||||
base: &str,
|
||||
response: &LimitConfigResponse,
|
||||
rule: &LimitRule,
|
||||
key: &str,
|
||||
@@ -319,9 +323,10 @@ fn limit_field(
|
||||
.as_ref()
|
||||
.is_some_and(|fields| fields.iter().any(|field| field == key));
|
||||
if metadata.is_toggle {
|
||||
toggle_field(key, metadata, current_value, modified, can_update)
|
||||
toggle_field(base, key, metadata, current_value, modified, can_update)
|
||||
} else {
|
||||
numeric_field(
|
||||
base,
|
||||
key,
|
||||
metadata,
|
||||
current_value,
|
||||
@@ -333,6 +338,7 @@ fn limit_field(
|
||||
}
|
||||
|
||||
fn toggle_field(
|
||||
base: &str,
|
||||
key: &str,
|
||||
metadata: &LimitKeyMetadata,
|
||||
current_value: Option<u64>,
|
||||
@@ -343,7 +349,7 @@ fn toggle_field(
|
||||
html! {
|
||||
div class={(field_class(modified, false))} {
|
||||
div class="flex-1 space-y-1" {
|
||||
(field_label_row(key, metadata, modified))
|
||||
(field_label_row(base, key, metadata, modified))
|
||||
p class="text-xs text-neutral-500" { (metadata.description) }
|
||||
}
|
||||
div class="shrink-0" {
|
||||
@@ -369,6 +375,7 @@ fn toggle_field(
|
||||
}
|
||||
|
||||
fn numeric_field(
|
||||
base: &str,
|
||||
key: &str,
|
||||
metadata: &LimitKeyMetadata,
|
||||
current_value: Option<u64>,
|
||||
@@ -385,7 +392,7 @@ fn numeric_field(
|
||||
html! {
|
||||
div class={(field_class(modified, true))} {
|
||||
div class="flex flex-wrap items-center justify-between gap-2" {
|
||||
(field_label_row(key, metadata, modified))
|
||||
(field_label_row(base, key, metadata, modified))
|
||||
}
|
||||
p class="text-xs text-neutral-500" {
|
||||
(metadata.description)
|
||||
@@ -417,10 +424,13 @@ fn numeric_field(
|
||||
}
|
||||
}
|
||||
|
||||
fn field_label_row(key: &str, metadata: &LimitKeyMetadata, modified: bool) -> Markup {
|
||||
fn field_label_row(base: &str, key: &str, metadata: &LimitKeyMetadata, modified: bool) -> Markup {
|
||||
html! {
|
||||
div class="flex flex-wrap items-center gap-2" {
|
||||
label for=(key) class="font-medium text-neutral-900 text-sm" { (metadata.label) }
|
||||
@if let Some(hint) = admin_hints::limit_key_hint(key) {
|
||||
(tooltip::info(base, &hint))
|
||||
}
|
||||
span class=(scope_class(&metadata.scope)) { (scope_label(&metadata.scope)) }
|
||||
@if modified {
|
||||
span class="rounded bg-neutral-100 px-1.5 py-0.5 text-neutral-700 text-xs" { "Modified" }
|
||||
|
||||
@@ -461,6 +461,7 @@ fn deserialize_instance_config_response_with_unknown_keys() {
|
||||
"single_community_guild_id": null,
|
||||
"direct_messages_disabled": false,
|
||||
"direct_messages_locked": false,
|
||||
"guild_create_access": false,
|
||||
"premium_mode": "mirror",
|
||||
"services": {
|
||||
"gif_enabled": true,
|
||||
|
||||
@@ -124,6 +124,7 @@ async function buildInstanceConfigResponse(): Promise<InstanceConfigResponse> {
|
||||
single_community_guild_id: policy.single_community_guild_id,
|
||||
direct_messages_disabled: policy.direct_messages_disabled,
|
||||
direct_messages_locked: policy.direct_messages_locked,
|
||||
guild_create_access: policy.guild_create_access,
|
||||
premium_mode: policy.premium_mode,
|
||||
services: {
|
||||
gif_enabled: policy.gif_enabled,
|
||||
@@ -831,6 +832,9 @@ function planInstancePolicyPatch(
|
||||
patch.direct_messages_locked = true;
|
||||
}
|
||||
}
|
||||
if (policy.guild_create_access !== undefined && policy.guild_create_access !== current.guild_create_access) {
|
||||
patch.guild_create_access = policy.guild_create_access;
|
||||
}
|
||||
if (policy.services) {
|
||||
if (policy.services.gif_enabled !== undefined) {
|
||||
patch.gif_enabled = policy.services.gif_enabled ?? null;
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import type {TestAccount} from '@app/api/auth/tests/AuthTestUtils';
|
||||
import {createTestAccount, setUserACLs} from '@app/api/auth/tests/AuthTestUtils';
|
||||
import {getConfig} from '@app/api/Config';
|
||||
import type {ApiTestHarness} from '@app/api/test/ApiTestHarness';
|
||||
import {createApiTestHarness} from '@app/api/test/ApiTestHarness';
|
||||
import {HTTP_STATUS} from '@app/api/test/TestConstants';
|
||||
import {createBuilder} from '@app/api/test/TestRequestBuilder';
|
||||
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
|
||||
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
|
||||
import type {LimitConfigSnapshot} from '@fluxer/limits/src/LimitTypes';
|
||||
import type {InstanceConfigResponse} from '@fluxer/schema/src/domains/admin/AdminSchemas';
|
||||
import type {GuildResponse} from '@fluxer/schema/src/domains/guild/GuildResponseSchemas';
|
||||
import {afterAll, beforeAll, beforeEach, describe, expect, it} from 'vitest';
|
||||
|
||||
const COMMUNITY_CREATOR_TRAIT = 'community_creator';
|
||||
|
||||
interface LimitConfigReadResponse {
|
||||
limit_config: LimitConfigSnapshot;
|
||||
}
|
||||
|
||||
describe('guild creation access on a self-hosted instance', () => {
|
||||
let harness: ApiTestHarness;
|
||||
|
||||
beforeAll(async () => {
|
||||
harness = await createApiTestHarness();
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
await harness.reset();
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await harness.shutdown();
|
||||
});
|
||||
|
||||
const asSelfHosted = async <T>(run: () => Promise<T>): Promise<T> => {
|
||||
const config = getConfig();
|
||||
const originalSelfHosted = config.instance.selfHosted;
|
||||
config.instance.selfHosted = true;
|
||||
try {
|
||||
return await run();
|
||||
} finally {
|
||||
config.instance.selfHosted = originalSelfHosted;
|
||||
}
|
||||
};
|
||||
|
||||
const createAdmin = async (): Promise<TestAccount> =>
|
||||
await setUserACLs(harness, await createTestAccount(harness), [
|
||||
AdminACLs.AUTHENTICATE,
|
||||
AdminACLs.INSTANCE_CONFIG_VIEW,
|
||||
AdminACLs.INSTANCE_CONFIG_UPDATE,
|
||||
AdminACLs.INSTANCE_LIMIT_CONFIG_VIEW,
|
||||
AdminACLs.INSTANCE_LIMIT_CONFIG_UPDATE,
|
||||
AdminACLs.USER_UPDATE_TRAITS,
|
||||
]);
|
||||
|
||||
const createMember = async (): Promise<TestAccount> =>
|
||||
await setUserACLs(harness, await createTestAccount(harness), []);
|
||||
|
||||
const setGuildCreateAccess = async (admin: TestAccount, enabled: boolean): Promise<void> => {
|
||||
const updated = await createBuilder<InstanceConfigResponse>(harness, admin.token)
|
||||
.patch('/admin/instance/config')
|
||||
.body({policy: {guild_create_access: enabled}})
|
||||
.execute();
|
||||
expect(updated.policy.guild_create_access).toBe(enabled);
|
||||
};
|
||||
|
||||
const readInstanceConfig = async (admin: TestAccount): Promise<InstanceConfigResponse> =>
|
||||
await createBuilder<InstanceConfigResponse>(harness, admin.token).get('/admin/instance/config').execute();
|
||||
|
||||
const createGuild = (account: TestAccount, name: string) =>
|
||||
createBuilder<GuildResponse>(harness, account.token).post('/guilds').body({name});
|
||||
|
||||
const grantGuildCreateToTrait = async (admin: TestAccount, trait: string): Promise<void> => {
|
||||
const current = await createBuilder<LimitConfigReadResponse>(harness, admin.token)
|
||||
.get('/admin/limit-config')
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
await createBuilder(harness, admin.token)
|
||||
.put('/admin/limit-config')
|
||||
.body({
|
||||
limit_config: {
|
||||
traitDefinitions: [...current.limit_config.traitDefinitions, trait],
|
||||
rules: [
|
||||
...current.limit_config.rules,
|
||||
{id: `grant_${trait}`, filters: {traits: [trait]}, limits: {feature_guild_create: 1}},
|
||||
],
|
||||
},
|
||||
})
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
};
|
||||
|
||||
const grantTrait = async (admin: TestAccount, account: TestAccount, trait: string): Promise<void> => {
|
||||
await createBuilder(harness, admin.token)
|
||||
.put(`/admin/users/${account.userId}/traits`)
|
||||
.body({traits: [trait]})
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
};
|
||||
|
||||
it('allows guild creation while the community creation policy is at its default', async () => {
|
||||
const admin = await createAdmin();
|
||||
expect((await readInstanceConfig(admin)).policy.guild_create_access).toBe(true);
|
||||
|
||||
const member = await createMember();
|
||||
await asSelfHosted(async () => {
|
||||
const guild = await createGuild(member, 'Default policy community').execute();
|
||||
expect(guild.id).toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
||||
it('stores a disabled policy and rejects guild creation for a member without a grant', async () => {
|
||||
const admin = await createAdmin();
|
||||
await setGuildCreateAccess(admin, false);
|
||||
expect((await readInstanceConfig(admin)).policy.guild_create_access).toBe(false);
|
||||
|
||||
const member = await createMember();
|
||||
await asSelfHosted(async () => {
|
||||
await createGuild(member, 'Denied community')
|
||||
.expect(HTTP_STATUS.FORBIDDEN, APIErrorCodes.GUILD_CREATION_PERMISSION_REQUIRED)
|
||||
.execute();
|
||||
});
|
||||
});
|
||||
|
||||
it('allows guild creation only once a member holds the trait the grant rule targets', async () => {
|
||||
const admin = await createAdmin();
|
||||
await setGuildCreateAccess(admin, false);
|
||||
await grantGuildCreateToTrait(admin, COMMUNITY_CREATOR_TRAIT);
|
||||
|
||||
const member = await createMember();
|
||||
await asSelfHosted(async () => {
|
||||
await createGuild(member, 'Ungranted community')
|
||||
.expect(HTTP_STATUS.FORBIDDEN, APIErrorCodes.GUILD_CREATION_PERMISSION_REQUIRED)
|
||||
.execute();
|
||||
});
|
||||
|
||||
await grantTrait(admin, member, COMMUNITY_CREATOR_TRAIT);
|
||||
await asSelfHosted(async () => {
|
||||
const guild = await createGuild(member, 'Granted community').execute();
|
||||
expect(guild.id).toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
||||
it('allows guild creation for a member holding a wildcard ACL while the policy is disabled', async () => {
|
||||
const admin = await createAdmin();
|
||||
await setGuildCreateAccess(admin, false);
|
||||
|
||||
const member = await setUserACLs(harness, await createTestAccount(harness), [AdminACLs.WILDCARD]);
|
||||
await asSelfHosted(async () => {
|
||||
const guild = await createGuild(member, 'Wildcard community').execute();
|
||||
expect(guild.id).toBeTruthy();
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -3,6 +3,9 @@
|
||||
import {requireEmailVerified} from '@app/api/auth/EmailVerificationUtils';
|
||||
import {requireSudoMode} from '@app/api/auth/services/SudoVerificationService';
|
||||
import {createGuildID} from '@app/api/BrandedTypes';
|
||||
import {Config} from '@app/api/Config';
|
||||
import {resolveLimitSafe} from '@app/api/limits/LimitConfigUtils';
|
||||
import {createLimitMatchContext} from '@app/api/limits/LimitMatchContextBuilder';
|
||||
import {LoginRequired} from '@app/api/middleware/AuthMiddleware';
|
||||
import {requireOAuth2ScopeForBearer} from '@app/api/middleware/OAuth2ScopeMiddleware';
|
||||
import {RateLimitMiddleware} from '@app/api/middleware/RateLimitMiddleware';
|
||||
@@ -11,6 +14,8 @@ import {SudoModeMiddleware} from '@app/api/middleware/SudoModeMiddleware';
|
||||
import {RateLimitConfigs} from '@app/api/RateLimitConfig';
|
||||
import type {HonoApp} from '@app/api/types/HonoEnv';
|
||||
import {Validator} from '@app/api/Validator';
|
||||
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
|
||||
import {GuildCreationPermissionRequiredError} from '@fluxer/errors/src/domains/guild/GuildCreationPermissionRequiredError';
|
||||
import {SingleCommunityCannotCreateGuildsError} from '@fluxer/errors/src/domains/guild/SingleCommunityCannotCreateGuildsError';
|
||||
import {SingleCommunityCannotDeleteError} from '@fluxer/errors/src/domains/guild/SingleCommunityCannotDeleteError';
|
||||
import {SingleCommunityCannotLeaveError} from '@fluxer/errors/src/domains/guild/SingleCommunityCannotLeaveError';
|
||||
@@ -40,7 +45,8 @@ export function GuildBaseController(app: HonoApp) {
|
||||
OpenAPI({
|
||||
operationId: 'create_guild',
|
||||
summary: 'Create guild',
|
||||
description: 'Only claimed, email-verified non-bot users can create guilds.',
|
||||
description:
|
||||
'Only claimed, email-verified non-bot users can create guilds. A self-hosted instance can restrict creation to admins and users granted the feature_guild_create limit.',
|
||||
responseSchema: GuildResponse,
|
||||
statusCode: 200,
|
||||
security: ['bearerToken', 'sessionToken'],
|
||||
@@ -56,6 +62,19 @@ export function GuildBaseController(app: HonoApp) {
|
||||
if (!user.isUnclaimedAccount()) {
|
||||
requireEmailVerified(user, 'guild_creation');
|
||||
}
|
||||
if (Config.instance.selfHosted && !policy.guild_create_access) {
|
||||
const granted =
|
||||
user.acls.has(AdminACLs.WILDCARD) ||
|
||||
resolveLimitSafe(
|
||||
ctx.get('limitConfigService').getConfigSnapshot(),
|
||||
createLimitMatchContext({user}),
|
||||
'feature_guild_create',
|
||||
0,
|
||||
) > 0;
|
||||
if (!granted) {
|
||||
throw new GuildCreationPermissionRequiredError();
|
||||
}
|
||||
}
|
||||
const auditLogReason = ctx.get('auditLogReason') ?? null;
|
||||
const locale = ctx.get('requestLocale') ?? null;
|
||||
return ctx.json(await ctx.get('guildService').data.createGuild({user, data, locale}, auditLogReason));
|
||||
|
||||
@@ -173,6 +173,7 @@ export interface InstancePolicyConfig {
|
||||
direct_messages_disabled: boolean;
|
||||
direct_messages_locked: boolean;
|
||||
premium_mode: InstancePremiumMode;
|
||||
guild_create_access: boolean;
|
||||
gif_enabled: boolean | null;
|
||||
youtube_enabled: boolean | null;
|
||||
bluesky_enabled: boolean | null;
|
||||
@@ -647,6 +648,7 @@ const StoredInstancePolicySchema = z.object({
|
||||
direct_messages_disabled: InstancePolicyUpdateSchema.shape.direct_messages_disabled.default(false),
|
||||
direct_messages_locked: z.boolean().default(false),
|
||||
premium_mode: InstancePolicyUpdateSchema.shape.premium_mode.default('everyone'),
|
||||
guild_create_access: InstancePolicyUpdateSchema.shape.guild_create_access.default(true),
|
||||
gif_enabled: InstancePolicyServiceUpdateSchema.shape.gif_enabled.default(null),
|
||||
youtube_enabled: InstancePolicyServiceUpdateSchema.shape.youtube_enabled.default(null),
|
||||
bluesky_enabled: InstancePolicyServiceUpdateSchema.shape.bluesky_enabled.default(null),
|
||||
@@ -1773,6 +1775,7 @@ export class InstanceConfigRepository {
|
||||
single_community: policy.single_community_enabled,
|
||||
single_community_guild_id: policy.single_community_enabled ? policy.single_community_guild_id : null,
|
||||
direct_messages_disabled: policy.direct_messages_disabled,
|
||||
guild_create_access: policy.guild_create_access,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -6236,7 +6236,7 @@
|
||||
"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}
|
||||
}
|
||||
},
|
||||
"description": "Only claimed, email-verified non-bot users can create guilds.",
|
||||
"description": "Only claimed, email-verified non-bot users can create guilds. A self-hosted instance can restrict creation to admins and users granted the feature_guild_create limit.",
|
||||
"security": [{"sessionToken": []}],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
@@ -30259,9 +30259,18 @@
|
||||
"direct_messages_disabled": {
|
||||
"type": "boolean",
|
||||
"description": "Whether direct messages and friend requests are disabled instance-wide"
|
||||
},
|
||||
"guild_create_access": {
|
||||
"type": "boolean",
|
||||
"description": "Whether every account can create communities. When false, only admins and accounts granted the feature_guild_create limit can"
|
||||
}
|
||||
},
|
||||
"required": ["single_community", "single_community_guild_id", "direct_messages_disabled"],
|
||||
"required": [
|
||||
"single_community",
|
||||
"single_community_guild_id",
|
||||
"direct_messages_disabled",
|
||||
"guild_create_access"
|
||||
],
|
||||
"additionalProperties": false,
|
||||
"description": "Community topology and direct-message policy for this instance"
|
||||
},
|
||||
|
||||
@@ -111,6 +111,7 @@ export const DEFAULT_INSTANCE_COMMUNITY: InstanceCommunity = {
|
||||
single_community: false,
|
||||
single_community_guild_id: null,
|
||||
direct_messages_disabled: false,
|
||||
guild_create_access: true,
|
||||
};
|
||||
|
||||
export function normalizeInstanceCommunity(community?: InstanceCommunity | null): InstanceCommunity {
|
||||
@@ -402,6 +403,7 @@ class RuntimeConfig {
|
||||
? config.policy.single_community_guild_id
|
||||
: null,
|
||||
direct_messages_disabled: config.policy.direct_messages_disabled,
|
||||
guild_create_access: config.policy.guild_create_access,
|
||||
});
|
||||
this.services = normalizeInstanceServices({
|
||||
gif_enabled: config.policy.services_resolved.gif_enabled,
|
||||
|
||||
@@ -298,6 +298,7 @@ Community, direct message, premium and gating policy for the whole deployment.
|
||||
| single_community_guild_id | ?string | Guild used as that community, or null before one has been created |
|
||||
| direct_messages_disabled | boolean | Whether direct messages are disabled |
|
||||
| direct_messages_locked<sup>1</sup> | boolean | Whether the direct message setting is locked against further change |
|
||||
| guild_create_access | boolean | Whether every account can create communities, or only admins and holders of the `feature_guild_create` limit |
|
||||
| premium_mode | string | [Premium mode](#premium-modes) |
|
||||
| services | object | Operator overrides for `gif_enabled`, `youtube_enabled`, and `bluesky_enabled`. Each is nullable, and null means no override |
|
||||
| services_resolved<sup>2</sup> | object | The same keys as concrete booleans, resolved from the override and the provider's own availability |
|
||||
@@ -630,6 +631,7 @@ Fluxer skips URL validation while the merged configuration leaves single sign-on
|
||||
| single_community_name?<sup>1</sup> | string | Name used only when the community has to be created (1-100 characters) |
|
||||
| direct_messages_disabled?<sup>2</sup> | boolean | Whether direct messages are disabled |
|
||||
| direct_messages_locked?<sup>2</sup> | boolean | Whether the direct message setting stays locked |
|
||||
| guild_create_access? | boolean | Whether every account can create communities |
|
||||
| premium_mode? | string | [Premium mode](#premium-modes) |
|
||||
| services? | object | Nullable `gif_enabled`, `youtube_enabled`, and `bluesky_enabled` overrides |
|
||||
|
||||
|
||||
@@ -448,6 +448,10 @@ One or more selected users can't be added to this group DM
|
||||
|
||||
Email verification is required for this action
|
||||
|
||||
### `GUILD_CREATION_PERMISSION_REQUIRED`
|
||||
|
||||
You don't have permission to create communities on this instance
|
||||
|
||||
### `GUILD_EMAIL_VERIFICATION_REQUIRED`
|
||||
|
||||
Email verification is required for this action
|
||||
|
||||
@@ -197,6 +197,7 @@ Whether this deployment runs as one community, and whether direct messages exist
|
||||
| single_community | boolean | Whether this deployment runs as one community that every account joins |
|
||||
| single_community_guild_id<sup>1</sup> | ?snowflake | The ID of the guild every account joins in single-community mode, or null |
|
||||
| direct_messages_disabled | boolean | Whether direct messages and friend requests are disabled for the whole deployment |
|
||||
| guild_create_access | boolean | Whether every account can create communities, or only admins and holders of the `feature_guild_create` limit |
|
||||
|
||||
<sup>1</sup> The identifier is published only while `single_community` is true and the deployment has designated a community guild
|
||||
|
||||
@@ -319,6 +320,7 @@ Each key names one limit. A key whose name begins with `feature_` is a feature g
|
||||
| feature_custom_notification_sounds | Allow custom notification sounds, in user scope |
|
||||
| feature_early_access | Access to beta features, in user scope |
|
||||
| feature_global_expressions | Use expressions across all guilds, in user scope |
|
||||
| feature_guild_create | Create communities while the instance restricts community creation, in user scope |
|
||||
| feature_higher_video_quality | Access to higher video streaming quality, in user scope |
|
||||
| feature_per_guild_profiles | Different profile per guild, in user scope |
|
||||
| feature_voice_entrance_sounds | Play a sound when joining voice, in user scope |
|
||||
|
||||
@@ -64,6 +64,7 @@ export const APIErrorCodes = {
|
||||
DIRECT_MESSAGE_EMAIL_VERIFICATION_REQUIRED: 'DIRECT_MESSAGE_EMAIL_VERIFICATION_REQUIRED',
|
||||
FRIEND_REQUEST_EMAIL_VERIFICATION_REQUIRED: 'FRIEND_REQUEST_EMAIL_VERIFICATION_REQUIRED',
|
||||
GUILD_CREATION_EMAIL_VERIFICATION_REQUIRED: 'GUILD_CREATION_EMAIL_VERIFICATION_REQUIRED',
|
||||
GUILD_CREATION_PERMISSION_REQUIRED: 'GUILD_CREATION_PERMISSION_REQUIRED',
|
||||
GUILD_EMAIL_VERIFICATION_REQUIRED: 'GUILD_EMAIL_VERIFICATION_REQUIRED',
|
||||
MFA_EMAIL_VERIFICATION_REQUIRED: 'MFA_EMAIL_VERIFICATION_REQUIRED',
|
||||
PROFILE_EMAIL_VERIFICATION_REQUIRED: 'PROFILE_EMAIL_VERIFICATION_REQUIRED',
|
||||
|
||||
@@ -9,6 +9,7 @@ export const LIMIT_KEYS = [
|
||||
'feature_custom_notification_sounds',
|
||||
'feature_early_access',
|
||||
'feature_global_expressions',
|
||||
'feature_guild_create',
|
||||
'feature_higher_video_quality',
|
||||
'feature_per_guild_profiles',
|
||||
'feature_voice_entrance_sounds',
|
||||
@@ -58,6 +59,7 @@ export const LIMIT_KEY_SCOPES: Record<LimitKey, LimitScope> = {
|
||||
feature_custom_notification_sounds: 'user',
|
||||
feature_early_access: 'user',
|
||||
feature_global_expressions: 'user',
|
||||
feature_guild_create: 'user',
|
||||
feature_higher_video_quality: 'user',
|
||||
feature_per_guild_profiles: 'user',
|
||||
feature_voice_entrance_sounds: 'user',
|
||||
@@ -473,6 +475,14 @@ export const LIMIT_KEY_METADATA: Record<LimitKey, LimitKeyMetadata> = {
|
||||
scope: 'user',
|
||||
isToggle: true,
|
||||
},
|
||||
feature_guild_create: {
|
||||
key: 'feature_guild_create',
|
||||
label: 'Community Creation Access',
|
||||
description: 'Create communities while the instance restricts community creation',
|
||||
category: 'features',
|
||||
scope: 'user',
|
||||
isToggle: true,
|
||||
},
|
||||
feature_higher_video_quality: {
|
||||
key: 'feature_higher_video_quality',
|
||||
label: 'Higher Video Quality',
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
|
||||
import {ForbiddenError} from '@fluxer/errors/src/domains/core/ForbiddenError';
|
||||
|
||||
export class GuildCreationPermissionRequiredError extends ForbiddenError {
|
||||
constructor() {
|
||||
super({code: APIErrorCodes.GUILD_CREATION_PERMISSION_REQUIRED});
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ export const ErrorCodeToI18nKey = {
|
||||
[APIErrorCodes.ALREADY_FRIENDS]: 'friends_and_dms.already_friends',
|
||||
[APIErrorCodes.DIRECT_MESSAGES_DISABLED]: 'friends_and_dms.direct_messages_disabled',
|
||||
[APIErrorCodes.BOTS_CANNOT_CREATE_GUILDS]: 'channels_and_guilds.bots_cannot_create_guilds',
|
||||
[APIErrorCodes.GUILD_CREATION_PERMISSION_REQUIRED]: 'channels_and_guilds.guild_creation_permission_required',
|
||||
[APIErrorCodes.SINGLE_COMMUNITY_CANNOT_CREATE_GUILDS]: 'channels_and_guilds.single_community_cannot_create_guilds',
|
||||
[APIErrorCodes.SINGLE_COMMUNITY_CANNOT_DELETE]: 'channels_and_guilds.single_community_cannot_delete',
|
||||
[APIErrorCodes.SINGLE_COMMUNITY_CANNOT_LEAVE]: 'channels_and_guilds.single_community_cannot_leave',
|
||||
|
||||
@@ -192,6 +192,8 @@ export const ERROR_I18N_MESSAGES = {
|
||||
'Discoverable communities must have a verification level of at least Low.',
|
||||
'channels_and_guilds.group_dm_recipients_not_addable': "One or more selected users can't be added to this group DM.",
|
||||
'channels_and_guilds.guild_banner_requires_feature': 'Community banner requires BANNER feature.',
|
||||
'channels_and_guilds.guild_creation_permission_required':
|
||||
"You don't have permission to create communities on this instance. Contact your instance administrator to request access.",
|
||||
'channels_and_guilds.guild_feature_not_toggleable': 'This feature cannot be toggled.',
|
||||
'channels_and_guilds.guild_id_must_match_referenced_message':
|
||||
'Community ID must match the community containing the channel the referenced message was fetched from.',
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_AR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "يجب أن يكون مستوى التحقق في المجتمعات القابلة للاكتشاف \"منخفض\" على الأقل.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "لا يمكن إضافة واحد أو أكثر من المستخدمين المحددين إلى هذه المحادثة الجماعية.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "تتطلب لافتة المجتمع ميزة BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "لا تملك إذنًا لإنشاء مجتمعات على هذا المثيل. تواصل مع مسؤول المثيل لطلب الوصول.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "لا يمكن تفعيل هذه الميزة أو تعطيلها.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "يجب أن يكون معرف المجتمع مطابقًا للمجتمع الذي يضم القناة التي تم جلب الرسالة المرجعية منها.",
|
||||
"channels_and_guilds.guild_template_invalid": "بيانات قالب المجتمع غير صالحة أو تالفة.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_BG_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Откриваемите общности трябва да имат ниво на потвърждение поне „Ниско“.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Един или повече избрани потребители не могат да бъдат добавени към това групово DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Банерът на общността изисква функцията BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Нямаш разрешение да създаваш общности в тази инстанция. Свържи се с администратора на инстанцията, за да поискаш достъп.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Тази функция не може да се превключва.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID на общността трябва да съвпада с общността, която съдържа канала, от който е извлечено посоченото съобщение.",
|
||||
"channels_and_guilds.guild_template_invalid": "Данните на шаблона за общност са невалидни или неправилно форматирани.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_CS_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Komunity v Objevování musí mít úroveň ověření alespoň Nízká.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Jednoho nebo více vybraných uživatelů nelze přidat do této skupinové konverzace.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Banner komunity vyžaduje funkci BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Nemáte oprávnění vytvářet komunity na této instanci. Požádejte o přístup správce instance.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Tuto funkci nelze přepínat.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID komunity musí odpovídat komunitě, do které patří kanál, z něhož byla načtena odkazovaná zpráva.",
|
||||
"channels_and_guilds.guild_template_invalid": "Data šablony komunity jsou neplatná nebo chybná.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_DA_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Fællesskaber i Opdag skal have et verificeringsniveau på mindst Lavt.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "En eller flere valgte brugere kan ikke tilføjes til denne gruppe-DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Et fællesskabsbanner kræver funktionen BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Du har ikke tilladelse til at oprette fællesskaber på denne instans. Kontakt administratoren af instansen for at anmode om adgang.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Denne funktion kan ikke slås til eller fra.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Fællesskabs-id’et skal svare til det fællesskab, der indeholder den kanal, som den refererede besked blev hentet fra.",
|
||||
"channels_and_guilds.guild_template_invalid": "Dataene i fællesskabsskabelonen er ugyldige eller forkert formateret.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_DE_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Auffindbare Communitys müssen mindestens die Verifizierungsstufe \"Niedrig\" haben.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Ein oder mehrere ausgewählte Benutzer können dieser Gruppen-DM nicht hinzugefügt werden.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Community-Banner erfordert die BANNER-Funktion.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Du hast keine Berechtigung, auf dieser Instanz Communitys zu erstellen. Wende dich an den Administrator der Instanz, um Zugriff anzufragen.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Diese Funktion kann nicht umgeschaltet werden.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Die Community-ID muss mit der ID der Community übereinstimmen, zu der der Kanal gehört, aus dem die referenzierte Nachricht abgerufen wurde.",
|
||||
"channels_and_guilds.guild_template_invalid": "Die Daten der Community-Vorlage sind ungültig oder fehlerhaft.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_EL_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Οι κοινότητες προς ανακάλυψη πρέπει να έχουν επίπεδο επαλήθευσης τουλάχιστον «Χαμηλό».",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Ένας ή περισσότεροι επιλεγμένοι χρήστες δεν μπορούν να προστεθούν σε αυτό το ομαδικό DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Το banner της κοινότητας απαιτεί τη λειτουργία BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Δεν έχεις το δικαίωμα να δημιουργείς κοινότητες σε αυτή την εγκατάσταση. Επικοινώνησε με τον διαχειριστή της εγκατάστασης για να ζητήσεις πρόσβαση.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Αυτή η λειτουργία δεν μπορεί να αλλάξει.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Το αναγνωριστικό της κοινότητας πρέπει να ταιριάζει με την κοινότητα στην οποία ανήκει το κανάλι από το οποίο λήφθηκε το μήνυμα αναφοράς.",
|
||||
"channels_and_guilds.guild_template_invalid": "Τα δεδομένα του προτύπου κοινότητας είναι άκυρα ή κακοσχηματισμένα.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_EN_GB_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Discoverable communities must have a verification level of at least Low.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "One or more selected users can't be added to this group DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Community banner requires BANNER feature.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "You don't have permission to create communities on this instance. Contact your instance administrator to request access.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "This feature cannot be toggled.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Community ID must match the community containing the channel the referenced message was fetched from.",
|
||||
"channels_and_guilds.guild_template_invalid": "The community template data is invalid or malformed.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_ES_419_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Las comunidades que aparecen en Descubrir deben tener un nivel de verificación de al menos bajo.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Uno o más usuarios seleccionados no se pueden agregar a este MD de grupo.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "El banner de la comunidad requiere la función BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "No tienes permiso para crear comunidades en esta instancia. Contacta al administrador de la instancia para solicitar acceso.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Esta función no se puede activar ni desactivar.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "El ID de la comunidad debe coincidir con el de la comunidad a la que pertenece el canal del que se obtuvo el mensaje referenciado.",
|
||||
"channels_and_guilds.guild_template_invalid": "Los datos de la plantilla de la comunidad no son válidos o están mal formados.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_ES_ES_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Las comunidades que aparecen en Descubrir deben tener un nivel de verificación de al menos bajo.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "No se puede añadir a uno o más usuarios seleccionados a este MD de grupo.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "El banner de la comunidad requiere la característica BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "No tienes permiso para crear comunidades en esta instancia. Ponte en contacto con el administrador de la instancia para solicitar acceso.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Esta función no se puede activar ni desactivar.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "El ID de la comunidad debe coincidir con el de la comunidad a la que pertenece el canal del que se obtuvo el mensaje referenciado.",
|
||||
"channels_and_guilds.guild_template_invalid": "Los datos de la plantilla de la comunidad no son válidos o están mal formados.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_FI_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Löydettävien yhteisöjen vahvistustason on oltava vähintään matala.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Yhtä tai useampaa valittua käyttäjää ei voi lisätä tähän ryhmäkeskusteluun.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Yhteisön banneri vaatii BANNER-ominaisuuden.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Sinulla ei ole oikeutta luoda yhteisöjä tässä instanssissa. Pyydä käyttöoikeutta instanssin ylläpitäjältä.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Tätä ominaisuutta ei voi ottaa käyttöön tai poistaa käytöstä.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Yhteisön tunnuksen on vastattava yhteisöä, johon viitatun viestin lähdekanava kuuluu.",
|
||||
"channels_and_guilds.guild_template_invalid": "Yhteisöpohjan tiedot ovat virheelliset tai väärin muotoillut.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_FR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Les communautés présentes dans Découverte doivent avoir un niveau de vérification au moins égal à Faible.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Un ou plusieurs utilisateurs sélectionnés ne peuvent pas être ajoutés à ce MP de groupe.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "La bannière de la communauté nécessite la fonctionnalité BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Vous n’avez pas la permission de créer des communautés sur cette instance. Contactez l’administrateur de l’instance pour demander l’accès.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Cette fonctionnalité ne peut pas être activée ou désactivée.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "L’ID de communauté doit correspondre à la communauté contenant le salon d’où provient le message référencé.",
|
||||
"channels_and_guilds.guild_template_invalid": "Les données du modèle de la communauté sont invalides ou mal formatées.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_HE_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "קהילות הניתנות לגילוי חייבות להיות ברמת אימות \"נמוכה\" לפחות.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "לא ניתן להוסיף ל-DM הקבוצתי הזה חלק מהמשתמשים שנבחרו.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "באנר הקהילה דורש את התכונה BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "אין לך הרשאה ליצור קהילות במופע זה. יש לפנות למנהל המופע כדי לבקש גישה.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "לא ניתן להפעיל או לבטל תכונה זו.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "מזהה הקהילה חייב להתאים לקהילה שמכילה את הערוץ שממנו נשלפה ההודעה שאליה יש הפניה.",
|
||||
"channels_and_guilds.guild_template_invalid": "נתוני תבנית הקהילה שגויים או פגומים.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_HI_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "डिस्कवरेबल कम्युनिटी का वेरिफ़िकेशन लेवल कम से कम \"कम\" होना चाहिए।",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "चुने गए एक या ज़्यादा यूज़र को इस ग्रुप DM में नहीं जोड़ा जा सकता।",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "कम्युनिटी बैनर के लिए BANNER फ़ीचर ज़रूरी है।",
|
||||
"channels_and_guilds.guild_creation_permission_required": "आपके पास इस इंस्टेंस पर कम्युनिटी बनाने की अनुमति नहीं है। एक्सेस के लिए अपने इंस्टेंस एडमिन से संपर्क करें।",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "यह फ़ीचर टॉगल नहीं किया जा सकता।",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "कम्युनिटी ID उसी कम्युनिटी की होनी चाहिए जिसमें वह चैनल है जहाँ से रेफ़रेंस किया गया मैसेज लिया गया था।",
|
||||
"channels_and_guilds.guild_template_invalid": "कम्युनिटी टेम्पलेट डेटा अमान्य है या उसका फ़ॉर्मेट गलत है।",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_HR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Zajednice za otkrivanje moraju imati barem nisku razinu provjere.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Jedan ili više odabranih korisnika ne može se dodati u ovu grupnu izravnu poruku.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Banner zajednice zahtijeva značajku BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Nemaš dopuštenje za stvaranje zajednica na ovoj instanci. Javi se administratoru instance da zatražiš pristup.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Ova se značajka ne može uključiti ni isključiti.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID zajednice mora odgovarati zajednici koja sadrži kanal iz kojeg je dohvaćena referencirana poruka.",
|
||||
"channels_and_guilds.guild_template_invalid": "Podaci predloška zajednice su neispravni ili loše formatirani.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_HU_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "A felfedezhető közösségek ellenőrzési szintjének legalább Alacsonynak kell lennie.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Legalább egy kiválasztott felhasználó nem adható hozzá ehhez a csoportos beszélgetéshez.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "A közösségi borítóképhez a BANNER funkció szükséges.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Nincs jogosultságod közösségeket létrehozni ezen a példányon. A hozzáférésért fordulj a példány adminisztrátorához.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Ez a funkció nem kapcsolható be vagy ki.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "A közösség azonosítójának meg kell egyeznie a hivatkozott üzenet csatornáját tartalmazó közösség azonosítójával.",
|
||||
"channels_and_guilds.guild_template_invalid": "A közösségsablon adatai érvénytelenek vagy hibásak.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_ID_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Komunitas yang bisa ditemukan harus memiliki tingkat verifikasi minimal Rendah.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Satu atau lebih pengguna yang dipilih tidak bisa ditambahkan ke DM grup ini.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Banner komunitas memerlukan fitur BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Kamu tidak punya izin untuk membuat komunitas di instance ini. Hubungi admin instance untuk meminta akses.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Fitur ini tidak bisa diaktifkan atau dinonaktifkan.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID komunitas harus cocok dengan komunitas yang memuat saluran tempat pesan yang dirujuk diambil.",
|
||||
"channels_and_guilds.guild_template_invalid": "Data template komunitas tidak valid atau salah format.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_IT_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Le community presenti in Scopri devono avere un livello di verifica almeno basso.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Uno o più utenti selezionati non possono essere aggiunti a questo DM di gruppo.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Il banner della community richiede la funzionalità BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Non hai il permesso di creare community su questa istanza. Contatta l'amministratore dell'istanza per richiedere l'accesso.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Questa funzionalità non può essere attivata o disattivata.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "L’ID della community deve corrispondere a quello della community che contiene il canale da cui è stato recuperato il messaggio a cui si fa riferimento.",
|
||||
"channels_and_guilds.guild_template_invalid": "I dati del modello della community non sono validi o sono malformati.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_JA_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "「見つける」に掲載されるコミュニティは、認証レベルが「低」以上である必要があります。",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "選択したユーザーの一部をこのグループDMに追加できません。",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "コミュニティバナーにはBANNER機能が必要です。",
|
||||
"channels_and_guilds.guild_creation_permission_required": "このインスタンスでコミュニティを作成する権限がありません。アクセスをリクエストするには、インスタンスの管理者にお問い合わせください。",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "この機能は切り替えられません。",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "コミュニティIDは、参照メッセージの取得元チャンネルが属するコミュニティと一致する必要があります。",
|
||||
"channels_and_guilds.guild_template_invalid": "コミュニティテンプレートデータが無効または不正な形式です。",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_KO_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "검색 가능한 커뮤니티는 인증 수준이 \"낮음\" 이상이어야 해요.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "선택한 사용자 중 한 명 이상을 이 그룹 DM에 추가할 수 없어요.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "커뮤니티 배너에는 BANNER 기능이 필요해요.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "이 인스턴스에서 커뮤니티를 만들 권한이 없어요. 접근 권한을 요청하려면 인스턴스 관리자에게 문의해 주세요.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "이 기능은 켜고 끌 수 없어요.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "커뮤니티 ID는 참조된 메시지를 가져온 채널이 속한 커뮤니티와 일치해야 해요.",
|
||||
"channels_and_guilds.guild_template_invalid": "커뮤니티 템플릿 데이터가 유효하지 않거나 형식이 잘못되었어요.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_LT_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Atradimo sąraše rodomų bendruomenių patvirtinimo lygis turi būti bent žemas.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Vieno ar daugiau pasirinktų naudotojų negalima pridėti prie šios grupės DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Bendruomenės baneriui reikalinga BANNER funkcija.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Neturi leidimo kurti bendruomenių šioje instancijoje. Norėdamas gauti prieigą, susisiek su instancijos administratoriumi.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Šios funkcijos negalima įjungti ar išjungti.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Bendruomenės ID turi atitikti bendruomenę, kuriai priklauso kanalas, iš kurio gauta nurodyta žinutė.",
|
||||
"channels_and_guilds.guild_template_invalid": "Bendruomenės šablono duomenys neteisingi arba sugadinti.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_NL_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Communities in Ontdekken moeten minstens het verificatieniveau Laag hebben.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Een of meer geselecteerde gebruikers kunnen niet worden toegevoegd aan deze groeps-DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Een communitybanner vereist de functie BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Je hebt geen toestemming om communities aan te maken op deze instantie. Neem contact op met de beheerder van de instantie om toegang aan te vragen.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Deze functie kan niet worden in- of uitgeschakeld.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "De community-ID moet horen bij de community die het kanaal bevat waaruit het betreffende bericht is opgehaald.",
|
||||
"channels_and_guilds.guild_template_invalid": "De gegevens van het communitysjabloon zijn ongeldig of onjuist opgemaakt.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_NO_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Fellesskap i Oppdag må ha et verifiseringsnivå på minst «Lav».",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Én eller flere valgte brukere kan ikke legges til i denne gruppechatten.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Et fellesskapsbanner krever funksjonen BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Du har ikke tillatelse til å opprette fellesskap på denne instansen. Kontakt administratoren for instansen for å be om tilgang.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Denne funksjonen kan ikke slås av eller på.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Fellesskaps-ID-en må samsvare med fellesskapet som inneholder kanalen den refererte meldingen ble hentet fra.",
|
||||
"channels_and_guilds.guild_template_invalid": "Dataene for fellesskapsmalen er ugyldige eller feilformaterte.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_PL_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Społeczności widoczne w sekcji Odkrywanie muszą mieć poziom weryfikacji co najmniej Niski.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Co najmniej jednego z wybranych użytkowników nie można dodać do tego czatu grupowego.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Baner społeczności wymaga funkcji BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Nie masz uprawnień do tworzenia społeczności w tej instancji. Skontaktuj się z administratorem instancji, aby poprosić o dostęp.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Nie można przełączyć tej funkcji.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Identyfikator społeczności musi być zgodny ze społecznością, do której należy kanał, z którego pobrano wskazaną wiadomość.",
|
||||
"channels_and_guilds.guild_template_invalid": "Dane szablonu społeczności są nieprawidłowe lub źle sformatowane.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_PT_BR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "As comunidades exibidas em Descobrir devem ter um nível de verificação de, no mínimo, Baixo.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Um ou mais usuários selecionados não podem ser adicionados a esta conversa em grupo.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "O banner da comunidade requer o recurso BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Você não tem permissão para criar comunidades nesta instância. Entre em contato com o administrador da instância para solicitar acesso.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Este recurso não pode ser alternado.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "O ID da comunidade deve corresponder à comunidade que contém o canal de onde a mensagem referenciada foi obtida.",
|
||||
"channels_and_guilds.guild_template_invalid": "Os dados do modelo da comunidade são inválidos ou malformados.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_RO_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Comunitățile listate în Discovery trebuie să aibă un nivel de verificare de cel puțin Scăzut.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Unul sau mai mulți utilizatori selectați nu pot fi adăugați la acest DM de grup.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Bannerul comunității necesită funcția BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Nu ai permisiunea de a crea comunități pe această instanță. Contactează administratorul instanței pentru a solicita acces.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Această funcție nu poate fi comutată.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID-ul comunității trebuie să corespundă comunității care conține canalul din care a fost preluat mesajul referit.",
|
||||
"channels_and_guilds.guild_template_invalid": "Datele șablonului comunității sunt invalide sau incorect formate.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_RU_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Видимые в каталоге сообщества должны иметь уровень проверки не ниже «Низкий».",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Одного или нескольких выбранных пользователей нельзя добавить в этот групповой чат.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Для баннера сообщества требуется функция BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "У тебя нет прав на создание сообществ в этом экземпляре. Обратись к администратору экземпляра, чтобы запросить доступ.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Эту функцию нельзя переключить.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID сообщества должен совпадать с сообществом, которому принадлежит канал, откуда было получено указанное сообщение.",
|
||||
"channels_and_guilds.guild_template_invalid": "Данные шаблона сообщества недействительны или повреждены.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_SV_SE_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Communities som visas i Upptäck måste ha verifieringsnivån Låg eller högre.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "En eller flera av de valda användarna kan inte läggas till i den här grupp-DM:n.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "En communitybanner kräver funktionen BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Du har inte behörighet att skapa communities på den här instansen. Kontakta instansens administratör för att begära åtkomst.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Den här funktionen kan inte aktiveras eller inaktiveras.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Community-ID:t måste avse den community som innehåller kanalen där det refererade meddelandet hämtades.",
|
||||
"channels_and_guilds.guild_template_invalid": "Data för communitymallen är ogiltiga eller felaktigt formaterade.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_TH_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "คอมมูนิตี้ที่เปิดให้ค้นพบได้ต้องมีระดับการยืนยันอย่างน้อยระดับต่ำ",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "ไม่สามารถเพิ่มผู้ใช้ที่เลือกไว้อย่างน้อยหนึ่งคนเข้าแชตกลุ่มนี้ได้",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "แบนเนอร์คอมมูนิตี้ต้องมีฟีเจอร์ BANNER",
|
||||
"channels_and_guilds.guild_creation_permission_required": "คุณไม่มีสิทธิ์สร้างคอมมูนิตี้บนอินสแตนซ์นี้ โปรดติดต่อผู้ดูแลอินสแตนซ์เพื่อขอสิทธิ์เข้าถึง",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "ไม่สามารถเปิดปิดฟีเจอร์นี้ได้",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID คอมมูนิตี้ต้องตรงกับคอมมูนิตี้ที่มีช่องซึ่งดึงข้อความอ้างอิงมา",
|
||||
"channels_and_guilds.guild_template_invalid": "ข้อมูลเทมเพลตคอมมูนิตี้ไม่ถูกต้องหรือมีรูปแบบผิด",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_TR_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Keşfedilebilir topluluklar en az düşük doğrulama seviyesine sahip olmalı.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Seçilen bir veya daha fazla kullanıcı bu grup DM'sine eklenemiyor.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Topluluk banner'ı BANNER özelliği gerektirir.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Bu kurulumda topluluk oluşturma yetkin yok. Erişim istemek için kurulumun yöneticisiyle iletişime geç.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Bu özellik açılıp kapatılamaz.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Topluluk kimliği, başvurulan mesajın alındığı kanalın bulunduğu toplulukla eşleşmeli.",
|
||||
"channels_and_guilds.guild_template_invalid": "Topluluk şablonu verileri geçersiz veya hatalı biçimlendirilmiş.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_UK_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "У спільнот, відкритих для пошуку, рівень перевірки має бути щонайменше «Низький».",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Одного або кількох вибраних користувачів не можна додати до цього групового чату.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Для банера спільноти потрібна функція BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "У тебе немає дозволу створювати спільноти в цьому екземплярі. Звернись до адміністратора екземпляра, щоб запросити доступ.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Цю функцію не можна перемкнути.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID спільноти має збігатися зі спільнотою, якій належить канал, з якого отримано вказане повідомлення.",
|
||||
"channels_and_guilds.guild_template_invalid": "Дані шаблону спільноти недійсні або пошкоджені.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_VI_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Cộng đồng có trong danh sách Khám phá phải có mức xác minh tối thiểu là Thấp.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Không thể thêm một hoặc nhiều người dùng đã chọn vào tin nhắn nhóm này.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Ảnh bìa cộng đồng yêu cầu tính năng BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Bạn không có quyền tạo cộng đồng trên phiên bản này. Vui lòng liên hệ quản trị viên của phiên bản để yêu cầu quyền truy cập.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Không thể bật/tắt tính năng này.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID cộng đồng phải khớp với cộng đồng chứa kênh mà tin nhắn được tham chiếu được lấy từ đó.",
|
||||
"channels_and_guilds.guild_template_invalid": "Dữ liệu mẫu cộng đồng không hợp lệ hoặc sai định dạng.",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_ZH_CN_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "可发现的社区验证等级至少要设为“低”。",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "某些选中的用户无法添加到该群聊。",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "社区横幅需要启用 BANNER 功能。",
|
||||
"channels_and_guilds.guild_creation_permission_required": "你没有在此实例上创建社区的权限。请联系实例管理员申请访问权限。",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "此功能无法切换。",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "社区 ID 必须与引用消息所在频道所属的社区一致。",
|
||||
"channels_and_guilds.guild_template_invalid": "社区模板数据无效或格式错误。",
|
||||
|
||||
@@ -163,6 +163,7 @@ const ERROR_I18N_ZH_TW_MESSAGES = defineErrorI18nLocaleMessages({
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "可探索社群的驗證等級至少須為「低」。",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "有一或多個選取的使用者無法加入此群組私訊。",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "社群橫幅需要 BANNER 功能。",
|
||||
"channels_and_guilds.guild_creation_permission_required": "你沒有在此實例上建立社群的權限。請聯絡實例管理員以申請存取權限。",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "此功能無法切換。",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "社群 ID 必須與取得參考訊息的頻道所屬的社群相符。",
|
||||
"channels_and_guilds.guild_template_invalid": "社群範本資料無效或格式錯誤。",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "يجب أن يكون مستوى التحقق في المجتمعات القابلة للاكتشاف \"منخفض\" على الأقل.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "لا يمكن إضافة واحد أو أكثر من المستخدمين المحددين إلى هذه المحادثة الجماعية.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "تتطلب لافتة المجتمع ميزة BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "لا تملك إذنًا لإنشاء مجتمعات على هذا المثيل. تواصل مع مسؤول المثيل لطلب الوصول.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "لا يمكن تفعيل هذه الميزة أو تعطيلها.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "يجب أن يكون معرف المجتمع مطابقًا للمجتمع الذي يضم القناة التي تم جلب الرسالة المرجعية منها.",
|
||||
"channels_and_guilds.guild_template_invalid": "بيانات قالب المجتمع غير صالحة أو تالفة.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Откриваемите общности трябва да имат ниво на потвърждение поне „Ниско“.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Един или повече избрани потребители не могат да бъдат добавени към това групово DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Банерът на общността изисква функцията BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Нямаш разрешение да създаваш общности в тази инстанция. Свържи се с администратора на инстанцията, за да поискаш достъп.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Тази функция не може да се превключва.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID на общността трябва да съвпада с общността, която съдържа канала, от който е извлечено посоченото съобщение.",
|
||||
"channels_and_guilds.guild_template_invalid": "Данните на шаблона за общност са невалидни или неправилно форматирани.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Komunity v Objevování musí mít úroveň ověření alespoň Nízká.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Jednoho nebo více vybraných uživatelů nelze přidat do této skupinové konverzace.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Banner komunity vyžaduje funkci BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Nemáte oprávnění vytvářet komunity na této instanci. Požádejte o přístup správce instance.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Tuto funkci nelze přepínat.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID komunity musí odpovídat komunitě, do které patří kanál, z něhož byla načtena odkazovaná zpráva.",
|
||||
"channels_and_guilds.guild_template_invalid": "Data šablony komunity jsou neplatná nebo chybná.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Fællesskaber i Opdag skal have et verificeringsniveau på mindst Lavt.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "En eller flere valgte brugere kan ikke tilføjes til denne gruppe-DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Et fællesskabsbanner kræver funktionen BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Du har ikke tilladelse til at oprette fællesskaber på denne instans. Kontakt administratoren af instansen for at anmode om adgang.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Denne funktion kan ikke slås til eller fra.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Fællesskabs-id’et skal svare til det fællesskab, der indeholder den kanal, som den refererede besked blev hentet fra.",
|
||||
"channels_and_guilds.guild_template_invalid": "Dataene i fællesskabsskabelonen er ugyldige eller forkert formateret.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Auffindbare Communitys müssen mindestens die Verifizierungsstufe \"Niedrig\" haben.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Ein oder mehrere ausgewählte Benutzer können dieser Gruppen-DM nicht hinzugefügt werden.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Community-Banner erfordert die BANNER-Funktion.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Du hast keine Berechtigung, auf dieser Instanz Communitys zu erstellen. Wende dich an den Administrator der Instanz, um Zugriff anzufragen.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Diese Funktion kann nicht umgeschaltet werden.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Die Community-ID muss mit der ID der Community übereinstimmen, zu der der Kanal gehört, aus dem die referenzierte Nachricht abgerufen wurde.",
|
||||
"channels_and_guilds.guild_template_invalid": "Die Daten der Community-Vorlage sind ungültig oder fehlerhaft.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Οι κοινότητες προς ανακάλυψη πρέπει να έχουν επίπεδο επαλήθευσης τουλάχιστον «Χαμηλό».",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Ένας ή περισσότεροι επιλεγμένοι χρήστες δεν μπορούν να προστεθούν σε αυτό το ομαδικό DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Το banner της κοινότητας απαιτεί τη λειτουργία BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Δεν έχεις το δικαίωμα να δημιουργείς κοινότητες σε αυτή την εγκατάσταση. Επικοινώνησε με τον διαχειριστή της εγκατάστασης για να ζητήσεις πρόσβαση.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Αυτή η λειτουργία δεν μπορεί να αλλάξει.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Το αναγνωριστικό της κοινότητας πρέπει να ταιριάζει με την κοινότητα στην οποία ανήκει το κανάλι από το οποίο λήφθηκε το μήνυμα αναφοράς.",
|
||||
"channels_and_guilds.guild_template_invalid": "Τα δεδομένα του προτύπου κοινότητας είναι άκυρα ή κακοσχηματισμένα.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Discoverable communities must have a verification level of at least Low.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "One or more selected users can't be added to this group DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Community banner requires BANNER feature.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "You don't have permission to create communities on this instance. Contact your instance administrator to request access.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "This feature cannot be toggled.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Community ID must match the community containing the channel the referenced message was fetched from.",
|
||||
"channels_and_guilds.guild_template_invalid": "The community template data is invalid or malformed.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Las comunidades que aparecen en Descubrir deben tener un nivel de verificación de al menos bajo.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Uno o más usuarios seleccionados no se pueden agregar a este MD de grupo.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "El banner de la comunidad requiere la función BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "No tienes permiso para crear comunidades en esta instancia. Contacta al administrador de la instancia para solicitar acceso.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Esta función no se puede activar ni desactivar.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "El ID de la comunidad debe coincidir con el de la comunidad a la que pertenece el canal del que se obtuvo el mensaje referenciado.",
|
||||
"channels_and_guilds.guild_template_invalid": "Los datos de la plantilla de la comunidad no son válidos o están mal formados.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Las comunidades que aparecen en Descubrir deben tener un nivel de verificación de al menos bajo.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "No se puede añadir a uno o más usuarios seleccionados a este MD de grupo.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "El banner de la comunidad requiere la característica BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "No tienes permiso para crear comunidades en esta instancia. Ponte en contacto con el administrador de la instancia para solicitar acceso.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Esta función no se puede activar ni desactivar.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "El ID de la comunidad debe coincidir con el de la comunidad a la que pertenece el canal del que se obtuvo el mensaje referenciado.",
|
||||
"channels_and_guilds.guild_template_invalid": "Los datos de la plantilla de la comunidad no son válidos o están mal formados.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Löydettävien yhteisöjen vahvistustason on oltava vähintään matala.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Yhtä tai useampaa valittua käyttäjää ei voi lisätä tähän ryhmäkeskusteluun.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Yhteisön banneri vaatii BANNER-ominaisuuden.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Sinulla ei ole oikeutta luoda yhteisöjä tässä instanssissa. Pyydä käyttöoikeutta instanssin ylläpitäjältä.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Tätä ominaisuutta ei voi ottaa käyttöön tai poistaa käytöstä.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Yhteisön tunnuksen on vastattava yhteisöä, johon viitatun viestin lähdekanava kuuluu.",
|
||||
"channels_and_guilds.guild_template_invalid": "Yhteisöpohjan tiedot ovat virheelliset tai väärin muotoillut.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Les communautés présentes dans Découverte doivent avoir un niveau de vérification au moins égal à Faible.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Un ou plusieurs utilisateurs sélectionnés ne peuvent pas être ajoutés à ce MP de groupe.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "La bannière de la communauté nécessite la fonctionnalité BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Vous n’avez pas la permission de créer des communautés sur cette instance. Contactez l’administrateur de l’instance pour demander l’accès.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Cette fonctionnalité ne peut pas être activée ou désactivée.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "L’ID de communauté doit correspondre à la communauté contenant le salon d’où provient le message référencé.",
|
||||
"channels_and_guilds.guild_template_invalid": "Les données du modèle de la communauté sont invalides ou mal formatées.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "קהילות הניתנות לגילוי חייבות להיות ברמת אימות \"נמוכה\" לפחות.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "לא ניתן להוסיף ל-DM הקבוצתי הזה חלק מהמשתמשים שנבחרו.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "באנר הקהילה דורש את התכונה BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "אין לך הרשאה ליצור קהילות במופע זה. יש לפנות למנהל המופע כדי לבקש גישה.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "לא ניתן להפעיל או לבטל תכונה זו.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "מזהה הקהילה חייב להתאים לקהילה שמכילה את הערוץ שממנו נשלפה ההודעה שאליה יש הפניה.",
|
||||
"channels_and_guilds.guild_template_invalid": "נתוני תבנית הקהילה שגויים או פגומים.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "डिस्कवरेबल कम्युनिटी का वेरिफ़िकेशन लेवल कम से कम \"कम\" होना चाहिए।",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "चुने गए एक या ज़्यादा यूज़र को इस ग्रुप DM में नहीं जोड़ा जा सकता।",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "कम्युनिटी बैनर के लिए BANNER फ़ीचर ज़रूरी है।",
|
||||
"channels_and_guilds.guild_creation_permission_required": "आपके पास इस इंस्टेंस पर कम्युनिटी बनाने की अनुमति नहीं है। एक्सेस के लिए अपने इंस्टेंस एडमिन से संपर्क करें।",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "यह फ़ीचर टॉगल नहीं किया जा सकता।",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "कम्युनिटी ID उसी कम्युनिटी की होनी चाहिए जिसमें वह चैनल है जहाँ से रेफ़रेंस किया गया मैसेज लिया गया था।",
|
||||
"channels_and_guilds.guild_template_invalid": "कम्युनिटी टेम्पलेट डेटा अमान्य है या उसका फ़ॉर्मेट गलत है।",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Zajednice za otkrivanje moraju imati barem nisku razinu provjere.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Jedan ili više odabranih korisnika ne može se dodati u ovu grupnu izravnu poruku.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Banner zajednice zahtijeva značajku BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Nemaš dopuštenje za stvaranje zajednica na ovoj instanci. Javi se administratoru instance da zatražiš pristup.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Ova se značajka ne može uključiti ni isključiti.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID zajednice mora odgovarati zajednici koja sadrži kanal iz kojeg je dohvaćena referencirana poruka.",
|
||||
"channels_and_guilds.guild_template_invalid": "Podaci predloška zajednice su neispravni ili loše formatirani.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "A felfedezhető közösségek ellenőrzési szintjének legalább Alacsonynak kell lennie.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Legalább egy kiválasztott felhasználó nem adható hozzá ehhez a csoportos beszélgetéshez.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "A közösségi borítóképhez a BANNER funkció szükséges.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Nincs jogosultságod közösségeket létrehozni ezen a példányon. A hozzáférésért fordulj a példány adminisztrátorához.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Ez a funkció nem kapcsolható be vagy ki.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "A közösség azonosítójának meg kell egyeznie a hivatkozott üzenet csatornáját tartalmazó közösség azonosítójával.",
|
||||
"channels_and_guilds.guild_template_invalid": "A közösségsablon adatai érvénytelenek vagy hibásak.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Komunitas yang bisa ditemukan harus memiliki tingkat verifikasi minimal Rendah.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Satu atau lebih pengguna yang dipilih tidak bisa ditambahkan ke DM grup ini.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Banner komunitas memerlukan fitur BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Kamu tidak punya izin untuk membuat komunitas di instance ini. Hubungi admin instance untuk meminta akses.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Fitur ini tidak bisa diaktifkan atau dinonaktifkan.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID komunitas harus cocok dengan komunitas yang memuat saluran tempat pesan yang dirujuk diambil.",
|
||||
"channels_and_guilds.guild_template_invalid": "Data template komunitas tidak valid atau salah format.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Le community presenti in Scopri devono avere un livello di verifica almeno basso.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Uno o più utenti selezionati non possono essere aggiunti a questo DM di gruppo.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Il banner della community richiede la funzionalità BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Non hai il permesso di creare community su questa istanza. Contatta l'amministratore dell'istanza per richiedere l'accesso.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Questa funzionalità non può essere attivata o disattivata.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "L’ID della community deve corrispondere a quello della community che contiene il canale da cui è stato recuperato il messaggio a cui si fa riferimento.",
|
||||
"channels_and_guilds.guild_template_invalid": "I dati del modello della community non sono validi o sono malformati.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "「見つける」に掲載されるコミュニティは、認証レベルが「低」以上である必要があります。",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "選択したユーザーの一部をこのグループDMに追加できません。",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "コミュニティバナーにはBANNER機能が必要です。",
|
||||
"channels_and_guilds.guild_creation_permission_required": "このインスタンスでコミュニティを作成する権限がありません。アクセスをリクエストするには、インスタンスの管理者にお問い合わせください。",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "この機能は切り替えられません。",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "コミュニティIDは、参照メッセージの取得元チャンネルが属するコミュニティと一致する必要があります。",
|
||||
"channels_and_guilds.guild_template_invalid": "コミュニティテンプレートデータが無効または不正な形式です。",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "검색 가능한 커뮤니티는 인증 수준이 \"낮음\" 이상이어야 해요.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "선택한 사용자 중 한 명 이상을 이 그룹 DM에 추가할 수 없어요.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "커뮤니티 배너에는 BANNER 기능이 필요해요.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "이 인스턴스에서 커뮤니티를 만들 권한이 없어요. 접근 권한을 요청하려면 인스턴스 관리자에게 문의해 주세요.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "이 기능은 켜고 끌 수 없어요.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "커뮤니티 ID는 참조된 메시지를 가져온 채널이 속한 커뮤니티와 일치해야 해요.",
|
||||
"channels_and_guilds.guild_template_invalid": "커뮤니티 템플릿 데이터가 유효하지 않거나 형식이 잘못되었어요.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Atradimo sąraše rodomų bendruomenių patvirtinimo lygis turi būti bent žemas.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Vieno ar daugiau pasirinktų naudotojų negalima pridėti prie šios grupės DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Bendruomenės baneriui reikalinga BANNER funkcija.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Neturi leidimo kurti bendruomenių šioje instancijoje. Norėdamas gauti prieigą, susisiek su instancijos administratoriumi.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Šios funkcijos negalima įjungti ar išjungti.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Bendruomenės ID turi atitikti bendruomenę, kuriai priklauso kanalas, iš kurio gauta nurodyta žinutė.",
|
||||
"channels_and_guilds.guild_template_invalid": "Bendruomenės šablono duomenys neteisingi arba sugadinti.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Communities in Ontdekken moeten minstens het verificatieniveau Laag hebben.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Een of meer geselecteerde gebruikers kunnen niet worden toegevoegd aan deze groeps-DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Een communitybanner vereist de functie BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Je hebt geen toestemming om communities aan te maken op deze instantie. Neem contact op met de beheerder van de instantie om toegang aan te vragen.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Deze functie kan niet worden in- of uitgeschakeld.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "De community-ID moet horen bij de community die het kanaal bevat waaruit het betreffende bericht is opgehaald.",
|
||||
"channels_and_guilds.guild_template_invalid": "De gegevens van het communitysjabloon zijn ongeldig of onjuist opgemaakt.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Fellesskap i Oppdag må ha et verifiseringsnivå på minst «Lav».",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Én eller flere valgte brukere kan ikke legges til i denne gruppechatten.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Et fellesskapsbanner krever funksjonen BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Du har ikke tillatelse til å opprette fellesskap på denne instansen. Kontakt administratoren for instansen for å be om tilgang.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Denne funksjonen kan ikke slås av eller på.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Fellesskaps-ID-en må samsvare med fellesskapet som inneholder kanalen den refererte meldingen ble hentet fra.",
|
||||
"channels_and_guilds.guild_template_invalid": "Dataene for fellesskapsmalen er ugyldige eller feilformaterte.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Społeczności widoczne w sekcji Odkrywanie muszą mieć poziom weryfikacji co najmniej Niski.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Co najmniej jednego z wybranych użytkowników nie można dodać do tego czatu grupowego.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Baner społeczności wymaga funkcji BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Nie masz uprawnień do tworzenia społeczności w tej instancji. Skontaktuj się z administratorem instancji, aby poprosić o dostęp.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Nie można przełączyć tej funkcji.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Identyfikator społeczności musi być zgodny ze społecznością, do której należy kanał, z którego pobrano wskazaną wiadomość.",
|
||||
"channels_and_guilds.guild_template_invalid": "Dane szablonu społeczności są nieprawidłowe lub źle sformatowane.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "As comunidades exibidas em Descobrir devem ter um nível de verificação de, no mínimo, Baixo.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Um ou mais usuários selecionados não podem ser adicionados a esta conversa em grupo.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "O banner da comunidade requer o recurso BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Você não tem permissão para criar comunidades nesta instância. Entre em contato com o administrador da instância para solicitar acesso.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Este recurso não pode ser alternado.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "O ID da comunidade deve corresponder à comunidade que contém o canal de onde a mensagem referenciada foi obtida.",
|
||||
"channels_and_guilds.guild_template_invalid": "Os dados do modelo da comunidade são inválidos ou malformados.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Comunitățile listate în Discovery trebuie să aibă un nivel de verificare de cel puțin Scăzut.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Unul sau mai mulți utilizatori selectați nu pot fi adăugați la acest DM de grup.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Bannerul comunității necesită funcția BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Nu ai permisiunea de a crea comunități pe această instanță. Contactează administratorul instanței pentru a solicita acces.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Această funcție nu poate fi comutată.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID-ul comunității trebuie să corespundă comunității care conține canalul din care a fost preluat mesajul referit.",
|
||||
"channels_and_guilds.guild_template_invalid": "Datele șablonului comunității sunt invalide sau incorect formate.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Видимые в каталоге сообщества должны иметь уровень проверки не ниже «Низкий».",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Одного или нескольких выбранных пользователей нельзя добавить в этот групповой чат.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Для баннера сообщества требуется функция BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "У тебя нет прав на создание сообществ в этом экземпляре. Обратись к администратору экземпляра, чтобы запросить доступ.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Эту функцию нельзя переключить.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID сообщества должен совпадать с сообществом, которому принадлежит канал, откуда было получено указанное сообщение.",
|
||||
"channels_and_guilds.guild_template_invalid": "Данные шаблона сообщества недействительны или повреждены.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Communities som visas i Upptäck måste ha verifieringsnivån Låg eller högre.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "En eller flera av de valda användarna kan inte läggas till i den här grupp-DM:n.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "En communitybanner kräver funktionen BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Du har inte behörighet att skapa communities på den här instansen. Kontakta instansens administratör för att begära åtkomst.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Den här funktionen kan inte aktiveras eller inaktiveras.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Community-ID:t måste avse den community som innehåller kanalen där det refererade meddelandet hämtades.",
|
||||
"channels_and_guilds.guild_template_invalid": "Data för communitymallen är ogiltiga eller felaktigt formaterade.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "คอมมูนิตี้ที่เปิดให้ค้นพบได้ต้องมีระดับการยืนยันอย่างน้อยระดับต่ำ",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "ไม่สามารถเพิ่มผู้ใช้ที่เลือกไว้อย่างน้อยหนึ่งคนเข้าแชตกลุ่มนี้ได้",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "แบนเนอร์คอมมูนิตี้ต้องมีฟีเจอร์ BANNER",
|
||||
"channels_and_guilds.guild_creation_permission_required": "คุณไม่มีสิทธิ์สร้างคอมมูนิตี้บนอินสแตนซ์นี้ โปรดติดต่อผู้ดูแลอินสแตนซ์เพื่อขอสิทธิ์เข้าถึง",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "ไม่สามารถเปิดปิดฟีเจอร์นี้ได้",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID คอมมูนิตี้ต้องตรงกับคอมมูนิตี้ที่มีช่องซึ่งดึงข้อความอ้างอิงมา",
|
||||
"channels_and_guilds.guild_template_invalid": "ข้อมูลเทมเพลตคอมมูนิตี้ไม่ถูกต้องหรือมีรูปแบบผิด",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Keşfedilebilir topluluklar en az düşük doğrulama seviyesine sahip olmalı.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Seçilen bir veya daha fazla kullanıcı bu grup DM'sine eklenemiyor.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Topluluk banner'ı BANNER özelliği gerektirir.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Bu kurulumda topluluk oluşturma yetkin yok. Erişim istemek için kurulumun yöneticisiyle iletişime geç.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Bu özellik açılıp kapatılamaz.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Topluluk kimliği, başvurulan mesajın alındığı kanalın bulunduğu toplulukla eşleşmeli.",
|
||||
"channels_and_guilds.guild_template_invalid": "Topluluk şablonu verileri geçersiz veya hatalı biçimlendirilmiş.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "У спільнот, відкритих для пошуку, рівень перевірки має бути щонайменше «Низький».",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Одного або кількох вибраних користувачів не можна додати до цього групового чату.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Для банера спільноти потрібна функція BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "У тебе немає дозволу створювати спільноти в цьому екземплярі. Звернись до адміністратора екземпляра, щоб запросити доступ.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Цю функцію не можна перемкнути.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID спільноти має збігатися зі спільнотою, якій належить канал, з якого отримано вказане повідомлення.",
|
||||
"channels_and_guilds.guild_template_invalid": "Дані шаблону спільноти недійсні або пошкоджені.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Cộng đồng có trong danh sách Khám phá phải có mức xác minh tối thiểu là Thấp.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "Không thể thêm một hoặc nhiều người dùng đã chọn vào tin nhắn nhóm này.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Ảnh bìa cộng đồng yêu cầu tính năng BANNER.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "Bạn không có quyền tạo cộng đồng trên phiên bản này. Vui lòng liên hệ quản trị viên của phiên bản để yêu cầu quyền truy cập.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "Không thể bật/tắt tính năng này.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "ID cộng đồng phải khớp với cộng đồng chứa kênh mà tin nhắn được tham chiếu được lấy từ đó.",
|
||||
"channels_and_guilds.guild_template_invalid": "Dữ liệu mẫu cộng đồng không hợp lệ hoặc sai định dạng.",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "可发现的社区验证等级至少要设为“低”。",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "某些选中的用户无法添加到该群聊。",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "社区横幅需要启用 BANNER 功能。",
|
||||
"channels_and_guilds.guild_creation_permission_required": "你没有在此实例上创建社区的权限。请联系实例管理员申请访问权限。",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "此功能无法切换。",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "社区 ID 必须与引用消息所在频道所属的社区一致。",
|
||||
"channels_and_guilds.guild_template_invalid": "社区模板数据无效或格式错误。",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "可探索社群的驗證等級至少須為「低」。",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "有一或多個選取的使用者無法加入此群組私訊。",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "社群橫幅需要 BANNER 功能。",
|
||||
"channels_and_guilds.guild_creation_permission_required": "你沒有在此實例上建立社群的權限。請聯絡實例管理員以申請存取權限。",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "此功能無法切換。",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "社群 ID 必須與取得參考訊息的頻道所屬的社群相符。",
|
||||
"channels_and_guilds.guild_template_invalid": "社群範本資料無效或格式錯誤。",
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
"channels_and_guilds.discoverable_guild_verification_level_too_low": "Discoverable communities must have a verification level of at least Low.",
|
||||
"channels_and_guilds.group_dm_recipients_not_addable": "One or more selected users can't be added to this group DM.",
|
||||
"channels_and_guilds.guild_banner_requires_feature": "Community banner requires BANNER feature.",
|
||||
"channels_and_guilds.guild_creation_permission_required": "You don't have permission to create communities on this instance. Contact your instance administrator to request access.",
|
||||
"channels_and_guilds.guild_feature_not_toggleable": "This feature cannot be toggled.",
|
||||
"channels_and_guilds.guild_id_must_match_referenced_message": "Community ID must match the community containing the channel the referenced message was fetched from.",
|
||||
"channels_and_guilds.guild_template_invalid": "The community template data is invalid or malformed.",
|
||||
|
||||
@@ -49,6 +49,7 @@ export const DEFAULT_RESTRICTED_LIMITS: Record<LimitKey, number> = {
|
||||
feature_custom_notification_sounds: 1,
|
||||
feature_early_access: 0,
|
||||
feature_global_expressions: 0,
|
||||
feature_guild_create: 0,
|
||||
feature_higher_video_quality: 0,
|
||||
feature_per_guild_profiles: 0,
|
||||
feature_voice_entrance_sounds: 0,
|
||||
|
||||
@@ -547,6 +547,7 @@ const InstancePolicyResponse = z.object({
|
||||
single_community_guild_id: z.string().nullable(),
|
||||
direct_messages_disabled: z.boolean(),
|
||||
direct_messages_locked: z.boolean(),
|
||||
guild_create_access: z.boolean(),
|
||||
premium_mode: z.enum(['mirror', 'everyone']),
|
||||
services: z.object({
|
||||
gif_enabled: z.boolean().nullable(),
|
||||
@@ -656,6 +657,7 @@ const InstancePolicyUpdateSchema = z.object({
|
||||
direct_messages_disabled: z.boolean().optional(),
|
||||
direct_messages_locked: z.literal(false).optional(),
|
||||
premium_mode: z.enum(['mirror', 'everyone']).optional(),
|
||||
guild_create_access: z.boolean().optional(),
|
||||
services: z
|
||||
.object({
|
||||
gif_enabled: z.boolean().nullish(),
|
||||
|
||||
@@ -160,6 +160,11 @@ export const InstanceCommunitySchema = z
|
||||
direct_messages_disabled: z
|
||||
.boolean()
|
||||
.describe('Whether direct messages and friend requests are disabled instance-wide'),
|
||||
guild_create_access: z
|
||||
.boolean()
|
||||
.describe(
|
||||
'Whether every account can create communities. When false, only admins and accounts granted the feature_guild_create limit can',
|
||||
),
|
||||
})
|
||||
.describe('Community topology and direct-message policy for this instance');
|
||||
export type InstanceCommunity = z.infer<typeof InstanceCommunitySchema>;
|
||||
|
||||
Reference in New Issue
Block a user