mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 13:05:32 +09:00
feat(api): allow bots to search messages within a single community (#1660)
This commit is contained in:
1 parent
b5285019cd
commit
490b710c61
42 files changed
+113
-75
No files matched your search
@@ -24,8 +24,13 @@ import {MessageSearchResponseMapper} from '../../search/MessageSearchResponseMap
|
|||||||
import {searchExistingMessages} from '../../search/MessageSearchResultReconciler';
|
import {searchExistingMessages} from '../../search/MessageSearchResultReconciler';
|
||||||
import type {IUserRepository} from '../../user/IUserRepository';
|
import type {IUserRepository} from '../../user/IUserRepository';
|
||||||
import {canUserAccessNsfwContent} from '../../utils/AgeUtils';
|
import {canUserAccessNsfwContent} from '../../utils/AgeUtils';
|
||||||
|
import {mapWithConcurrency} from '../../utils/ConcurrencyUtils';
|
||||||
import type {WorkerTaskName} from '../../worker/WorkerLaneConfig';
|
import type {WorkerTaskName} from '../../worker/WorkerLaneConfig';
|
||||||
|
|
||||||
|
const GUILD_FANOUT_CONCURRENCY = 16;
|
||||||
|
const PERMISSION_CHECK_CONCURRENCY = 64;
|
||||||
|
const CHANNEL_INDEX_JOB_ENQUEUE_CONCURRENCY = 16;
|
||||||
|
|
||||||
export class GuildSearchService {
|
export class GuildSearchService {
|
||||||
private readonly responseMapper: MessageSearchResponseMapper;
|
private readonly responseMapper: MessageSearchResponseMapper;
|
||||||
|
|
||||||
@@ -95,15 +100,13 @@ export class GuildSearchService {
|
|||||||
const channel = channelMap.get(id.toString())!;
|
const channel = channelMap.get(id.toString())!;
|
||||||
return !(channel.isNsfw && !canIncludeNsfw);
|
return !(channel.isNsfw && !canIncludeNsfw);
|
||||||
});
|
});
|
||||||
const permissionResults = await Promise.all(
|
const permissionResults = await mapWithConcurrency(nsfwFilteredIds, PERMISSION_CHECK_CONCURRENCY, (channelId) =>
|
||||||
nsfwFilteredIds.map((channelId) =>
|
this.gatewayService.checkPermission({
|
||||||
this.gatewayService.checkPermission({
|
guildId,
|
||||||
guildId,
|
userId,
|
||||||
userId,
|
channelId,
|
||||||
channelId,
|
permission: Permissions.VIEW_CHANNEL | Permissions.READ_MESSAGE_HISTORY,
|
||||||
permission: Permissions.VIEW_CHANNEL | Permissions.READ_MESSAGE_HISTORY,
|
}),
|
||||||
}),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
const validChannelIds: Array<ChannelID> = [];
|
const validChannelIds: Array<ChannelID> = [];
|
||||||
for (let i = 0; i < nsfwFilteredIds.length; i++) {
|
for (let i = 0; i < nsfwFilteredIds.length; i++) {
|
||||||
@@ -133,18 +136,16 @@ export class GuildSearchService {
|
|||||||
})
|
})
|
||||||
.map((id) => id.toString());
|
.map((id) => id.toString());
|
||||||
if (channelsToIndex.length > 0) {
|
if (channelsToIndex.length > 0) {
|
||||||
await Promise.all(
|
await mapWithConcurrency(channelsToIndex, CHANNEL_INDEX_JOB_ENQUEUE_CONCURRENCY, (channelId) =>
|
||||||
channelsToIndex.map((channelId) =>
|
this.workerService.addJob(
|
||||||
this.workerService.addJob(
|
'indexChannelMessages',
|
||||||
'indexChannelMessages',
|
{
|
||||||
{
|
channelId,
|
||||||
channelId,
|
},
|
||||||
},
|
{
|
||||||
{
|
jobKey: `indexChannelMessages-${channelId}`,
|
||||||
jobKey: `indexChannelMessages-${channelId}`,
|
maxAttempts: 3,
|
||||||
maxAttempts: 3,
|
},
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
return {indexing: true};
|
return {indexing: true};
|
||||||
@@ -267,16 +268,14 @@ export class GuildSearchService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async queueIndexingChannels(channelIds: Iterable<string>): Promise<void> {
|
private async queueIndexingChannels(channelIds: Iterable<string>): Promise<void> {
|
||||||
await Promise.all(
|
await mapWithConcurrency(Array.from(channelIds), CHANNEL_INDEX_JOB_ENQUEUE_CONCURRENCY, (channelId) =>
|
||||||
Array.from(channelIds).map((channelId) =>
|
this.workerService.addJob(
|
||||||
this.workerService.addJob(
|
'indexChannelMessages',
|
||||||
'indexChannelMessages',
|
{channelId},
|
||||||
{channelId},
|
{
|
||||||
{
|
jobKey: `indexChannelMessages-${channelId}`,
|
||||||
jobKey: `indexChannelMessages-${channelId}`,
|
maxAttempts: 3,
|
||||||
maxAttempts: 3,
|
},
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -290,42 +289,36 @@ export class GuildSearchService {
|
|||||||
const accessibleChannels = new Map<string, Channel>();
|
const accessibleChannels = new Map<string, Channel>();
|
||||||
const unindexedChannelIds = new Set<string>();
|
const unindexedChannelIds = new Set<string>();
|
||||||
const guildNsfwLevels = new Map<string, number>();
|
const guildNsfwLevels = new Map<string, number>();
|
||||||
const [guildDataResults, guildChannelsResults, viewableChannelsResults] = await Promise.all([
|
|
||||||
Promise.all(guildIds.map((guildId) => this.gatewayService.getGuildData({guildId, userId}))),
|
|
||||||
Promise.all(guildIds.map((guildId) => this.channelRepository.listGuildChannels(guildId))),
|
|
||||||
Promise.all(guildIds.map((guildId) => this.gatewayService.getViewableChannels({guildId, userId}))),
|
|
||||||
]);
|
|
||||||
for (let i = 0; i < guildIds.length; i++) {
|
|
||||||
const guildData = guildDataResults[i];
|
|
||||||
if (guildData) {
|
|
||||||
guildNsfwLevels.set(guildIds[i]!.toString(), guildData.nsfw_level);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const permissionChecks: Array<{
|
const permissionChecks: Array<{
|
||||||
channel: Channel;
|
channel: Channel;
|
||||||
guildId: GuildID;
|
guildId: GuildID;
|
||||||
}> = [];
|
}> = [];
|
||||||
for (let i = 0; i < guildIds.length; i++) {
|
await mapWithConcurrency(guildIds, GUILD_FANOUT_CONCURRENCY, async (guildId) => {
|
||||||
const guildChannels = guildChannelsResults[i]!;
|
const [guildData, guildChannels, viewableChannels] = await Promise.all([
|
||||||
if (guildChannels.length === 0) {
|
this.gatewayService.getGuildData({guildId, userId}),
|
||||||
continue;
|
this.channelRepository.listGuildChannels(guildId),
|
||||||
|
this.gatewayService.getViewableChannels({guildId, userId}),
|
||||||
|
]);
|
||||||
|
if (guildData) {
|
||||||
|
guildNsfwLevels.set(guildId.toString(), guildData.nsfw_level);
|
||||||
}
|
}
|
||||||
const viewableChannelIds = new Set(viewableChannelsResults[i]!.map((channelId) => channelId.toString()));
|
const viewableChannelIds = new Set(viewableChannels.map((channelId) => channelId.toString()));
|
||||||
for (const channel of guildChannels) {
|
for (const channel of guildChannels) {
|
||||||
if (viewableChannelIds.has(channel.id.toString())) {
|
if (viewableChannelIds.has(channel.id.toString())) {
|
||||||
permissionChecks.push({channel, guildId: guildIds[i]!});
|
permissionChecks.push({channel, guildId});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
const permissionResults = await Promise.all(
|
const permissionResults = await mapWithConcurrency(
|
||||||
permissionChecks.map(({channel, guildId}) =>
|
permissionChecks,
|
||||||
|
PERMISSION_CHECK_CONCURRENCY,
|
||||||
|
({channel, guildId}) =>
|
||||||
this.gatewayService.checkPermission({
|
this.gatewayService.checkPermission({
|
||||||
guildId,
|
guildId,
|
||||||
userId,
|
userId,
|
||||||
channelId: channel.id,
|
channelId: channel.id,
|
||||||
permission: Permissions.VIEW_CHANNEL | Permissions.READ_MESSAGE_HISTORY,
|
permission: Permissions.VIEW_CHANNEL | Permissions.READ_MESSAGE_HISTORY,
|
||||||
}),
|
}),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
for (let i = 0; i < permissionChecks.length; i++) {
|
for (let i = 0; i < permissionChecks.length; i++) {
|
||||||
if (!permissionResults[i]) {
|
if (!permissionResults[i]) {
|
||||||
|
|||||||
@@ -14978,7 +14978,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x-mint": {"metadata": {"title": "Search messages"}},
|
"x-mint": {"metadata": {"title": "Search messages"}},
|
||||||
"description": "Searches for messages across guilds and channels accessible to the authenticated user.",
|
"description": "Searches for messages across guilds and channels accessible to the authenticated user. Bots must supply a context guild or channel and may only use the current scope.",
|
||||||
"security": [{"sessionToken": []}],
|
"security": [{"sessionToken": []}],
|
||||||
"requestBody": {
|
"requestBody": {
|
||||||
"required": true,
|
"required": true,
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import type {Channel} from '../models/Channel';
|
|||||||
import {getMessageSearchService} from '../SearchFactory';
|
import {getMessageSearchService} from '../SearchFactory';
|
||||||
import type {IUserRepository} from '../user/IUserRepository';
|
import type {IUserRepository} from '../user/IUserRepository';
|
||||||
import {canUserAccessNsfwContent} from '../utils/AgeUtils';
|
import {canUserAccessNsfwContent} from '../utils/AgeUtils';
|
||||||
|
import {mapWithConcurrency} from '../utils/ConcurrencyUtils';
|
||||||
import type {WorkerTaskName} from '../worker/WorkerLaneConfig';
|
import type {WorkerTaskName} from '../worker/WorkerLaneConfig';
|
||||||
import {buildMessageSearchFilters} from './BuildMessageSearchFilters';
|
import {buildMessageSearchFilters} from './BuildMessageSearchFilters';
|
||||||
import {channelNeedsReindexing} from './ChannelIndexingUtils';
|
import {channelNeedsReindexing} from './ChannelIndexingUtils';
|
||||||
@@ -270,21 +271,3 @@ export class GlobalSearchService {
|
|||||||
return canUserAccessNsfwContent(user);
|
return canUserAccessNsfwContent(user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function mapWithConcurrency<T, TResult>(
|
|
||||||
items: ReadonlyArray<T>,
|
|
||||||
concurrency: number,
|
|
||||||
mapper: (item: T, index: number) => Promise<TResult>,
|
|
||||||
): Promise<Array<TResult>> {
|
|
||||||
const results = new Array<TResult>(items.length);
|
|
||||||
let nextIndex = 0;
|
|
||||||
async function worker(): Promise<void> {
|
|
||||||
for (;;) {
|
|
||||||
const index = nextIndex++;
|
|
||||||
if (index >= items.length) return;
|
|
||||||
results[index] = await mapper(items[index]!, index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await Promise.all(Array.from({length: Math.min(concurrency, items.length)}, () => worker()));
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
import {ValidationErrorCodes} from '@fluxer/constants/src/ValidationErrorCodes';
|
||||||
|
import {InputValidationError} from '@fluxer/errors/src/domains/core/InputValidationError';
|
||||||
import {GlobalSearchMessagesRequest} from '@fluxer/schema/src/domains/message/MessageRequestSchemas';
|
import {GlobalSearchMessagesRequest} from '@fluxer/schema/src/domains/message/MessageRequestSchemas';
|
||||||
import {MessageSearchResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
|
import {MessageSearchResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
|
||||||
import {DefaultUserOnly, LoginRequired} from '../../middleware/AuthMiddleware';
|
import {LoginRequired} from '../../middleware/AuthMiddleware';
|
||||||
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
|
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
|
||||||
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
|
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
|
||||||
import {RateLimitConfigs} from '../../RateLimitConfig';
|
import {RateLimitConfigs} from '../../RateLimitConfig';
|
||||||
@@ -14,11 +16,11 @@ export function SearchController(app: HonoApp) {
|
|||||||
'/search/messages',
|
'/search/messages',
|
||||||
RateLimitMiddleware(RateLimitConfigs.SEARCH_MESSAGES),
|
RateLimitMiddleware(RateLimitConfigs.SEARCH_MESSAGES),
|
||||||
LoginRequired,
|
LoginRequired,
|
||||||
DefaultUserOnly,
|
|
||||||
OpenAPI({
|
OpenAPI({
|
||||||
operationId: 'search_messages',
|
operationId: 'search_messages',
|
||||||
summary: 'Search messages',
|
summary: 'Search messages',
|
||||||
description: 'Searches for messages across guilds and channels accessible to the authenticated user.',
|
description:
|
||||||
|
'Searches for messages across guilds and channels accessible to the authenticated user. Bots must supply a context guild or channel and may only use the current scope.',
|
||||||
responseSchema: MessageSearchResponse,
|
responseSchema: MessageSearchResponse,
|
||||||
statusCode: 200,
|
statusCode: 200,
|
||||||
security: ['bearerToken', 'sessionToken'],
|
security: ['bearerToken', 'sessionToken'],
|
||||||
@@ -27,7 +29,11 @@ export function SearchController(app: HonoApp) {
|
|||||||
Validator('json', GlobalSearchMessagesRequest),
|
Validator('json', GlobalSearchMessagesRequest),
|
||||||
async (ctx) => {
|
async (ctx) => {
|
||||||
const params = ctx.req.valid('json');
|
const params = ctx.req.valid('json');
|
||||||
const userId = ctx.get('user').id;
|
const user = ctx.get('user');
|
||||||
|
if (user.isBot && (params.scope ?? 'current') !== 'current') {
|
||||||
|
throw InputValidationError.fromCode('scope', ValidationErrorCodes.BOT_SEARCH_SCOPE_UNAVAILABLE);
|
||||||
|
}
|
||||||
|
const userId = user.id;
|
||||||
const requestCache = ctx.get('requestCache');
|
const requestCache = ctx.get('requestCache');
|
||||||
const result = await ctx.get('searchService').searchMessages({userId, requestCache, data: params});
|
const result = await ctx.get('searchService').searchMessages({userId, requestCache, data: params});
|
||||||
return ctx.json(result);
|
return ctx.json(result);
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
export async function mapWithConcurrency<T, TResult>(
|
||||||
|
items: ReadonlyArray<T>,
|
||||||
|
concurrency: number,
|
||||||
|
mapper: (item: T, index: number) => Promise<TResult>,
|
||||||
|
): Promise<Array<TResult>> {
|
||||||
|
const results = new Array<TResult>(items.length);
|
||||||
|
let nextIndex = 0;
|
||||||
|
async function worker(): Promise<void> {
|
||||||
|
for (;;) {
|
||||||
|
const index = nextIndex++;
|
||||||
|
if (index >= items.length) return;
|
||||||
|
results[index] = await mapper(items[index]!, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await Promise.all(Array.from({length: Math.min(concurrency, items.length)}, () => worker()));
|
||||||
|
return results;
|
||||||
|
}
|
||||||
@@ -251,6 +251,7 @@ export const ValidationErrorCodes = {
|
|||||||
VISIONARY_REQUIRED_FOR_BOT_DISCRIMINATOR: 'VISIONARY_REQUIRED_FOR_BOT_DISCRIMINATOR',
|
VISIONARY_REQUIRED_FOR_BOT_DISCRIMINATOR: 'VISIONARY_REQUIRED_FOR_BOT_DISCRIMINATOR',
|
||||||
VISIONARY_REQUIRED_FOR_DISCRIMINATOR: 'VISIONARY_REQUIRED_FOR_DISCRIMINATOR',
|
VISIONARY_REQUIRED_FOR_DISCRIMINATOR: 'VISIONARY_REQUIRED_FOR_DISCRIMINATOR',
|
||||||
BOT_DISCRIMINATOR_CANNOT_BE_CHANGED: 'BOT_DISCRIMINATOR_CANNOT_BE_CHANGED',
|
BOT_DISCRIMINATOR_CANNOT_BE_CHANGED: 'BOT_DISCRIMINATOR_CANNOT_BE_CHANGED',
|
||||||
|
BOT_SEARCH_SCOPE_UNAVAILABLE: 'BOT_SEARCH_SCOPE_UNAVAILABLE',
|
||||||
VOICE_CHANNELS_CANNOT_BE_ABOVE_TEXT_CHANNELS: 'VOICE_CHANNELS_CANNOT_BE_ABOVE_TEXT_CHANNELS',
|
VOICE_CHANNELS_CANNOT_BE_ABOVE_TEXT_CHANNELS: 'VOICE_CHANNELS_CANNOT_BE_ABOVE_TEXT_CHANNELS',
|
||||||
WEBHOOK_NAME_LENGTH_INVALID: 'WEBHOOK_NAME_LENGTH_INVALID',
|
WEBHOOK_NAME_LENGTH_INVALID: 'WEBHOOK_NAME_LENGTH_INVALID',
|
||||||
ENTRANCE_SOUND_INVALID_FORMAT: 'ENTRANCE_SOUND_INVALID_FORMAT',
|
ENTRANCE_SOUND_INVALID_FORMAT: 'ENTRANCE_SOUND_INVALID_FORMAT',
|
||||||
|
|||||||
@@ -467,6 +467,7 @@ export const ErrorCodeToI18nKey = {
|
|||||||
'premium_and_plans.visionary_required_for_bot_discriminator',
|
'premium_and_plans.visionary_required_for_bot_discriminator',
|
||||||
[ValidationErrorCodes.VISIONARY_REQUIRED_FOR_DISCRIMINATOR]: 'premium_and_plans.visionary_required_for_discriminator',
|
[ValidationErrorCodes.VISIONARY_REQUIRED_FOR_DISCRIMINATOR]: 'premium_and_plans.visionary_required_for_discriminator',
|
||||||
[ValidationErrorCodes.BOT_DISCRIMINATOR_CANNOT_BE_CHANGED]: 'bots.bot_discriminator_cannot_be_changed',
|
[ValidationErrorCodes.BOT_DISCRIMINATOR_CANNOT_BE_CHANGED]: 'bots.bot_discriminator_cannot_be_changed',
|
||||||
|
[ValidationErrorCodes.BOT_SEARCH_SCOPE_UNAVAILABLE]: 'bots.search_scope_unavailable',
|
||||||
[ValidationErrorCodes.USER_MUST_BE_A_BOT_TO_BE_MARKED_AS_A_SYSTEM_USER]:
|
[ValidationErrorCodes.USER_MUST_BE_A_BOT_TO_BE_MARKED_AS_A_SYSTEM_USER]:
|
||||||
'admin_and_system.user_must_be_bot_for_system_user',
|
'admin_and_system.user_must_be_bot_for_system_user',
|
||||||
[ValidationErrorCodes.USER_IS_NOT_BANNED]: 'moderation_and_reports.user_is_not_banned',
|
[ValidationErrorCodes.USER_IS_NOT_BANNED]: 'moderation_and_reports.user_is_not_banned',
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ export const ERROR_I18N_MESSAGES = {
|
|||||||
'bots.bot_user_not_found': "Bot user wasn't found.",
|
'bots.bot_user_not_found': "Bot user wasn't found.",
|
||||||
'bots.invalid_response_type_for_non_bot': 'Response type must be code for non-bot scopes.',
|
'bots.invalid_response_type_for_non_bot': 'Response type must be code for non-bot scopes.',
|
||||||
'bots.not_a_bot_application': "This application isn't a bot.",
|
'bots.not_a_bot_application': "This application isn't a bot.",
|
||||||
|
'bots.search_scope_unavailable': 'Bots can only search within a single community or channel.',
|
||||||
'calls_and_voice.call_already_exists': 'A call is already in progress in this channel.',
|
'calls_and_voice.call_already_exists': 'A call is already in progress in this channel.',
|
||||||
'calls_and_voice.cannot_modify_voice_state': "You can't modify voice state.",
|
'calls_and_voice.cannot_modify_voice_state': "You can't modify voice state.",
|
||||||
'calls_and_voice.invalid_or_restricted_rtc_region': 'Invalid or restricted RTC region: {region}.',
|
'calls_and_voice.invalid_or_restricted_rtc_region': 'Invalid or restricted RTC region: {region}.',
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "لم يتم العثور على مستخدم البوت.",
|
"bots.bot_user_not_found": "لم يتم العثور على مستخدم البوت.",
|
||||||
"bots.invalid_response_type_for_non_bot": "يجب أن يكون نوع الاستجابة رمزًا للنطاقات غير البوت.",
|
"bots.invalid_response_type_for_non_bot": "يجب أن يكون نوع الاستجابة رمزًا للنطاقات غير البوت.",
|
||||||
"bots.not_a_bot_application": "هذا التطبيق ليس بوتًا.",
|
"bots.not_a_bot_application": "هذا التطبيق ليس بوتًا.",
|
||||||
|
"bots.search_scope_unavailable": "لا يمكن للبوتات البحث إلا داخل مجتمع واحد أو قناة واحدة.",
|
||||||
"calls_and_voice.call_already_exists": "مكالمة جارية بالفعل في هذه القناة.",
|
"calls_and_voice.call_already_exists": "مكالمة جارية بالفعل في هذه القناة.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "لا يمكنك تغيير حالة الصوت.",
|
"calls_and_voice.cannot_modify_voice_state": "لا يمكنك تغيير حالة الصوت.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "منطقة RTC غير صالحة أو مقيدة: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "منطقة RTC غير صالحة أو مقيدة: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Потребителят на бота не е намерен.",
|
"bots.bot_user_not_found": "Потребителят на бота не е намерен.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Типът на отговор трябва да е код за обхвати, различни от бот.",
|
"bots.invalid_response_type_for_non_bot": "Типът на отговор трябва да е код за обхвати, различни от бот.",
|
||||||
"bots.not_a_bot_application": "Това приложение не е бот.",
|
"bots.not_a_bot_application": "Това приложение не е бот.",
|
||||||
|
"bots.search_scope_unavailable": "Ботовете могат да търсят само в рамките на една общност или един канал.",
|
||||||
"calls_and_voice.call_already_exists": "Вече има активно обаждане в този канал.",
|
"calls_and_voice.call_already_exists": "Вече има активно обаждане в този канал.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Не можеш да променяш гласовото си състояние.",
|
"calls_and_voice.cannot_modify_voice_state": "Не можеш да променяш гласовото си състояние.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Невалиден или ограничен RTC регион: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Невалиден или ограничен RTC регион: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Uživatel bota nebyl nalezen.",
|
"bots.bot_user_not_found": "Uživatel bota nebyl nalezen.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Typ odpovědi musí být autorizační kód pro jiné rozsahy než pro boty.",
|
"bots.invalid_response_type_for_non_bot": "Typ odpovědi musí být autorizační kód pro jiné rozsahy než pro boty.",
|
||||||
"bots.not_a_bot_application": "Tato aplikace není bot.",
|
"bots.not_a_bot_application": "Tato aplikace není bot.",
|
||||||
|
"bots.search_scope_unavailable": "Boti mohou vyhledávat pouze v rámci jedné komunity nebo jednoho kanálu.",
|
||||||
"calls_and_voice.call_already_exists": "V tomto kanálu už se volá.",
|
"calls_and_voice.call_already_exists": "V tomto kanálu už se volá.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Nemůžeš měnit hlasový stav.",
|
"calls_and_voice.cannot_modify_voice_state": "Nemůžeš měnit hlasový stav.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Neplatná nebo omezená RTC oblast: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Neplatná nebo omezená RTC oblast: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Bot-bruger blev ikke fundet.",
|
"bots.bot_user_not_found": "Bot-bruger blev ikke fundet.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Svartypen skal være kode for ikke-bot-tilladelser.",
|
"bots.invalid_response_type_for_non_bot": "Svartypen skal være kode for ikke-bot-tilladelser.",
|
||||||
"bots.not_a_bot_application": "Denne applikation er ikke en bot.",
|
"bots.not_a_bot_application": "Denne applikation er ikke en bot.",
|
||||||
|
"bots.search_scope_unavailable": "Botter kan kun søge inden for én community eller én kanal.",
|
||||||
"calls_and_voice.call_already_exists": "Et opkald er allerede i gang i denne kanal.",
|
"calls_and_voice.call_already_exists": "Et opkald er allerede i gang i denne kanal.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Du kan ikke ændre stemmestatus.",
|
"calls_and_voice.cannot_modify_voice_state": "Du kan ikke ændre stemmestatus.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Ugyldig eller begrænset RTC-region: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Ugyldig eller begrænset RTC-region: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Der Bot-Benutzer wurde nicht gefunden.",
|
"bots.bot_user_not_found": "Der Bot-Benutzer wurde nicht gefunden.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Der Antworttyp muss für Nicht-Bot-Scopes \"code\" sein.",
|
"bots.invalid_response_type_for_non_bot": "Der Antworttyp muss für Nicht-Bot-Scopes \"code\" sein.",
|
||||||
"bots.not_a_bot_application": "Diese Anwendung ist kein Bot.",
|
"bots.not_a_bot_application": "Diese Anwendung ist kein Bot.",
|
||||||
|
"bots.search_scope_unavailable": "Bots können nur innerhalb einer einzelnen Community oder eines einzelnen Kanals suchen.",
|
||||||
"calls_and_voice.call_already_exists": "In diesem Kanal ist bereits ein Anruf aktiv.",
|
"calls_and_voice.call_already_exists": "In diesem Kanal ist bereits ein Anruf aktiv.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Der Sprachstatus kann nicht geändert werden.",
|
"calls_and_voice.cannot_modify_voice_state": "Der Sprachstatus kann nicht geändert werden.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Ungültige oder beschränkte RTC-Region: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Ungültige oder beschränkte RTC-Region: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Ο χρήστης bot δεν βρέθηκε.",
|
"bots.bot_user_not_found": "Ο χρήστης bot δεν βρέθηκε.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Ο τύπος απόκρισης πρέπει να είναι code για πεδία εκτός bot.",
|
"bots.invalid_response_type_for_non_bot": "Ο τύπος απόκρισης πρέπει να είναι code για πεδία εκτός bot.",
|
||||||
"bots.not_a_bot_application": "Αυτή η εφαρμογή δεν είναι bot.",
|
"bots.not_a_bot_application": "Αυτή η εφαρμογή δεν είναι bot.",
|
||||||
|
"bots.search_scope_unavailable": "Τα bot μπορούν να κάνουν αναζήτηση μόνο σε μία κοινότητα ή σε ένα κανάλι.",
|
||||||
"calls_and_voice.call_already_exists": "Υπάρχει ήδη μια κλήση σε αυτό το κανάλι.",
|
"calls_and_voice.call_already_exists": "Υπάρχει ήδη μια κλήση σε αυτό το κανάλι.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Δεν μπορείς να τροποποιήσεις την κατάσταση φωνής.",
|
"calls_and_voice.cannot_modify_voice_state": "Δεν μπορείς να τροποποιήσεις την κατάσταση φωνής.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Μη έγκυρη ή μη διαθέσιμη περιοχή RTC: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Μη έγκυρη ή μη διαθέσιμη περιοχή RTC: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Bot user wasn't found.",
|
"bots.bot_user_not_found": "Bot user wasn't found.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Response type must be code for non-bot scopes.",
|
"bots.invalid_response_type_for_non_bot": "Response type must be code for non-bot scopes.",
|
||||||
"bots.not_a_bot_application": "This application isn't a bot.",
|
"bots.not_a_bot_application": "This application isn't a bot.",
|
||||||
|
"bots.search_scope_unavailable": "Bots can only search within a single community or channel.",
|
||||||
"calls_and_voice.call_already_exists": "A call is already in progress in this channel.",
|
"calls_and_voice.call_already_exists": "A call is already in progress in this channel.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "You can't modify voice state.",
|
"calls_and_voice.cannot_modify_voice_state": "You can't modify voice state.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Invalid or restricted RTC region: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Invalid or restricted RTC region: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "No se encontró el usuario del bot.",
|
"bots.bot_user_not_found": "No se encontró el usuario del bot.",
|
||||||
"bots.invalid_response_type_for_non_bot": "El tipo de respuesta debe ser código para ámbitos que no son de bot.",
|
"bots.invalid_response_type_for_non_bot": "El tipo de respuesta debe ser código para ámbitos que no son de bot.",
|
||||||
"bots.not_a_bot_application": "Esta aplicación no es un bot.",
|
"bots.not_a_bot_application": "Esta aplicación no es un bot.",
|
||||||
|
"bots.search_scope_unavailable": "Los bots solo pueden buscar dentro de una sola comunidad o canal.",
|
||||||
"calls_and_voice.call_already_exists": "Ya hay una llamada en curso en este canal.",
|
"calls_and_voice.call_already_exists": "Ya hay una llamada en curso en este canal.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "No puedes modificar el estado de voz.",
|
"calls_and_voice.cannot_modify_voice_state": "No puedes modificar el estado de voz.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Región RTC inválida o restringida: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Región RTC inválida o restringida: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "No se encontró el usuario del bot.",
|
"bots.bot_user_not_found": "No se encontró el usuario del bot.",
|
||||||
"bots.invalid_response_type_for_non_bot": "El tipo de respuesta debe ser code para los alcances que no sean de bot.",
|
"bots.invalid_response_type_for_non_bot": "El tipo de respuesta debe ser code para los alcances que no sean de bot.",
|
||||||
"bots.not_a_bot_application": "Esta aplicación no es un bot.",
|
"bots.not_a_bot_application": "Esta aplicación no es un bot.",
|
||||||
|
"bots.search_scope_unavailable": "Los bots solo pueden buscar dentro de una sola comunidad o canal.",
|
||||||
"calls_and_voice.call_already_exists": "Ya hay una llamada en curso en este canal.",
|
"calls_and_voice.call_already_exists": "Ya hay una llamada en curso en este canal.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "No puedes modificar el estado de voz.",
|
"calls_and_voice.cannot_modify_voice_state": "No puedes modificar el estado de voz.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Región RTC no válida o restringida: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Región RTC no válida o restringida: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Bottikäyttäjää ei löytynyt.",
|
"bots.bot_user_not_found": "Bottikäyttäjää ei löytynyt.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Vastaustyypin on oltava koodi muille kuin botin käyttöoikeuksille.",
|
"bots.invalid_response_type_for_non_bot": "Vastaustyypin on oltava koodi muille kuin botin käyttöoikeuksille.",
|
||||||
"bots.not_a_bot_application": "Tämä sovellus ei ole botti.",
|
"bots.not_a_bot_application": "Tämä sovellus ei ole botti.",
|
||||||
|
"bots.search_scope_unavailable": "Botit voivat hakea vain yhden yhteisön tai kanavan sisältä.",
|
||||||
"calls_and_voice.call_already_exists": "Puhelu on jo käynnissä tässä kanavassa.",
|
"calls_and_voice.call_already_exists": "Puhelu on jo käynnissä tässä kanavassa.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Et voi muokata äänitilaa.",
|
"calls_and_voice.cannot_modify_voice_state": "Et voi muokata äänitilaa.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Virheellinen tai rajoitettu RTC-alue: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Virheellinen tai rajoitettu RTC-alue: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "L'utilisateur bot n'a pas été trouvé.",
|
"bots.bot_user_not_found": "L'utilisateur bot n'a pas été trouvé.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Le type de réponse doit être \"code\" pour les portées qui ne sont pas des bots.",
|
"bots.invalid_response_type_for_non_bot": "Le type de réponse doit être \"code\" pour les portées qui ne sont pas des bots.",
|
||||||
"bots.not_a_bot_application": "Cette application n'est pas un bot.",
|
"bots.not_a_bot_application": "Cette application n'est pas un bot.",
|
||||||
|
"bots.search_scope_unavailable": "Les bots ne peuvent rechercher que dans une seule communauté ou un seul salon.",
|
||||||
"calls_and_voice.call_already_exists": "Un appel est déjà en cours dans ce salon.",
|
"calls_and_voice.call_already_exists": "Un appel est déjà en cours dans ce salon.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Tu ne peux pas modifier l'état vocal.",
|
"calls_and_voice.cannot_modify_voice_state": "Tu ne peux pas modifier l'état vocal.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Région RTC invalide ou restreinte : {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Région RTC invalide ou restreinte : {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "משתמש הבוט לא נמצא.",
|
"bots.bot_user_not_found": "משתמש הבוט לא נמצא.",
|
||||||
"bots.invalid_response_type_for_non_bot": "סוג התגובה חייב להיות 'code' עבור הרשאות שאינן של בוטים.",
|
"bots.invalid_response_type_for_non_bot": "סוג התגובה חייב להיות 'code' עבור הרשאות שאינן של בוטים.",
|
||||||
"bots.not_a_bot_application": "יישום זה אינו בוט.",
|
"bots.not_a_bot_application": "יישום זה אינו בוט.",
|
||||||
|
"bots.search_scope_unavailable": "בוטים יכולים לחפש רק בתוך קהילה אחת או ערוץ אחד.",
|
||||||
"calls_and_voice.call_already_exists": "שיחה כבר מתקיימת בערוץ זה.",
|
"calls_and_voice.call_already_exists": "שיחה כבר מתקיימת בערוץ זה.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "לא ניתן לשנות את המצב הקולי.",
|
"calls_and_voice.cannot_modify_voice_state": "לא ניתן לשנות את המצב הקולי.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "אזור RTC לא חוקי או מוגבל: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "אזור RTC לא חוקי או מוגבל: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "बॉट यूज़र नहीं मिला।",
|
"bots.bot_user_not_found": "बॉट यूज़र नहीं मिला।",
|
||||||
"bots.invalid_response_type_for_non_bot": "नॉन-बॉट स्कोप के लिए रिस्पॉन्स टाइप कोड होना चाहिए।",
|
"bots.invalid_response_type_for_non_bot": "नॉन-बॉट स्कोप के लिए रिस्पॉन्स टाइप कोड होना चाहिए।",
|
||||||
"bots.not_a_bot_application": "यह एप्लीकेशन बॉट नहीं है।",
|
"bots.not_a_bot_application": "यह एप्लीकेशन बॉट नहीं है।",
|
||||||
|
"bots.search_scope_unavailable": "बॉट केवल एक ही कम्युनिटी या चैनल के भीतर खोज सकते हैं।",
|
||||||
"calls_and_voice.call_already_exists": "इस चैनल में पहले से ही एक कॉल चल रही है।",
|
"calls_and_voice.call_already_exists": "इस चैनल में पहले से ही एक कॉल चल रही है।",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "आप वॉइस स्टेट को बदल नहीं सकते।",
|
"calls_and_voice.cannot_modify_voice_state": "आप वॉइस स्टेट को बदल नहीं सकते।",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "अमान्य या प्रतिबंधित RTC रीजन: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "अमान्य या प्रतिबंधित RTC रीजन: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Korisnik bota nije pronađen.",
|
"bots.bot_user_not_found": "Korisnik bota nije pronađen.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Vrsta odgovora mora biti kod za opsege koji nisu botovi.",
|
"bots.invalid_response_type_for_non_bot": "Vrsta odgovora mora biti kod za opsege koji nisu botovi.",
|
||||||
"bots.not_a_bot_application": "Ova aplikacija nije bot.",
|
"bots.not_a_bot_application": "Ova aplikacija nije bot.",
|
||||||
|
"bots.search_scope_unavailable": "Botovi mogu pretraživati samo unutar jedne zajednice ili jednog kanala.",
|
||||||
"calls_and_voice.call_already_exists": "Poziv je već u tijeku u ovom kanalu.",
|
"calls_and_voice.call_already_exists": "Poziv je već u tijeku u ovom kanalu.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Ne možeš mijenjati stanje glasa.",
|
"calls_and_voice.cannot_modify_voice_state": "Ne možeš mijenjati stanje glasa.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Nevažeća ili ograničena RTC regija: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Nevažeća ili ograničena RTC regija: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "A bot felhasználó nem található.",
|
"bots.bot_user_not_found": "A bot felhasználó nem található.",
|
||||||
"bots.invalid_response_type_for_non_bot": "A válasz típusának kódnak kell lennie a nem bot hatókörökhöz.",
|
"bots.invalid_response_type_for_non_bot": "A válasz típusának kódnak kell lennie a nem bot hatókörökhöz.",
|
||||||
"bots.not_a_bot_application": "Ez az alkalmazás nem bot.",
|
"bots.not_a_bot_application": "Ez az alkalmazás nem bot.",
|
||||||
|
"bots.search_scope_unavailable": "A botok csak egyetlen közösségen vagy csatornán belül kereshetnek.",
|
||||||
"calls_and_voice.call_already_exists": "Már folyamatban van egy hívás ezen a csatornán.",
|
"calls_and_voice.call_already_exists": "Már folyamatban van egy hívás ezen a csatornán.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Nem módosíthatod a hangbeállításokat.",
|
"calls_and_voice.cannot_modify_voice_state": "Nem módosíthatod a hangbeállításokat.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Érvénytelen vagy korlátozott RTC régió: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Érvénytelen vagy korlátozott RTC régió: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Pengguna bot tidak ditemukan.",
|
"bots.bot_user_not_found": "Pengguna bot tidak ditemukan.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Jenis respons harus berupa kode untuk cakupan non-bot.",
|
"bots.invalid_response_type_for_non_bot": "Jenis respons harus berupa kode untuk cakupan non-bot.",
|
||||||
"bots.not_a_bot_application": "Aplikasi ini bukan bot.",
|
"bots.not_a_bot_application": "Aplikasi ini bukan bot.",
|
||||||
|
"bots.search_scope_unavailable": "Bot hanya bisa mencari di dalam satu komunitas atau kanal.",
|
||||||
"calls_and_voice.call_already_exists": "Panggilan sudah berlangsung di kanal ini.",
|
"calls_and_voice.call_already_exists": "Panggilan sudah berlangsung di kanal ini.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Kamu tidak dapat mengubah status suara.",
|
"calls_and_voice.cannot_modify_voice_state": "Kamu tidak dapat mengubah status suara.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Wilayah RTC tidak valid atau dibatasi: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Wilayah RTC tidak valid atau dibatasi: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Utente bot non trovato.",
|
"bots.bot_user_not_found": "Utente bot non trovato.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Il tipo di risposta deve essere code per gli scope non-bot.",
|
"bots.invalid_response_type_for_non_bot": "Il tipo di risposta deve essere code per gli scope non-bot.",
|
||||||
"bots.not_a_bot_application": "Questa applicazione non è un bot.",
|
"bots.not_a_bot_application": "Questa applicazione non è un bot.",
|
||||||
|
"bots.search_scope_unavailable": "I bot possono cercare solo all'interno di una singola comunità o di un canale.",
|
||||||
"calls_and_voice.call_already_exists": "Una chiamata è già in corso in questo canale.",
|
"calls_and_voice.call_already_exists": "Una chiamata è già in corso in questo canale.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Non puoi modificare lo stato vocale.",
|
"calls_and_voice.cannot_modify_voice_state": "Non puoi modificare lo stato vocale.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Regione RTC non valida o limitata: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Regione RTC non valida o limitata: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "ボットユーザーが見つかりません。",
|
"bots.bot_user_not_found": "ボットユーザーが見つかりません。",
|
||||||
"bots.invalid_response_type_for_non_bot": "ボット以外のスコープの場合、応答タイプはコードである必要があります。",
|
"bots.invalid_response_type_for_non_bot": "ボット以外のスコープの場合、応答タイプはコードである必要があります。",
|
||||||
"bots.not_a_bot_application": "このアプリケーションはボットではありません。",
|
"bots.not_a_bot_application": "このアプリケーションはボットではありません。",
|
||||||
|
"bots.search_scope_unavailable": "ボットは単一のコミュニティまたはチャンネル内でのみ検索できます。",
|
||||||
"calls_and_voice.call_already_exists": "このチャンネルではすでに通話中です。",
|
"calls_and_voice.call_already_exists": "このチャンネルではすでに通話中です。",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "ボイスの状態は変更できません。",
|
"calls_and_voice.cannot_modify_voice_state": "ボイスの状態は変更できません。",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "無効または制限されたRTCリージョンです: {region}。",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "無効または制限されたRTCリージョンです: {region}。",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "봇 사용자를 찾을 수 없어요.",
|
"bots.bot_user_not_found": "봇 사용자를 찾을 수 없어요.",
|
||||||
"bots.invalid_response_type_for_non_bot": "봇이 아닌 범위에는 응답 유형이 코드여야 해요.",
|
"bots.invalid_response_type_for_non_bot": "봇이 아닌 범위에는 응답 유형이 코드여야 해요.",
|
||||||
"bots.not_a_bot_application": "이 애플리케이션은 봇이 아니에요.",
|
"bots.not_a_bot_application": "이 애플리케이션은 봇이 아니에요.",
|
||||||
|
"bots.search_scope_unavailable": "봇은 커뮤니티 하나 또는 채널 하나 안에서만 검색할 수 있어요.",
|
||||||
"calls_and_voice.call_already_exists": "이 채널에서 이미 통화가 진행 중이에요.",
|
"calls_and_voice.call_already_exists": "이 채널에서 이미 통화가 진행 중이에요.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "음성 상태를 수정할 수 없어요.",
|
"calls_and_voice.cannot_modify_voice_state": "음성 상태를 수정할 수 없어요.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "유효하지 않거나 제한된 RTC 지역이에요: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "유효하지 않거나 제한된 RTC 지역이에요: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Roboto naudotojas nerastas.",
|
"bots.bot_user_not_found": "Roboto naudotojas nerastas.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Atsakymo tipas ne robotų teisėms turi būti kodas.",
|
"bots.invalid_response_type_for_non_bot": "Atsakymo tipas ne robotų teisėms turi būti kodas.",
|
||||||
"bots.not_a_bot_application": "Ši programa nėra robotas.",
|
"bots.not_a_bot_application": "Ši programa nėra robotas.",
|
||||||
|
"bots.search_scope_unavailable": "Botai gali ieškoti tik vienoje bendruomenėje arba viename kanale.",
|
||||||
"calls_and_voice.call_already_exists": "Šiame kanale jau vyksta skambutis.",
|
"calls_and_voice.call_already_exists": "Šiame kanale jau vyksta skambutis.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Negali keisti balso būsenos.",
|
"calls_and_voice.cannot_modify_voice_state": "Negali keisti balso būsenos.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Neteisingas arba apribotas RTC regionas: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Neteisingas arba apribotas RTC regionas: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Bot-gebruiker is niet gevonden.",
|
"bots.bot_user_not_found": "Bot-gebruiker is niet gevonden.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Responstype moet 'code' zijn voor niet-bot-bereiken.",
|
"bots.invalid_response_type_for_non_bot": "Responstype moet 'code' zijn voor niet-bot-bereiken.",
|
||||||
"bots.not_a_bot_application": "Deze applicatie is geen bot.",
|
"bots.not_a_bot_application": "Deze applicatie is geen bot.",
|
||||||
|
"bots.search_scope_unavailable": "Bots kunnen alleen binnen één community of kanaal zoeken.",
|
||||||
"calls_and_voice.call_already_exists": "Er is al een oproep bezig in dit kanaal.",
|
"calls_and_voice.call_already_exists": "Er is al een oproep bezig in dit kanaal.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Je kunt de spraakstatus niet wijzigen.",
|
"calls_and_voice.cannot_modify_voice_state": "Je kunt de spraakstatus niet wijzigen.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Ongeldige of beperkte RTC-regio: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Ongeldige of beperkte RTC-regio: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Bot-bruker ble ikke funnet.",
|
"bots.bot_user_not_found": "Bot-bruker ble ikke funnet.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Svartypen må være kode for ikke-bot-omfang.",
|
"bots.invalid_response_type_for_non_bot": "Svartypen må være kode for ikke-bot-omfang.",
|
||||||
"bots.not_a_bot_application": "Denne applikasjonen er ikke en bot.",
|
"bots.not_a_bot_application": "Denne applikasjonen er ikke en bot.",
|
||||||
|
"bots.search_scope_unavailable": "Botter kan bare søke innenfor ett community eller én kanal.",
|
||||||
"calls_and_voice.call_already_exists": "En samtale er allerede i gang i denne kanalen.",
|
"calls_and_voice.call_already_exists": "En samtale er allerede i gang i denne kanalen.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Du kan ikke endre talestatus.",
|
"calls_and_voice.cannot_modify_voice_state": "Du kan ikke endre talestatus.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Ugyldig eller begrenset RTC-region: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Ugyldig eller begrenset RTC-region: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Nie znaleziono użytkownika bota.",
|
"bots.bot_user_not_found": "Nie znaleziono użytkownika bota.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Typ odpowiedzi musi być kodem dla zakresów niebędących botami.",
|
"bots.invalid_response_type_for_non_bot": "Typ odpowiedzi musi być kodem dla zakresów niebędących botami.",
|
||||||
"bots.not_a_bot_application": "Ta aplikacja nie jest botem.",
|
"bots.not_a_bot_application": "Ta aplikacja nie jest botem.",
|
||||||
|
"bots.search_scope_unavailable": "Boty mogą wyszukiwać tylko w obrębie jednej społeczności lub jednego kanału.",
|
||||||
"calls_and_voice.call_already_exists": "W tym kanale trwa już połączenie.",
|
"calls_and_voice.call_already_exists": "W tym kanale trwa już połączenie.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Nie możesz zmienić stanu połączenia głosowego.",
|
"calls_and_voice.cannot_modify_voice_state": "Nie możesz zmienić stanu połączenia głosowego.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Nieprawidłowy lub ograniczony region RTC: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Nieprawidłowy lub ograniczony region RTC: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "O usuário do bot não foi encontrado.",
|
"bots.bot_user_not_found": "O usuário do bot não foi encontrado.",
|
||||||
"bots.invalid_response_type_for_non_bot": "O tipo de resposta deve ser código para escopos que não são de bot.",
|
"bots.invalid_response_type_for_non_bot": "O tipo de resposta deve ser código para escopos que não são de bot.",
|
||||||
"bots.not_a_bot_application": "Este app não é um bot.",
|
"bots.not_a_bot_application": "Este app não é um bot.",
|
||||||
|
"bots.search_scope_unavailable": "Bots só podem pesquisar dentro de uma única comunidade ou canal.",
|
||||||
"calls_and_voice.call_already_exists": "Já existe uma chamada neste canal.",
|
"calls_and_voice.call_already_exists": "Já existe uma chamada neste canal.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Você não pode alterar o estado de voz.",
|
"calls_and_voice.cannot_modify_voice_state": "Você não pode alterar o estado de voz.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Região RTC inválida ou restrita: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Região RTC inválida ou restrita: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Utilizatorul bot nu a fost găsit.",
|
"bots.bot_user_not_found": "Utilizatorul bot nu a fost găsit.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Tipul de răspuns trebuie să fie cod pentru domenii care nu sunt de bot.",
|
"bots.invalid_response_type_for_non_bot": "Tipul de răspuns trebuie să fie cod pentru domenii care nu sunt de bot.",
|
||||||
"bots.not_a_bot_application": "Această aplicație nu este un bot.",
|
"bots.not_a_bot_application": "Această aplicație nu este un bot.",
|
||||||
|
"bots.search_scope_unavailable": "Boții pot căuta doar într-o singură comunitate sau într-un singur canal.",
|
||||||
"calls_and_voice.call_already_exists": "Un apel este deja în desfășurare pe acest canal.",
|
"calls_and_voice.call_already_exists": "Un apel este deja în desfășurare pe acest canal.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Nu poți modifica starea vocală.",
|
"calls_and_voice.cannot_modify_voice_state": "Nu poți modifica starea vocală.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Regiune RTC invalidă sau restricționată: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Regiune RTC invalidă sau restricționată: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Не найден бот-пользователь.",
|
"bots.bot_user_not_found": "Не найден бот-пользователь.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Тип ответа должен быть code для областей, не связанных с ботами.",
|
"bots.invalid_response_type_for_non_bot": "Тип ответа должен быть code для областей, не связанных с ботами.",
|
||||||
"bots.not_a_bot_application": "Это приложение не является ботом.",
|
"bots.not_a_bot_application": "Это приложение не является ботом.",
|
||||||
|
"bots.search_scope_unavailable": "Боты могут искать только в пределах одного сообщества или канала.",
|
||||||
"calls_and_voice.call_already_exists": "В этом канале уже идёт звонок.",
|
"calls_and_voice.call_already_exists": "В этом канале уже идёт звонок.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Ты не можешь изменить голосовое состояние.",
|
"calls_and_voice.cannot_modify_voice_state": "Ты не можешь изменить голосовое состояние.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Ограниченный или недействительный RTC-регион: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Ограниченный или недействительный RTC-регион: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Botanvändaren hittades inte.",
|
"bots.bot_user_not_found": "Botanvändaren hittades inte.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Svarstypen måste vara kod för omfång som inte är botar.",
|
"bots.invalid_response_type_for_non_bot": "Svarstypen måste vara kod för omfång som inte är botar.",
|
||||||
"bots.not_a_bot_application": "Denna applikation är inte en bot.",
|
"bots.not_a_bot_application": "Denna applikation är inte en bot.",
|
||||||
|
"bots.search_scope_unavailable": "Bots kan bara söka inom en enda community eller kanal.",
|
||||||
"calls_and_voice.call_already_exists": "Det pågår redan ett samtal i den här kanalen.",
|
"calls_and_voice.call_already_exists": "Det pågår redan ett samtal i den här kanalen.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Du kan inte ändra röststatus.",
|
"calls_and_voice.cannot_modify_voice_state": "Du kan inte ändra röststatus.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Ogiltig eller begränsad RTC-region: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Ogiltig eller begränsad RTC-region: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "ไม่พบผู้ใช้บอท",
|
"bots.bot_user_not_found": "ไม่พบผู้ใช้บอท",
|
||||||
"bots.invalid_response_type_for_non_bot": "ประเภทการตอบกลับต้องเป็นโค้ดสำหรับขอบเขตที่ไม่ใช่บอท",
|
"bots.invalid_response_type_for_non_bot": "ประเภทการตอบกลับต้องเป็นโค้ดสำหรับขอบเขตที่ไม่ใช่บอท",
|
||||||
"bots.not_a_bot_application": "แอปพลิเคชันนี้ไม่ใช่บอท",
|
"bots.not_a_bot_application": "แอปพลิเคชันนี้ไม่ใช่บอท",
|
||||||
|
"bots.search_scope_unavailable": "บอทสามารถค้นหาได้เฉพาะภายในคอมมูนิตี้เดียวหรือช่องเดียวเท่านั้น",
|
||||||
"calls_and_voice.call_already_exists": "มีการโทรอยู่ในช่องนี้แล้ว",
|
"calls_and_voice.call_already_exists": "มีการโทรอยู่ในช่องนี้แล้ว",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "แก้ไขสถานะเสียงไม่ได้",
|
"calls_and_voice.cannot_modify_voice_state": "แก้ไขสถานะเสียงไม่ได้",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "ภูมิภาค RTC ไม่ถูกต้องหรือถูกจำกัด: {region}",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "ภูมิภาค RTC ไม่ถูกต้องหรือถูกจำกัด: {region}",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Bot kullanıcısı bulunamadı.",
|
"bots.bot_user_not_found": "Bot kullanıcısı bulunamadı.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Bot olmayan kapsamlar için yanıt türü kod olmalı.",
|
"bots.invalid_response_type_for_non_bot": "Bot olmayan kapsamlar için yanıt türü kod olmalı.",
|
||||||
"bots.not_a_bot_application": "Bu uygulama bir bot değil.",
|
"bots.not_a_bot_application": "Bu uygulama bir bot değil.",
|
||||||
|
"bots.search_scope_unavailable": "Botlar yalnızca tek bir toplulukta veya kanalda arama yapabilir.",
|
||||||
"calls_and_voice.call_already_exists": "Bu kanalda zaten bir arama devam ediyor.",
|
"calls_and_voice.call_already_exists": "Bu kanalda zaten bir arama devam ediyor.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Ses durumunu değiştiremezsin.",
|
"calls_and_voice.cannot_modify_voice_state": "Ses durumunu değiştiremezsin.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Geçersiz veya kısıtlı RTC bölgesi: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Geçersiz veya kısıtlı RTC bölgesi: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Користувача бота не знайдено.",
|
"bots.bot_user_not_found": "Користувача бота не знайдено.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Тип відповіді має бути кодом для дозволів, що не стосуються ботів.",
|
"bots.invalid_response_type_for_non_bot": "Тип відповіді має бути кодом для дозволів, що не стосуються ботів.",
|
||||||
"bots.not_a_bot_application": "Цей застосунок не є ботом.",
|
"bots.not_a_bot_application": "Цей застосунок не є ботом.",
|
||||||
|
"bots.search_scope_unavailable": "Боти можуть шукати лише в межах однієї спільноти або одного каналу.",
|
||||||
"calls_and_voice.call_already_exists": "У цьому каналі вже триває голосовий виклик.",
|
"calls_and_voice.call_already_exists": "У цьому каналі вже триває голосовий виклик.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Ти не можеш змінювати стан голосу.",
|
"calls_and_voice.cannot_modify_voice_state": "Ти не можеш змінювати стан голосу.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Недійсний або обмежений RTC-регіон: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Недійсний або обмежений RTC-регіон: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Không tìm thấy người dùng bot.",
|
"bots.bot_user_not_found": "Không tìm thấy người dùng bot.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Loại phản hồi phải là mã cho các phạm vi không phải bot.",
|
"bots.invalid_response_type_for_non_bot": "Loại phản hồi phải là mã cho các phạm vi không phải bot.",
|
||||||
"bots.not_a_bot_application": "Ứng dụng này không phải là bot.",
|
"bots.not_a_bot_application": "Ứng dụng này không phải là bot.",
|
||||||
|
"bots.search_scope_unavailable": "Bot chỉ có thể tìm kiếm trong một cộng đồng hoặc một kênh duy nhất.",
|
||||||
"calls_and_voice.call_already_exists": "Có một cuộc gọi đang diễn ra trong kênh này.",
|
"calls_and_voice.call_already_exists": "Có một cuộc gọi đang diễn ra trong kênh này.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "Bạn không thể sửa đổi trạng thái thoại.",
|
"calls_and_voice.cannot_modify_voice_state": "Bạn không thể sửa đổi trạng thái thoại.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Vùng RTC không hợp lệ hoặc bị hạn chế: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Vùng RTC không hợp lệ hoặc bị hạn chế: {region}.",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "未找到机器人用户。",
|
"bots.bot_user_not_found": "未找到机器人用户。",
|
||||||
"bots.invalid_response_type_for_non_bot": "非机器人范围的响应类型必须是代码。",
|
"bots.invalid_response_type_for_non_bot": "非机器人范围的响应类型必须是代码。",
|
||||||
"bots.not_a_bot_application": "此应用不是机器人。",
|
"bots.not_a_bot_application": "此应用不是机器人。",
|
||||||
|
"bots.search_scope_unavailable": "机器人只能在单个社区或频道内搜索。",
|
||||||
"calls_and_voice.call_already_exists": "此频道已有通话正在进行中。",
|
"calls_and_voice.call_already_exists": "此频道已有通话正在进行中。",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "你无法修改语音状态。",
|
"calls_and_voice.cannot_modify_voice_state": "你无法修改语音状态。",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "无效或受限的 RTC 区域:{region}。",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "无效或受限的 RTC 区域:{region}。",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "找不到機器人使用者。",
|
"bots.bot_user_not_found": "找不到機器人使用者。",
|
||||||
"bots.invalid_response_type_for_non_bot": "非機器人範圍的回應類型必須是授權碼。",
|
"bots.invalid_response_type_for_non_bot": "非機器人範圍的回應類型必須是授權碼。",
|
||||||
"bots.not_a_bot_application": "此應用程式不是機器人。",
|
"bots.not_a_bot_application": "此應用程式不是機器人。",
|
||||||
|
"bots.search_scope_unavailable": "機器人只能在單一社群或頻道內搜尋。",
|
||||||
"calls_and_voice.call_already_exists": "此頻道已有通話正在進行中。",
|
"calls_and_voice.call_already_exists": "此頻道已有通話正在進行中。",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "你無法修改語音狀態。",
|
"calls_and_voice.cannot_modify_voice_state": "你無法修改語音狀態。",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "無效或受限制的 RTC 地區:{region}。",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "無效或受限制的 RTC 地區:{region}。",
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
"bots.bot_user_not_found": "Bot user wasn't found.",
|
"bots.bot_user_not_found": "Bot user wasn't found.",
|
||||||
"bots.invalid_response_type_for_non_bot": "Response type must be code for non-bot scopes.",
|
"bots.invalid_response_type_for_non_bot": "Response type must be code for non-bot scopes.",
|
||||||
"bots.not_a_bot_application": "This application isn't a bot.",
|
"bots.not_a_bot_application": "This application isn't a bot.",
|
||||||
|
"bots.search_scope_unavailable": "Bots can only search within a single community or channel.",
|
||||||
"calls_and_voice.call_already_exists": "A call is already in progress in this channel.",
|
"calls_and_voice.call_already_exists": "A call is already in progress in this channel.",
|
||||||
"calls_and_voice.cannot_modify_voice_state": "You can't modify voice state.",
|
"calls_and_voice.cannot_modify_voice_state": "You can't modify voice state.",
|
||||||
"calls_and_voice.invalid_or_restricted_rtc_region": "Invalid or restricted RTC region: {region}.",
|
"calls_and_voice.invalid_or_restricted_rtc_region": "Invalid or restricted RTC region: {region}.",
|
||||||
|
|||||||
Reference in new issue
Block a user