diff --git a/fluxer_admin/openapi-admin.json b/fluxer_admin/openapi-admin.json index 3b0701172..1d2786c2e 100644 --- a/fluxer_admin/openapi-admin.json +++ b/fluxer_admin/openapi-admin.json @@ -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", diff --git a/fluxer_admin/src/admin_hints.rs b/fluxer_admin/src/admin_hints.rs new file mode 100644 index 000000000..d851630ea --- /dev/null +++ b/fluxer_admin/src/admin_hints.rs @@ -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> { + 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, + } +} diff --git a/fluxer_admin/src/api/types/instance_config.rs b/fluxer_admin/src/api/types/instance_config.rs index f26210636..94eddd928 100644 --- a/fluxer_admin/src/api/types/instance_config.rs +++ b/fluxer_admin/src/api/types/instance_config.rs @@ -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, #[serde(skip_serializing_if = "Option::is_none")] + pub guild_create_access: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub premium_mode: Option, #[serde(skip_serializing_if = "Option::is_none")] pub services: Option, diff --git a/fluxer_admin/src/lib.rs b/fluxer_admin/src/lib.rs index a5ea40c43..f2852b087 100644 --- a/fluxer_admin/src/lib.rs +++ b/fluxer_admin/src/lib.rs @@ -2,6 +2,7 @@ pub mod acl; pub mod admin_flags; +pub mod admin_hints; pub mod api; pub mod config; pub mod fonts; diff --git a/fluxer_admin/src/routes/system_actions.rs b/fluxer_admin/src/routes/system_actions.rs index 23a6170cb..768acadd6 100644 --- a/fluxer_admin/src/routes/system_actions.rs +++ b/fluxer_admin/src/routes/system_actions.rs @@ -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() } diff --git a/fluxer_admin/src/styles/app.css b/fluxer_admin/src/styles/app.css index 27ffe7c30..32e655d50 100644 --- a/fluxer_admin/src/styles/app.css +++ b/fluxer_admin/src/styles/app.css @@ -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; + } +} diff --git a/fluxer_admin/src/templates/components/mod.rs b/fluxer_admin/src/templates/components/mod.rs index 467b0a001..4ae6c49b3 100644 --- a/fluxer_admin/src/templates/components/mod.rs +++ b/fluxer_admin/src/templates/components/mod.rs @@ -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; diff --git a/fluxer_admin/src/templates/components/tooltip.rs b/fluxer_admin/src/templates/components/tooltip.rs new file mode 100644 index 000000000..a02db428f --- /dev/null +++ b/fluxer_admin/src/templates/components/tooltip.rs @@ -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>, +} + +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", " "); + } +} diff --git a/fluxer_admin/src/templates/pages/instance_config.rs b/fluxer_admin/src/templates/pages/instance_config.rs index cfa8a9b64..3e90669cd 100644 --- a/fluxer_admin/src/templates/pages/instance_config.rs +++ b/fluxer_admin/src/templates/pages/instance_config.rs @@ -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, resolved: bool) -> Markup { let selected = match override_value { None => "inherit", diff --git a/fluxer_admin/src/templates/pages/limit_config.rs b/fluxer_admin/src/templates/pages/limit_config.rs index 6f51c2f97..0ed0c3df7 100644 --- a/fluxer_admin/src/templates/pages/limit_config.rs +++ b/fluxer_admin/src/templates/pages/limit_config.rs @@ -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, @@ -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, @@ -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" } diff --git a/fluxer_admin/tests/api_deserialization.rs b/fluxer_admin/tests/api_deserialization.rs index 7d55cf46c..e9ab4254f 100644 --- a/fluxer_admin/tests/api_deserialization.rs +++ b/fluxer_admin/tests/api_deserialization.rs @@ -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, diff --git a/fluxer_api/src/api/admin/controllers/InstanceConfigAdminController.ts b/fluxer_api/src/api/admin/controllers/InstanceConfigAdminController.ts index c3f71e023..2fca7092f 100644 --- a/fluxer_api/src/api/admin/controllers/InstanceConfigAdminController.ts +++ b/fluxer_api/src/api/admin/controllers/InstanceConfigAdminController.ts @@ -124,6 +124,7 @@ async function buildInstanceConfigResponse(): Promise { 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; diff --git a/fluxer_api/src/api/admin/tests/InstanceConfigGuildCreateAccess.test.ts b/fluxer_api/src/api/admin/tests/InstanceConfigGuildCreateAccess.test.ts new file mode 100644 index 000000000..86d3f6565 --- /dev/null +++ b/fluxer_api/src/api/admin/tests/InstanceConfigGuildCreateAccess.test.ts @@ -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 (run: () => Promise): Promise => { + 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 => + 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 => + await setUserACLs(harness, await createTestAccount(harness), []); + + const setGuildCreateAccess = async (admin: TestAccount, enabled: boolean): Promise => { + const updated = await createBuilder(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 => + await createBuilder(harness, admin.token).get('/admin/instance/config').execute(); + + const createGuild = (account: TestAccount, name: string) => + createBuilder(harness, account.token).post('/guilds').body({name}); + + const grantGuildCreateToTrait = async (admin: TestAccount, trait: string): Promise => { + const current = await createBuilder(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 => { + 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(); + }); + }); +}); diff --git a/fluxer_api/src/api/guild/controllers/GuildBaseController.ts b/fluxer_api/src/api/guild/controllers/GuildBaseController.ts index 0487ebd7a..333b157be 100644 --- a/fluxer_api/src/api/guild/controllers/GuildBaseController.ts +++ b/fluxer_api/src/api/guild/controllers/GuildBaseController.ts @@ -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)); diff --git a/fluxer_api/src/api/instance/InstanceConfigRepository.ts b/fluxer_api/src/api/instance/InstanceConfigRepository.ts index f4a6cd07c..a7373efb8 100644 --- a/fluxer_api/src/api/instance/InstanceConfigRepository.ts +++ b/fluxer_api/src/api/instance/InstanceConfigRepository.ts @@ -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, }; } diff --git a/fluxer_api/src/api/openapi/openapi.json b/fluxer_api/src/api/openapi/openapi.json index e0e00801e..7c0d95223 100644 --- a/fluxer_api/src/api/openapi/openapi.json +++ b/fluxer_api/src/api/openapi/openapi.json @@ -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" }, diff --git a/fluxer_app/src/features/app/state/RuntimeConfig.ts b/fluxer_app/src/features/app/state/RuntimeConfig.ts index ebe94b907..33ec4d90b 100644 --- a/fluxer_app/src/features/app/state/RuntimeConfig.ts +++ b/fluxer_app/src/features/app/state/RuntimeConfig.ts @@ -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, diff --git a/fluxer_docs/src/content/docs/admin-api/instance.mdx b/fluxer_docs/src/content/docs/admin-api/instance.mdx index 878a2092c..9c891a390 100644 --- a/fluxer_docs/src/content/docs/admin-api/instance.mdx +++ b/fluxer_docs/src/content/docs/admin-api/instance.mdx @@ -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_locked1 | 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_resolved2 | 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?1 | string | Name used only when the community has to be created (1-100 characters) | | direct_messages_disabled?2 | boolean | Whether direct messages are disabled | | direct_messages_locked?2 | 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 | diff --git a/fluxer_docs/src/content/docs/http-api/errors.md b/fluxer_docs/src/content/docs/http-api/errors.md index 4a82b26d2..14c91e695 100644 --- a/fluxer_docs/src/content/docs/http-api/errors.md +++ b/fluxer_docs/src/content/docs/http-api/errors.md @@ -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 diff --git a/fluxer_docs/src/content/docs/http-api/instance.mdx b/fluxer_docs/src/content/docs/http-api/instance.mdx index f97880cd2..97b4c70f4 100644 --- a/fluxer_docs/src/content/docs/http-api/instance.mdx +++ b/fluxer_docs/src/content/docs/http-api/instance.mdx @@ -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_id1 | ?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 | 1 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 | diff --git a/packages/constants/src/ApiErrorCodes.ts b/packages/constants/src/ApiErrorCodes.ts index 73b5d48f5..97e4c9289 100644 --- a/packages/constants/src/ApiErrorCodes.ts +++ b/packages/constants/src/ApiErrorCodes.ts @@ -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', diff --git a/packages/constants/src/LimitConfigMetadata.ts b/packages/constants/src/LimitConfigMetadata.ts index 4a2d78f33..6712809a6 100644 --- a/packages/constants/src/LimitConfigMetadata.ts +++ b/packages/constants/src/LimitConfigMetadata.ts @@ -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 = { 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 = { 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', diff --git a/packages/errors/src/domains/guild/GuildCreationPermissionRequiredError.ts b/packages/errors/src/domains/guild/GuildCreationPermissionRequiredError.ts new file mode 100644 index 000000000..e2caab969 --- /dev/null +++ b/packages/errors/src/domains/guild/GuildCreationPermissionRequiredError.ts @@ -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}); + } +} diff --git a/packages/errors/src/i18n/ErrorCodeMappings.ts b/packages/errors/src/i18n/ErrorCodeMappings.ts index ae864174b..75eff6b9d 100644 --- a/packages/errors/src/i18n/ErrorCodeMappings.ts +++ b/packages/errors/src/i18n/ErrorCodeMappings.ts @@ -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', diff --git a/packages/errors/src/i18n/ErrorI18nMessages.ts b/packages/errors/src/i18n/ErrorI18nMessages.ts index 34fb4cde9..7b1ffc6f8 100644 --- a/packages/errors/src/i18n/ErrorI18nMessages.ts +++ b/packages/errors/src/i18n/ErrorI18nMessages.ts @@ -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.', diff --git a/packages/errors/src/i18n/locales/ar.ts b/packages/errors/src/i18n/locales/ar.ts index 6cfb2016f..0c537e7b6 100644 --- a/packages/errors/src/i18n/locales/ar.ts +++ b/packages/errors/src/i18n/locales/ar.ts @@ -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": "بيانات قالب المجتمع غير صالحة أو تالفة.", diff --git a/packages/errors/src/i18n/locales/bg.ts b/packages/errors/src/i18n/locales/bg.ts index b3a6358c6..3fc5e2621 100644 --- a/packages/errors/src/i18n/locales/bg.ts +++ b/packages/errors/src/i18n/locales/bg.ts @@ -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": "Данните на шаблона за общност са невалидни или неправилно форматирани.", diff --git a/packages/errors/src/i18n/locales/cs.ts b/packages/errors/src/i18n/locales/cs.ts index 56dbd811c..8fb493117 100644 --- a/packages/errors/src/i18n/locales/cs.ts +++ b/packages/errors/src/i18n/locales/cs.ts @@ -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á.", diff --git a/packages/errors/src/i18n/locales/da.ts b/packages/errors/src/i18n/locales/da.ts index 914164c6a..86dbbd72c 100644 --- a/packages/errors/src/i18n/locales/da.ts +++ b/packages/errors/src/i18n/locales/da.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/de.ts b/packages/errors/src/i18n/locales/de.ts index e68d4256b..e402c7142 100644 --- a/packages/errors/src/i18n/locales/de.ts +++ b/packages/errors/src/i18n/locales/de.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/el.ts b/packages/errors/src/i18n/locales/el.ts index d9fad8a2d..d4675d576 100644 --- a/packages/errors/src/i18n/locales/el.ts +++ b/packages/errors/src/i18n/locales/el.ts @@ -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": "Τα δεδομένα του προτύπου κοινότητας είναι άκυρα ή κακοσχηματισμένα.", diff --git a/packages/errors/src/i18n/locales/en-GB.ts b/packages/errors/src/i18n/locales/en-GB.ts index 660dcbca3..575e3a155 100644 --- a/packages/errors/src/i18n/locales/en-GB.ts +++ b/packages/errors/src/i18n/locales/en-GB.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/es-419.ts b/packages/errors/src/i18n/locales/es-419.ts index bcf688b01..bb28cd8d8 100644 --- a/packages/errors/src/i18n/locales/es-419.ts +++ b/packages/errors/src/i18n/locales/es-419.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/es-ES.ts b/packages/errors/src/i18n/locales/es-ES.ts index 2aa780134..62dbbf857 100644 --- a/packages/errors/src/i18n/locales/es-ES.ts +++ b/packages/errors/src/i18n/locales/es-ES.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/fi.ts b/packages/errors/src/i18n/locales/fi.ts index aece4614c..e8593d36d 100644 --- a/packages/errors/src/i18n/locales/fi.ts +++ b/packages/errors/src/i18n/locales/fi.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/fr.ts b/packages/errors/src/i18n/locales/fr.ts index 8e31b79ed..5847db23f 100644 --- a/packages/errors/src/i18n/locales/fr.ts +++ b/packages/errors/src/i18n/locales/fr.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/he.ts b/packages/errors/src/i18n/locales/he.ts index 53321cb75..d577bd9f4 100644 --- a/packages/errors/src/i18n/locales/he.ts +++ b/packages/errors/src/i18n/locales/he.ts @@ -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": "נתוני תבנית הקהילה שגויים או פגומים.", diff --git a/packages/errors/src/i18n/locales/hi.ts b/packages/errors/src/i18n/locales/hi.ts index cd665cec3..dc31249a4 100644 --- a/packages/errors/src/i18n/locales/hi.ts +++ b/packages/errors/src/i18n/locales/hi.ts @@ -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": "कम्युनिटी टेम्पलेट डेटा अमान्य है या उसका फ़ॉर्मेट गलत है।", diff --git a/packages/errors/src/i18n/locales/hr.ts b/packages/errors/src/i18n/locales/hr.ts index 461da4cbb..56aa16f93 100644 --- a/packages/errors/src/i18n/locales/hr.ts +++ b/packages/errors/src/i18n/locales/hr.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/hu.ts b/packages/errors/src/i18n/locales/hu.ts index 92bd59348..f2ad73223 100644 --- a/packages/errors/src/i18n/locales/hu.ts +++ b/packages/errors/src/i18n/locales/hu.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/id.ts b/packages/errors/src/i18n/locales/id.ts index 7ef7513c8..3576b1e48 100644 --- a/packages/errors/src/i18n/locales/id.ts +++ b/packages/errors/src/i18n/locales/id.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/it.ts b/packages/errors/src/i18n/locales/it.ts index 4a1041c5d..f5cb100d9 100644 --- a/packages/errors/src/i18n/locales/it.ts +++ b/packages/errors/src/i18n/locales/it.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/ja.ts b/packages/errors/src/i18n/locales/ja.ts index 09e3e4bf2..d204eac59 100644 --- a/packages/errors/src/i18n/locales/ja.ts +++ b/packages/errors/src/i18n/locales/ja.ts @@ -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": "コミュニティテンプレートデータが無効または不正な形式です。", diff --git a/packages/errors/src/i18n/locales/ko.ts b/packages/errors/src/i18n/locales/ko.ts index 589d2578c..4dfa0f850 100644 --- a/packages/errors/src/i18n/locales/ko.ts +++ b/packages/errors/src/i18n/locales/ko.ts @@ -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": "커뮤니티 템플릿 데이터가 유효하지 않거나 형식이 잘못되었어요.", diff --git a/packages/errors/src/i18n/locales/lt.ts b/packages/errors/src/i18n/locales/lt.ts index b8090d2e2..1af2fe36f 100644 --- a/packages/errors/src/i18n/locales/lt.ts +++ b/packages/errors/src/i18n/locales/lt.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/nl.ts b/packages/errors/src/i18n/locales/nl.ts index af22c3580..6ed0ebbec 100644 --- a/packages/errors/src/i18n/locales/nl.ts +++ b/packages/errors/src/i18n/locales/nl.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/no.ts b/packages/errors/src/i18n/locales/no.ts index 80de36480..2c26b2f53 100644 --- a/packages/errors/src/i18n/locales/no.ts +++ b/packages/errors/src/i18n/locales/no.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/pl.ts b/packages/errors/src/i18n/locales/pl.ts index 549b510a9..5e7aaccfe 100644 --- a/packages/errors/src/i18n/locales/pl.ts +++ b/packages/errors/src/i18n/locales/pl.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/pt-BR.ts b/packages/errors/src/i18n/locales/pt-BR.ts index d49a8dc53..42fe9f3a1 100644 --- a/packages/errors/src/i18n/locales/pt-BR.ts +++ b/packages/errors/src/i18n/locales/pt-BR.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/ro.ts b/packages/errors/src/i18n/locales/ro.ts index 3ae9a3b14..2573ad7bb 100644 --- a/packages/errors/src/i18n/locales/ro.ts +++ b/packages/errors/src/i18n/locales/ro.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/ru.ts b/packages/errors/src/i18n/locales/ru.ts index b9f791bd9..5e3569ef3 100644 --- a/packages/errors/src/i18n/locales/ru.ts +++ b/packages/errors/src/i18n/locales/ru.ts @@ -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": "Данные шаблона сообщества недействительны или повреждены.", diff --git a/packages/errors/src/i18n/locales/sv-SE.ts b/packages/errors/src/i18n/locales/sv-SE.ts index d02b87528..2c1396a31 100644 --- a/packages/errors/src/i18n/locales/sv-SE.ts +++ b/packages/errors/src/i18n/locales/sv-SE.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/th.ts b/packages/errors/src/i18n/locales/th.ts index ce2fe6835..ee97f65b4 100644 --- a/packages/errors/src/i18n/locales/th.ts +++ b/packages/errors/src/i18n/locales/th.ts @@ -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": "ข้อมูลเทมเพลตคอมมูนิตี้ไม่ถูกต้องหรือมีรูปแบบผิด", diff --git a/packages/errors/src/i18n/locales/tr.ts b/packages/errors/src/i18n/locales/tr.ts index 6e589ff0c..4eefaaab4 100644 --- a/packages/errors/src/i18n/locales/tr.ts +++ b/packages/errors/src/i18n/locales/tr.ts @@ -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ş.", diff --git a/packages/errors/src/i18n/locales/uk.ts b/packages/errors/src/i18n/locales/uk.ts index a78a40065..bf447b8be 100644 --- a/packages/errors/src/i18n/locales/uk.ts +++ b/packages/errors/src/i18n/locales/uk.ts @@ -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": "Дані шаблону спільноти недійсні або пошкоджені.", diff --git a/packages/errors/src/i18n/locales/vi.ts b/packages/errors/src/i18n/locales/vi.ts index d4e3e2838..f7ee8a4d2 100644 --- a/packages/errors/src/i18n/locales/vi.ts +++ b/packages/errors/src/i18n/locales/vi.ts @@ -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.", diff --git a/packages/errors/src/i18n/locales/zh-CN.ts b/packages/errors/src/i18n/locales/zh-CN.ts index 573a6016a..d859ad3d5 100644 --- a/packages/errors/src/i18n/locales/zh-CN.ts +++ b/packages/errors/src/i18n/locales/zh-CN.ts @@ -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": "社区模板数据无效或格式错误。", diff --git a/packages/errors/src/i18n/locales/zh-TW.ts b/packages/errors/src/i18n/locales/zh-TW.ts index fa0a66b36..209083b4e 100644 --- a/packages/errors/src/i18n/locales/zh-TW.ts +++ b/packages/errors/src/i18n/locales/zh-TW.ts @@ -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": "社群範本資料無效或格式錯誤。", diff --git a/packages/errors/src/i18n/weblate/locales/ar.json b/packages/errors/src/i18n/weblate/locales/ar.json index 46c8f720a..1210f689b 100644 --- a/packages/errors/src/i18n/weblate/locales/ar.json +++ b/packages/errors/src/i18n/weblate/locales/ar.json @@ -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": "بيانات قالب المجتمع غير صالحة أو تالفة.", diff --git a/packages/errors/src/i18n/weblate/locales/bg.json b/packages/errors/src/i18n/weblate/locales/bg.json index 379e65e78..2afe20057 100644 --- a/packages/errors/src/i18n/weblate/locales/bg.json +++ b/packages/errors/src/i18n/weblate/locales/bg.json @@ -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": "Данните на шаблона за общност са невалидни или неправилно форматирани.", diff --git a/packages/errors/src/i18n/weblate/locales/cs.json b/packages/errors/src/i18n/weblate/locales/cs.json index eacf7b614..c8c4379ba 100644 --- a/packages/errors/src/i18n/weblate/locales/cs.json +++ b/packages/errors/src/i18n/weblate/locales/cs.json @@ -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á.", diff --git a/packages/errors/src/i18n/weblate/locales/da.json b/packages/errors/src/i18n/weblate/locales/da.json index dbf5fd8d5..a6953e949 100644 --- a/packages/errors/src/i18n/weblate/locales/da.json +++ b/packages/errors/src/i18n/weblate/locales/da.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/de.json b/packages/errors/src/i18n/weblate/locales/de.json index 9e9858ee2..0b376e979 100644 --- a/packages/errors/src/i18n/weblate/locales/de.json +++ b/packages/errors/src/i18n/weblate/locales/de.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/el.json b/packages/errors/src/i18n/weblate/locales/el.json index a08ef7425..631f1d5b3 100644 --- a/packages/errors/src/i18n/weblate/locales/el.json +++ b/packages/errors/src/i18n/weblate/locales/el.json @@ -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": "Τα δεδομένα του προτύπου κοινότητας είναι άκυρα ή κακοσχηματισμένα.", diff --git a/packages/errors/src/i18n/weblate/locales/en-GB.json b/packages/errors/src/i18n/weblate/locales/en-GB.json index 604d5c5d0..c9cb4ec8e 100644 --- a/packages/errors/src/i18n/weblate/locales/en-GB.json +++ b/packages/errors/src/i18n/weblate/locales/en-GB.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/es-419.json b/packages/errors/src/i18n/weblate/locales/es-419.json index 88dd0bbff..05ac005ae 100644 --- a/packages/errors/src/i18n/weblate/locales/es-419.json +++ b/packages/errors/src/i18n/weblate/locales/es-419.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/es-ES.json b/packages/errors/src/i18n/weblate/locales/es-ES.json index b2c2daa62..50804db4d 100644 --- a/packages/errors/src/i18n/weblate/locales/es-ES.json +++ b/packages/errors/src/i18n/weblate/locales/es-ES.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/fi.json b/packages/errors/src/i18n/weblate/locales/fi.json index 89e18b880..f72f01ac7 100644 --- a/packages/errors/src/i18n/weblate/locales/fi.json +++ b/packages/errors/src/i18n/weblate/locales/fi.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/fr.json b/packages/errors/src/i18n/weblate/locales/fr.json index 2bff7e2dc..0fa4d4f7b 100644 --- a/packages/errors/src/i18n/weblate/locales/fr.json +++ b/packages/errors/src/i18n/weblate/locales/fr.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/he.json b/packages/errors/src/i18n/weblate/locales/he.json index a6ccafa03..83da52e45 100644 --- a/packages/errors/src/i18n/weblate/locales/he.json +++ b/packages/errors/src/i18n/weblate/locales/he.json @@ -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": "נתוני תבנית הקהילה שגויים או פגומים.", diff --git a/packages/errors/src/i18n/weblate/locales/hi.json b/packages/errors/src/i18n/weblate/locales/hi.json index e777c19ba..2853b24ac 100644 --- a/packages/errors/src/i18n/weblate/locales/hi.json +++ b/packages/errors/src/i18n/weblate/locales/hi.json @@ -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": "कम्युनिटी टेम्पलेट डेटा अमान्य है या उसका फ़ॉर्मेट गलत है।", diff --git a/packages/errors/src/i18n/weblate/locales/hr.json b/packages/errors/src/i18n/weblate/locales/hr.json index 7657a732f..29edde914 100644 --- a/packages/errors/src/i18n/weblate/locales/hr.json +++ b/packages/errors/src/i18n/weblate/locales/hr.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/hu.json b/packages/errors/src/i18n/weblate/locales/hu.json index 209e140c4..c3910b087 100644 --- a/packages/errors/src/i18n/weblate/locales/hu.json +++ b/packages/errors/src/i18n/weblate/locales/hu.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/id.json b/packages/errors/src/i18n/weblate/locales/id.json index 590177274..274b9bad6 100644 --- a/packages/errors/src/i18n/weblate/locales/id.json +++ b/packages/errors/src/i18n/weblate/locales/id.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/it.json b/packages/errors/src/i18n/weblate/locales/it.json index 3e73a1d8f..5c42be2d1 100644 --- a/packages/errors/src/i18n/weblate/locales/it.json +++ b/packages/errors/src/i18n/weblate/locales/it.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/ja.json b/packages/errors/src/i18n/weblate/locales/ja.json index 0f56d1b43..11962849d 100644 --- a/packages/errors/src/i18n/weblate/locales/ja.json +++ b/packages/errors/src/i18n/weblate/locales/ja.json @@ -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": "コミュニティテンプレートデータが無効または不正な形式です。", diff --git a/packages/errors/src/i18n/weblate/locales/ko.json b/packages/errors/src/i18n/weblate/locales/ko.json index 712651d74..c31727ac4 100644 --- a/packages/errors/src/i18n/weblate/locales/ko.json +++ b/packages/errors/src/i18n/weblate/locales/ko.json @@ -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": "커뮤니티 템플릿 데이터가 유효하지 않거나 형식이 잘못되었어요.", diff --git a/packages/errors/src/i18n/weblate/locales/lt.json b/packages/errors/src/i18n/weblate/locales/lt.json index 97d87ba87..59e75544c 100644 --- a/packages/errors/src/i18n/weblate/locales/lt.json +++ b/packages/errors/src/i18n/weblate/locales/lt.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/nl.json b/packages/errors/src/i18n/weblate/locales/nl.json index 708dd165e..0200ab68e 100644 --- a/packages/errors/src/i18n/weblate/locales/nl.json +++ b/packages/errors/src/i18n/weblate/locales/nl.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/no.json b/packages/errors/src/i18n/weblate/locales/no.json index c99a9f039..f02f16c13 100644 --- a/packages/errors/src/i18n/weblate/locales/no.json +++ b/packages/errors/src/i18n/weblate/locales/no.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/pl.json b/packages/errors/src/i18n/weblate/locales/pl.json index 23b274461..cbe712813 100644 --- a/packages/errors/src/i18n/weblate/locales/pl.json +++ b/packages/errors/src/i18n/weblate/locales/pl.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/pt-BR.json b/packages/errors/src/i18n/weblate/locales/pt-BR.json index 33df033f0..f26368cab 100644 --- a/packages/errors/src/i18n/weblate/locales/pt-BR.json +++ b/packages/errors/src/i18n/weblate/locales/pt-BR.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/ro.json b/packages/errors/src/i18n/weblate/locales/ro.json index 2fecb290b..1a7678e9e 100644 --- a/packages/errors/src/i18n/weblate/locales/ro.json +++ b/packages/errors/src/i18n/weblate/locales/ro.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/ru.json b/packages/errors/src/i18n/weblate/locales/ru.json index bef1600fc..7a28fde70 100644 --- a/packages/errors/src/i18n/weblate/locales/ru.json +++ b/packages/errors/src/i18n/weblate/locales/ru.json @@ -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": "Данные шаблона сообщества недействительны или повреждены.", diff --git a/packages/errors/src/i18n/weblate/locales/sv-SE.json b/packages/errors/src/i18n/weblate/locales/sv-SE.json index 5793eb2f0..50c2dac15 100644 --- a/packages/errors/src/i18n/weblate/locales/sv-SE.json +++ b/packages/errors/src/i18n/weblate/locales/sv-SE.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/th.json b/packages/errors/src/i18n/weblate/locales/th.json index e174349db..959bd95a9 100644 --- a/packages/errors/src/i18n/weblate/locales/th.json +++ b/packages/errors/src/i18n/weblate/locales/th.json @@ -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": "ข้อมูลเทมเพลตคอมมูนิตี้ไม่ถูกต้องหรือมีรูปแบบผิด", diff --git a/packages/errors/src/i18n/weblate/locales/tr.json b/packages/errors/src/i18n/weblate/locales/tr.json index a6c763781..220b7d71e 100644 --- a/packages/errors/src/i18n/weblate/locales/tr.json +++ b/packages/errors/src/i18n/weblate/locales/tr.json @@ -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ş.", diff --git a/packages/errors/src/i18n/weblate/locales/uk.json b/packages/errors/src/i18n/weblate/locales/uk.json index 934f77391..e10d17bc6 100644 --- a/packages/errors/src/i18n/weblate/locales/uk.json +++ b/packages/errors/src/i18n/weblate/locales/uk.json @@ -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": "Дані шаблону спільноти недійсні або пошкоджені.", diff --git a/packages/errors/src/i18n/weblate/locales/vi.json b/packages/errors/src/i18n/weblate/locales/vi.json index 310cc6c94..071e9d67e 100644 --- a/packages/errors/src/i18n/weblate/locales/vi.json +++ b/packages/errors/src/i18n/weblate/locales/vi.json @@ -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.", diff --git a/packages/errors/src/i18n/weblate/locales/zh-CN.json b/packages/errors/src/i18n/weblate/locales/zh-CN.json index 8f3c25074..ebffc7c76 100644 --- a/packages/errors/src/i18n/weblate/locales/zh-CN.json +++ b/packages/errors/src/i18n/weblate/locales/zh-CN.json @@ -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": "社区模板数据无效或格式错误。", diff --git a/packages/errors/src/i18n/weblate/locales/zh-TW.json b/packages/errors/src/i18n/weblate/locales/zh-TW.json index 8b956c7dd..149b7cf49 100644 --- a/packages/errors/src/i18n/weblate/locales/zh-TW.json +++ b/packages/errors/src/i18n/weblate/locales/zh-TW.json @@ -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": "社群範本資料無效或格式錯誤。", diff --git a/packages/errors/src/i18n/weblate/messages.json b/packages/errors/src/i18n/weblate/messages.json index aea2824e2..e3d80c6b3 100644 --- a/packages/errors/src/i18n/weblate/messages.json +++ b/packages/errors/src/i18n/weblate/messages.json @@ -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.", diff --git a/packages/limits/src/LimitDefaults.ts b/packages/limits/src/LimitDefaults.ts index d686baf67..f8c246ddd 100644 --- a/packages/limits/src/LimitDefaults.ts +++ b/packages/limits/src/LimitDefaults.ts @@ -49,6 +49,7 @@ export const DEFAULT_RESTRICTED_LIMITS: Record = { 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, diff --git a/packages/schema/src/domains/admin/AdminSchemas.ts b/packages/schema/src/domains/admin/AdminSchemas.ts index e013da580..ac17f4269 100644 --- a/packages/schema/src/domains/admin/AdminSchemas.ts +++ b/packages/schema/src/domains/admin/AdminSchemas.ts @@ -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(), diff --git a/packages/schema/src/domains/instance/InstanceSchemas.ts b/packages/schema/src/domains/instance/InstanceSchemas.ts index 44f7328f6..a5396ec80 100644 --- a/packages/schema/src/domains/instance/InstanceSchemas.ts +++ b/packages/schema/src/domains/instance/InstanceSchemas.ts @@ -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;