From eb7dfb4f6473a1f52cb3e5f60f06f592ad81f3dc Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 25 Nov 2021 16:24:36 -0700 Subject: [PATCH] Initial support for matrix-hookshot#github Missing: * Bridge repo * Unbridge repo * Ignore hooks? * List orgs and repos (or other sensible format) * GH Auth --- package.json | 4 +- src/MemoryCache.ts | 1 + src/api/admin/AdminHookshotGithubService.ts | 110 +++ src/bridges/HookshotGithubBridge.ts | 101 ++ src/bridges/models/hookshot.ts | 16 + src/db/BridgeStore.ts | 19 +- src/db/DimensionStore.ts | 2 + .../20211124135245-RemoveGitterRecord.ts | 2 +- .../20211125150045-AddHookshotGithubBridge.ts | 23 + ...125150145-AddHookshotGithubBridgeRecord.ts | 23 + src/db/models/HookshotGithubBridgeRecord.ts | 30 + src/index.ts | 3 +- src/integrations/Bridge.ts | 6 + .../hookshot-github.component.html | 41 + .../hookshot-github.component.scss | 3 + .../hookshot-github.component.ts | 86 ++ .../manage-selfhosted.component.html | 31 + .../manage-selfhosted.component.scss | 0 .../manage-selfhosted.component.ts | 64 ++ web/app/app.module.ts | 12 +- web/app/app.routing.ts | 12 + .../hookshot-github.bridge.component.html | 44 + .../hookshot-github.bridge.component.scss | 4 + .../hookshot-github.bridge.component.ts | 101 ++ web/app/home/home.component.html | 4 + web/app/shared/models/hookshot_github.ts | 11 + .../shared/registry/integrations.registry.ts | 1 + .../admin-hookshot-github-api.service.ts | 39 + .../hookshot-github-api.service.ts | 21 + web/assets/i18n/en.json | 928 +++++++++--------- web/assets/i18n/template.json | 928 +++++++++--------- 31 files changed, 1731 insertions(+), 939 deletions(-) create mode 100644 src/api/admin/AdminHookshotGithubService.ts create mode 100644 src/bridges/HookshotGithubBridge.ts create mode 100644 src/bridges/models/hookshot.ts create mode 100644 src/db/migrations/20211125150045-AddHookshotGithubBridge.ts create mode 100644 src/db/migrations/20211125150145-AddHookshotGithubBridgeRecord.ts create mode 100644 src/db/models/HookshotGithubBridgeRecord.ts create mode 100644 web/app/admin/bridges/hookshot-github/hookshot-github.component.html create mode 100644 web/app/admin/bridges/hookshot-github/hookshot-github.component.scss create mode 100644 web/app/admin/bridges/hookshot-github/hookshot-github.component.ts create mode 100644 web/app/admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component.html create mode 100644 web/app/admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component.scss create mode 100644 web/app/admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component.ts create mode 100644 web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.html create mode 100644 web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.scss create mode 100644 web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.ts create mode 100644 web/app/shared/models/hookshot_github.ts create mode 100644 web/app/shared/services/admin/admin-hookshot-github-api.service.ts create mode 100644 web/app/shared/services/integrations/hookshot-github-api.service.ts diff --git a/package.json b/package.json index 9a52160..0a44b2d 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "lint:app": "eslint src", "lint:web": "eslint web", "i18n": "npm run-script i18n:init && npm run-script i18n:extract", - "i18n:init": "ngx-translate-extract --input ./web --output ./web/public/assets/i18n/template.json --key-as-default-value --replace --format json", - "i18n:extract": "ngx-translate-extract --input ./web --output ./web/public/assets/i18n/en.json --clean --format json" + "i18n:init": "ngx-translate-extract --input ./web --output ./web/assets/i18n/template.json --key-as-default-value --replace --format json", + "i18n:extract": "ngx-translate-extract --input ./web --output ./web/assets/i18n/en.json --key-as-default-value --clean --format json" }, "repository": { "type": "git", diff --git a/src/MemoryCache.ts b/src/MemoryCache.ts index f856771..0ad8bcc 100644 --- a/src/MemoryCache.ts +++ b/src/MemoryCache.ts @@ -51,6 +51,7 @@ export const CACHE_FEDERATION = "federation"; export const CACHE_IRC_BRIDGE = "irc-bridge"; export const CACHE_STICKERS = "stickers"; export const CACHE_TELEGRAM_BRIDGE = "telegram-bridge"; +export const CACHE_HOOKSHOT_GITHUB_BRIDGE = "hookshot-github-bridge"; export const CACHE_WEBHOOKS_BRIDGE = "webhooks-bridge"; export const CACHE_SIMPLE_BOTS = "simple-bots"; export const CACHE_SLACK_BRIDGE = "slack-bridge"; diff --git a/src/api/admin/AdminHookshotGithubService.ts b/src/api/admin/AdminHookshotGithubService.ts new file mode 100644 index 0000000..5314750 --- /dev/null +++ b/src/api/admin/AdminHookshotGithubService.ts @@ -0,0 +1,110 @@ +import { Context, GET, Path, PathParam, POST, QueryParam, Security, ServiceContext } from "typescript-rest"; +import { Cache, CACHE_HOOKSHOT_GITHUB_BRIDGE, CACHE_INTEGRATIONS, CACHE_TELEGRAM_BRIDGE } from "../../MemoryCache"; +import { LogService } from "matrix-bot-sdk"; +import { ApiError } from "../ApiError"; +import { ROLE_ADMIN, ROLE_USER } from "../security/MatrixSecurity"; +import HookshotGithubBridgeRecord from "../../db/models/HookshotGithubBridgeRecord"; + +interface CreateWithUpstream { + upstreamId: number; +} + +interface CreateSelfhosted { + provisionUrl: string; + sharedSecret: string; +} + +interface BridgeResponse { + id: number; + upstreamId?: number; + provisionUrl?: string; + sharedSecret?: string; + isEnabled: boolean; +} + +/** + * Administrative API for configuring Hookshot Github bridge instances. + */ +@Path("/api/v1/dimension/admin/hookshot/github") +export class AdminTelegramService { + + @Context + private context: ServiceContext; + + @GET + @Path("all") + @Security([ROLE_USER, ROLE_ADMIN]) + public async getBridges(): Promise { + const bridges = await HookshotGithubBridgeRecord.findAll(); + return Promise.all(bridges.map(async b => { + return { + id: b.id, + upstreamId: b.upstreamId, + provisionUrl: b.provisionUrl, + sharedSecret: b.sharedSecret, + isEnabled: b.isEnabled, + }; + })); + } + + @GET + @Path(":bridgeId") + @Security([ROLE_USER, ROLE_ADMIN]) + public async getBridge(@PathParam("bridgeId") bridgeId: number): Promise { + const telegramBridge = await HookshotGithubBridgeRecord.findByPk(bridgeId); + if (!telegramBridge) throw new ApiError(404, "Github Bridge not found"); + + return { + id: telegramBridge.id, + upstreamId: telegramBridge.upstreamId, + provisionUrl: telegramBridge.provisionUrl, + sharedSecret: telegramBridge.sharedSecret, + isEnabled: telegramBridge.isEnabled, + }; + } + + @POST + @Path(":bridgeId") + @Security([ROLE_USER, ROLE_ADMIN]) + public async updateBridge(@PathParam("bridgeId") bridgeId: number, request: CreateSelfhosted): Promise { + const userId = this.context.request.user.userId; + + const bridge = await HookshotGithubBridgeRecord.findByPk(bridgeId); + if (!bridge) throw new ApiError(404, "Bridge not found"); + + bridge.provisionUrl = request.provisionUrl; + bridge.sharedSecret = request.sharedSecret; + await bridge.save(); + + LogService.info("AdminHookshotGithubService", userId + " updated Hookshot Github Bridge " + bridge.id); + + Cache.for(CACHE_HOOKSHOT_GITHUB_BRIDGE).clear(); + Cache.for(CACHE_INTEGRATIONS).clear(); + return this.getBridge(bridge.id); + } + + @POST + @Path("new/upstream") + @Security([ROLE_USER, ROLE_ADMIN]) + public async newConfigForUpstream(@QueryParam("scalar_token") _scalarToken: string, _request: CreateWithUpstream): Promise { + throw new ApiError(400, "Cannot create a github bridge from an upstream"); + } + + @POST + @Path("new/selfhosted") + @Security([ROLE_USER, ROLE_ADMIN]) + public async newSelfhosted(request: CreateSelfhosted): Promise { + const userId = this.context.request.user.userId; + + const bridge = await HookshotGithubBridgeRecord.create({ + provisionUrl: request.provisionUrl, + sharedSecret: request.sharedSecret, + isEnabled: true, + }); + LogService.info("AdminTelegramService", userId + " created a new Hookshot Github Bridge with provisioning URL " + request.provisionUrl); + + Cache.for(CACHE_HOOKSHOT_GITHUB_BRIDGE).clear(); + Cache.for(CACHE_INTEGRATIONS).clear(); + return this.getBridge(bridge.id); + } +} diff --git a/src/bridges/HookshotGithubBridge.ts b/src/bridges/HookshotGithubBridge.ts new file mode 100644 index 0000000..fb8d28b --- /dev/null +++ b/src/bridges/HookshotGithubBridge.ts @@ -0,0 +1,101 @@ +import { LogService } from "matrix-bot-sdk"; +import * as request from "request"; +import HookshotGithubBridgeRecord from "../db/models/HookshotGithubBridgeRecord"; +import { + HookshotConnection, + HookshotConnectionsResponse, + HookshotGithubRoomConfig, + HookshotTypes +} from "./models/hookshot"; + +export class HookshotGithubBridge { + constructor(private requestingUserId: string) { + } + + private async getDefaultBridge(): Promise { + const bridges = await HookshotGithubBridgeRecord.findAll({where: {isEnabled: true}}); + if (!bridges || bridges.length !== 1) { + throw new Error("No bridges or too many bridges found"); + } + + return bridges[0]; + } + + public async isBridgingEnabled(): Promise { + const bridges = await HookshotGithubBridgeRecord.findAll({where: {isEnabled: true}}); + return !!bridges && bridges.length > 0; + } + + public async getRoomConfigurations(inRoomId: string): Promise { + const bridge = await this.getDefaultBridge(); + + try { + const connections = await this.doProvisionRequest(bridge, "GET", `/v1/${inRoomId}/connections`); + return connections.filter(c => c.type === HookshotTypes.Github); + } catch (e) { + if (e.errBody['error'] === "Could not determine if the user is in the room.") { + return []; + } + + throw e; + } + } + + public async bridgeRoom(roomId: string): Promise { + const bridge = await this.getDefaultBridge(); + + const body = {}; + return await this.doProvisionRequest(bridge, "PUT", `/v1/${roomId}/connections/${HookshotTypes.Github}`, null, body); + } + + public async unbridgeRoom(roomId: string, connectionId: string): Promise { + const bridge = await this.getDefaultBridge(); + await this.doProvisionRequest(bridge, "DELETE", `/v1/${roomId}/connections/${connectionId}`); + } + + private async doProvisionRequest(bridge: HookshotGithubBridgeRecord, method: string, endpoint: string, qs?: any, body?: any): Promise { + const provisionUrl = bridge.provisionUrl; + const apiUrl = provisionUrl.endsWith("/") ? provisionUrl.substring(0, provisionUrl.length - 1) : provisionUrl; + const url = apiUrl + (endpoint.startsWith("/") ? endpoint : "/" + endpoint); + LogService.info("TelegramBridge", "Doing provision Github Hookshot Bridge request: " + url); + + if (!qs) qs = {}; + + if (qs["userId"] === false) delete qs["userId"]; + else if (!qs["userId"]) qs["userId"] = this.requestingUserId; + + return new Promise((resolve, reject) => { + request({ + method: method, + url: url, + qs: qs, + json: body, + headers: { + "Authorization": `Bearer ${bridge.sharedSecret}`, + }, + }, (err, res, _body) => { + try { + if (err) { + LogService.error("GithubHookshotBridge", "Error calling" + url); + LogService.error("GithubHookshotBridge", err); + reject(err); + } else if (!res) { + LogService.error("GithubHookshotBridge", "There is no response for " + url); + reject(new Error("No response provided - is the service online?")); + } else if (res.statusCode !== 200 && res.statusCode !== 202) { + LogService.error("GithubHookshotBridge", "Got status code " + res.statusCode + " when calling " + url); + LogService.error("GithubHookshotBridge", res.body); + if (typeof (res.body) === "string") res.body = JSON.parse(res.body); + reject({errBody: res.body, error: new Error("Request failed")}); + } else { + if (typeof (res.body) === "string") res.body = JSON.parse(res.body); + resolve(res.body); + } + } catch (e) { + LogService.error("GithubHookshotBridge", e); + reject(e); + } + }); + }); + } +} diff --git a/src/bridges/models/hookshot.ts b/src/bridges/models/hookshot.ts new file mode 100644 index 0000000..6eebda6 --- /dev/null +++ b/src/bridges/models/hookshot.ts @@ -0,0 +1,16 @@ +export interface HookshotConnection { + type: string; + id: string; + service: string; // human-readable + details: any; // context-specific +} + +export type HookshotConnectionsResponse = HookshotConnection[]; + +export interface HookshotGithubRoomConfig { + +} + +export enum HookshotTypes { + Github = "uk.half-shot.matrix-hookshot.github.repository", +} diff --git a/src/db/BridgeStore.ts b/src/db/BridgeStore.ts index 64a47a7..cd14cc4 100644 --- a/src/db/BridgeStore.ts +++ b/src/db/BridgeStore.ts @@ -1,5 +1,5 @@ import { - Bridge, + Bridge, HookshotGithubBridgeConfiguration, SlackBridgeConfiguration, TelegramBridgeConfiguration, WebhookBridgeConfiguration @@ -10,6 +10,7 @@ import { LogService } from "matrix-bot-sdk"; import { TelegramBridge } from "../bridges/TelegramBridge"; import { WebhooksBridge } from "../bridges/WebhooksBridge"; import { SlackBridge } from "../bridges/SlackBridge"; +import { HookshotGithubBridge } from "../bridges/HookshotGithubBridge"; export class BridgeStore { @@ -59,7 +60,7 @@ export class BridgeStore { const record = await BridgeRecord.findOne({where: {type: integrationType}}); if (!record) throw new Error("Bridge not found"); - const hasDedicatedApi = ["irc", "telegram", "webhooks", "slack"]; + const hasDedicatedApi = ["irc", "telegram", "webhooks", "slack", "hookshot_github"]; if (hasDedicatedApi.indexOf(integrationType) !== -1) { throw new Error("This bridge should be modified with the dedicated API"); } else throw new Error("Unsupported bridge"); @@ -78,6 +79,9 @@ export class BridgeStore { } else if (record.type === "slack") { const slack = new SlackBridge(requestingUserId); return slack.isBridgingEnabled(); + } else if (record.type === "hookshot_github") { + const hookshot = new HookshotGithubBridge(requestingUserId); + return hookshot.isBridgingEnabled(); } else return true; } @@ -94,6 +98,9 @@ export class BridgeStore { } else if (record.type === "slack") { const slack = new SlackBridge(requestingUserId); return slack.isBridgingEnabled(); + } else if (record.type === "hookshot_github") { + const hookshot = new HookshotGithubBridge(requestingUserId); + return hookshot.isBridgingEnabled(); } else return false; } @@ -131,6 +138,14 @@ export class BridgeStore { link: link, botUserId: info.botUserId, }; + } else if (record.type === "hookshot_github") { + if (!inRoomId) return {}; // The bridge's admin config is handled by other APIs + const hookshot = new HookshotGithubBridge(requestingUserId); + const connections = await hookshot.getRoomConfigurations(inRoomId); + return { + botUserId: "@hookshot_bot:localhost", // TODO + connections: connections, + }; } else return {}; } diff --git a/src/db/DimensionStore.ts b/src/db/DimensionStore.ts index 7f171fc..799e4be 100644 --- a/src/db/DimensionStore.ts +++ b/src/db/DimensionStore.ts @@ -29,6 +29,7 @@ import TermsRecord from "./models/TermsRecord"; import TermsTextRecord from "./models/TermsTextRecord"; import TermsSignedRecord from "./models/TermsSignedRecord"; import TermsUpstreamRecord from "./models/TermsUpstreamRecord"; +import HookshotGithubBridgeRecord from "./models/HookshotGithubBridgeRecord"; class _DimensionStore { private sequelize: Sequelize; @@ -75,6 +76,7 @@ class _DimensionStore { TermsTextRecord, TermsSignedRecord, TermsUpstreamRecord, + HookshotGithubBridgeRecord, ]); } diff --git a/src/db/migrations/20211124135245-RemoveGitterRecord.ts b/src/db/migrations/20211124135245-RemoveGitterRecord.ts index d8d84c7..eef9912 100644 --- a/src/db/migrations/20211124135245-RemoveGitterRecord.ts +++ b/src/db/migrations/20211124135245-RemoveGitterRecord.ts @@ -13,7 +13,7 @@ export default { { type: "gitter", name: "Gitter Bridge", - avatarUrl: "/img/avatars/gitter.png", + avatarUrl: "/assets/img/avatars/gitter.png", isEnabled: true, isPublic: true, description: "Bridges Gitter rooms to Matrix", diff --git a/src/db/migrations/20211125150045-AddHookshotGithubBridge.ts b/src/db/migrations/20211125150045-AddHookshotGithubBridge.ts new file mode 100644 index 0000000..81e91ef --- /dev/null +++ b/src/db/migrations/20211125150045-AddHookshotGithubBridge.ts @@ -0,0 +1,23 @@ +import { QueryInterface } from "sequelize"; +import { DataType } from "sequelize-typescript"; + +export default { + up: (queryInterface: QueryInterface) => { + return Promise.resolve() + .then(() => queryInterface.createTable("dimension_hookshot_github_bridges", { + "id": {type: DataType.INTEGER, primaryKey: true, autoIncrement: true, allowNull: false}, + "upstreamId": { + type: DataType.INTEGER, allowNull: true, + references: {model: "dimension_upstreams", key: "id"}, + onUpdate: "cascade", onDelete: "cascade", + }, + "provisionUrl": {type: DataType.STRING, allowNull: true}, + "sharedSecret": {type: DataType.STRING, allowNull: true}, + "isEnabled": {type: DataType.BOOLEAN, allowNull: false}, + })); + }, + down: (queryInterface: QueryInterface) => { + return Promise.resolve() + .then(() => queryInterface.dropTable("dimension_hookshot_github_bridges")); + } +} diff --git a/src/db/migrations/20211125150145-AddHookshotGithubBridgeRecord.ts b/src/db/migrations/20211125150145-AddHookshotGithubBridgeRecord.ts new file mode 100644 index 0000000..be8d31d --- /dev/null +++ b/src/db/migrations/20211125150145-AddHookshotGithubBridgeRecord.ts @@ -0,0 +1,23 @@ +import { QueryInterface } from "sequelize"; + +export default { + up: (queryInterface: QueryInterface) => { + return Promise.resolve() + .then(() => queryInterface.bulkInsert("dimension_bridges", [ + { + type: "hookshot_github", + name: "Github Bridge", + avatarUrl: "/assets/img/avatars/github.png", + isEnabled: true, + isPublic: true, + description: "Bridges Github issues to Matrix", + }, + ])); + }, + down: (queryInterface: QueryInterface) => { + return Promise.resolve() + .then(() => queryInterface.bulkDelete("dimension_bridges", { + type: "hookshot_github", + })); + } +} diff --git a/src/db/models/HookshotGithubBridgeRecord.ts b/src/db/models/HookshotGithubBridgeRecord.ts new file mode 100644 index 0000000..0e11930 --- /dev/null +++ b/src/db/models/HookshotGithubBridgeRecord.ts @@ -0,0 +1,30 @@ +import { AllowNull, AutoIncrement, Column, ForeignKey, Model, PrimaryKey, Table } from "sequelize-typescript"; +import Upstream from "./Upstream"; + +@Table({ + tableName: "dimension_hookshot_github_bridges", + underscored: false, + timestamps: false, +}) +export default class HookshotGithubBridgeRecord extends Model { + @PrimaryKey + @AutoIncrement + @Column + id: number; + + @AllowNull + @Column + @ForeignKey(() => Upstream) + upstreamId?: number; + + @AllowNull + @Column + provisionUrl?: string; + + @AllowNull + @Column + sharedSecret?: string; + + @Column + isEnabled: boolean; +} diff --git a/src/index.ts b/src/index.ts index d29bae3..dfe905b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { LogLevel, LogService } from "matrix-bot-sdk"; +import { LogLevel, LogService, RichConsoleLogger } from "matrix-bot-sdk"; import { DimensionStore } from "./db/DimensionStore"; import Webserver from "./api/Webserver"; import { CURRENT_VERSION } from "./version"; @@ -16,6 +16,7 @@ declare global { } LogService.setLevel(LogLevel.DEBUG); +LogService.setLogger(new RichConsoleLogger()); LogService.info("index", "Starting dimension " + CURRENT_VERSION); async function startup() { diff --git a/src/integrations/Bridge.ts b/src/integrations/Bridge.ts index 9de882f..bf1fc9f 100644 --- a/src/integrations/Bridge.ts +++ b/src/integrations/Bridge.ts @@ -4,6 +4,7 @@ import { AvailableNetworks, LinkedChannels } from "../bridges/IrcBridge"; import { PortalInfo, PuppetInfo } from "../bridges/TelegramBridge"; import { WebhookConfiguration } from "../bridges/models/webhooks"; import { BridgedChannel } from "../bridges/SlackBridge"; +import { HookshotConnection } from "../bridges/models/hookshot"; const PRIVATE_ACCESS_SUPPORTED_BRIDGES = ["webhooks"]; @@ -45,3 +46,8 @@ export interface SlackBridgeConfiguration { link: BridgedChannel; botUserId: string; } + +export interface HookshotGithubBridgeConfiguration { + botUserId: string; + connections: HookshotConnection[]; +} diff --git a/web/app/admin/bridges/hookshot-github/hookshot-github.component.html b/web/app/admin/bridges/hookshot-github/hookshot-github.component.html new file mode 100644 index 0000000..78fa9c4 --- /dev/null +++ b/web/app/admin/bridges/hookshot-github/hookshot-github.component.html @@ -0,0 +1,41 @@ +
+ +
+
+ +
+

+ {{'matrix-hookshot' | translate}} + {{'is a multi-purpose bridge which supports Github as an integration. If enabled in the configuration, it can be used here to offer a UI for setting up a room to pipe to a repository.' | translate}} + + + + + + + + + + + + + + + + +
{{'Name' | translate}}{{'Actions' | translate}}
{{'No bridge configurations.' | translate}}
+ {{ bridge.upstreamId ? "matrix.org's bridge" : "Self-hosted bridge" }} + ({{ bridge.provisionUrl }}) + + + + +
+ +

+
+
diff --git a/web/app/admin/bridges/hookshot-github/hookshot-github.component.scss b/web/app/admin/bridges/hookshot-github/hookshot-github.component.scss new file mode 100644 index 0000000..788d7ed --- /dev/null +++ b/web/app/admin/bridges/hookshot-github/hookshot-github.component.scss @@ -0,0 +1,3 @@ +.editButton { + cursor: pointer; +} \ No newline at end of file diff --git a/web/app/admin/bridges/hookshot-github/hookshot-github.component.ts b/web/app/admin/bridges/hookshot-github/hookshot-github.component.ts new file mode 100644 index 0000000..edf1555 --- /dev/null +++ b/web/app/admin/bridges/hookshot-github/hookshot-github.component.ts @@ -0,0 +1,86 @@ +import { Component, OnInit } from "@angular/core"; +import { ToasterService } from "angular2-toaster"; +import { + AdminHookshotGithubBridgeManageSelfhostedComponent, + ManageSelfhostedHookshotGithubBridgeDialogContext +} from "./manage-selfhosted/manage-selfhosted.component"; +import { FE_TelegramBridge } from "../../../shared/models/telegram"; +import { TranslateService } from "@ngx-translate/core"; +import { NgbModal } from "@ng-bootstrap/ng-bootstrap"; +import { AdminHookshotGithubApiService } from "../../../shared/services/admin/admin-hookshot-github-api.service"; +import { FE_HookshotGithubBridge } from "../../../shared/models/hookshot_github"; + +@Component({ + templateUrl: "./hookshot-github.component.html", + styleUrls: ["./hookshot-github.component.scss"], +}) +export class AdminHookshotGithubBridgeComponent implements OnInit { + + public isLoading = true; + public isUpdating = false; + public configurations: FE_TelegramBridge[] = []; + + constructor(private hookshotApi: AdminHookshotGithubApiService, + private toaster: ToasterService, + private modal: NgbModal, + public translate: TranslateService) { + this.translate = translate; + } + + public ngOnInit() { + this.reload().then(() => this.isLoading = false); + } + + private async reload(): Promise { + try { + this.configurations = await this.hookshotApi.getBridges(); + } catch (err) { + console.error(err); + this.translate.get('Error loading bridges').subscribe((res: string) => { + this.toaster.pop("error", res); + }); + } + } + + public addSelfHostedBridge() { + const selfhostedRef = this.modal.open(AdminHookshotGithubBridgeManageSelfhostedComponent, { + backdrop: 'static', + size: 'lg', + }); + selfhostedRef.result.then(() => { + try { + this.reload() + } catch (err) { + console.error(err); + this.translate.get('Failed to get an updated Github bridge list').subscribe((res: string) => { + this.toaster.pop("error", res); + }); + } + }) + const selfhostedInstance = selfhostedRef.componentInstance as ManageSelfhostedHookshotGithubBridgeDialogContext; + selfhostedInstance.provisionUrl = ''; + selfhostedInstance.sharedSecret = ''; + } + + public editBridge(bridge: FE_HookshotGithubBridge) { + const selfhostedRef = this.modal.open(AdminHookshotGithubBridgeManageSelfhostedComponent, { + backdrop: 'static', + size: 'lg', + }); + selfhostedRef.result.then(() => { + try { + this.reload() + } catch (err) { + console.error(err); + this.translate.get('Failed to get an updated Github bridge list').subscribe((res: string) => { + this.toaster.pop("error", res); + }); + } + }) + const selfhostedInstance = selfhostedRef.componentInstance as ManageSelfhostedHookshotGithubBridgeDialogContext; + selfhostedInstance.provisionUrl = bridge.provisionUrl; + selfhostedInstance.sharedSecret = bridge.sharedSecret; + selfhostedInstance.bridgeId = bridge.id; + selfhostedInstance.isAdding = !bridge.id; + } +} diff --git a/web/app/admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component.html b/web/app/admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component.html new file mode 100644 index 0000000..58e5c71 --- /dev/null +++ b/web/app/admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component.html @@ -0,0 +1,31 @@ + + + diff --git a/web/app/admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component.scss b/web/app/admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/web/app/admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component.ts b/web/app/admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component.ts new file mode 100644 index 0000000..6058610 --- /dev/null +++ b/web/app/admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component.ts @@ -0,0 +1,64 @@ +import { Component } from "@angular/core"; +import { NgbActiveModal } from "@ng-bootstrap/ng-bootstrap"; +import { ToasterService } from "angular2-toaster"; +import { AdminTelegramApiService } from "../../../../shared/services/admin/admin-telegram-api.service"; +import { TranslateService } from "@ngx-translate/core"; +import { AdminHookshotGithubApiService } from "../../../../shared/services/admin/admin-hookshot-github-api.service"; + +export interface ManageSelfhostedHookshotGithubBridgeDialogContext { + provisionUrl: string; + sharedSecret: string; + bridgeId: number; + isAdding: boolean; +} + +@Component({ + templateUrl: "./manage-selfhosted.component.html", + styleUrls: ["./manage-selfhosted.component.scss"], +}) +export class AdminHookshotGithubBridgeManageSelfhostedComponent { + + isSaving = false; + provisionUrl: string; + sharedSecret: string; + bridgeId: number; + isAdding = true; + + constructor(public modal: NgbActiveModal, + private hookshotApi: AdminHookshotGithubApiService, + private toaster: ToasterService, + public translate: TranslateService) { + this.translate = translate; + } + + public add() { + this.isSaving = true; + if (this.isAdding) { + this.hookshotApi.newSelfhosted(this.provisionUrl, this.sharedSecret).then(() => { + this.translate.get('Github bridge added').subscribe((res: string) => { + this.toaster.pop("success", res); + }); + this.modal.close(); + }).catch(err => { + console.error(err); + this.isSaving = false; + this.translate.get('Failed to create Github bridge').subscribe((res: string) => { + this.toaster.pop("error", res); + }); + }); + } else { + this.hookshotApi.updateSelfhosted(this.bridgeId, this.provisionUrl, this.sharedSecret).then(() => { + this.translate.get('Github bridge updated').subscribe((res: string) => { + this.toaster.pop("success", res); + }); + this.modal.close(); + }).catch(err => { + console.error(err); + this.isSaving = false; + this.translate.get('Failed to update Github bridge').subscribe((res: string) => { + this.toaster.pop("error", res); + }); + }); + } + } +} diff --git a/web/app/app.module.ts b/web/app/app.module.ts index 5e37ff9..32c1414 100644 --- a/web/app/app.module.ts +++ b/web/app/app.module.ts @@ -119,6 +119,11 @@ import { AdminWidgetWhiteboardConfigComponent } from "./admin/widgets/whiteboard import { TranslateLoader, TranslateModule } from "@ngx-translate/core"; import { TranslateHttpLoader } from "@ngx-translate/http-loader"; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { AdminHookshotGithubBridgeComponent } from "./admin/bridges/hookshot-github/hookshot-github.component"; +import { AdminHookshotGithubBridgeManageSelfhostedComponent } from "./admin/bridges/hookshot-github/manage-selfhosted/manage-selfhosted.component"; +import { AdminHookshotGithubApiService } from "./shared/services/admin/admin-hookshot-github-api.service"; +import { HookshotGithubApiService } from "./shared/services/integrations/hookshot-github-api.service"; +import { HookshotGithubBridgeConfigComponent } from "./configs/bridge/hookshot-github/hookshot-github.bridge.component"; // AoT requires an exported function for factories export function HttpLoaderFactory(http: HttpClient) { @@ -227,7 +232,10 @@ export function HttpLoaderFactory(http: HttpClient) { AdminTermsNewEditPublishDialogComponent, TermsWidgetWrapperComponent, WhiteboardWidgetComponent, - AdminWidgetWhiteboardConfigComponent + AdminWidgetWhiteboardConfigComponent, + AdminHookshotGithubBridgeComponent, + AdminHookshotGithubBridgeManageSelfhostedComponent, + HookshotGithubBridgeConfigComponent, // Vendor ], @@ -257,6 +265,8 @@ export function HttpLoaderFactory(http: HttpClient) { AdminSlackApiService, ToasterService, AdminTermsApiService, + AdminHookshotGithubApiService, + HookshotGithubApiService, {provide: Window, useValue: window}, // Vendor diff --git a/web/app/app.routing.ts b/web/app/app.routing.ts index 9e59efb..ed7e6f8 100644 --- a/web/app/app.routing.ts +++ b/web/app/app.routing.ts @@ -48,6 +48,8 @@ import { AdminTermsComponent } from "./admin/terms/terms.component"; import { AdminNewEditTermsComponent } from "./admin/terms/new-edit/new-edit.component"; import { TermsWidgetWrapperComponent } from "./widget-wrappers/terms/terms.component"; import { WhiteboardWidgetComponent } from "./configs/widget/whiteboard/whiteboard.widget.component"; +import { AdminHookshotGithubBridgeComponent } from "./admin/bridges/hookshot-github/hookshot-github.component"; +import { HookshotGithubBridgeConfigComponent } from "./configs/bridge/hookshot-github/hookshot-github.bridge.component"; const routes: Routes = [ {path: "", component: HomeComponent}, @@ -134,6 +136,11 @@ const routes: Routes = [ component: AdminSlackBridgeComponent, data: {breadcrumb: "Slack Bridge", name: "Slack Bridge"}, }, + { + path: "hookshot_github", + component: AdminHookshotGithubBridgeComponent, + data: {breadcrumb: "Github Bridge", name: "Github Bridge"}, + }, ], }, { @@ -272,6 +279,11 @@ const routes: Routes = [ component: SlackBridgeConfigComponent, data: {breadcrumb: "Slack Bridge Configuration", name: "Slack Bridge Configuration"}, }, + { + path: "hookshot_github", + component: HookshotGithubBridgeConfigComponent, + data: {breadcrumb: "Github Bridge Configuration", name: "Github Bridge Configuration"}, + }, ], }, { diff --git a/web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.html b/web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.html new file mode 100644 index 0000000..2fcfa2b --- /dev/null +++ b/web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.html @@ -0,0 +1,44 @@ + + + +
+ {{'Bridge to Github' | translate}} +
+
+ +
+
+
+

+ {{'In order to bridge to Github, you\'ll need to authorize the bridge to access your organization(s). Please click the button below to do so.' | translate}} +

+ + sign in with slack + +
+
+ + + +
+
+
+
+
diff --git a/web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.scss b/web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.scss new file mode 100644 index 0000000..9e914bf --- /dev/null +++ b/web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.scss @@ -0,0 +1,4 @@ +.actions-col { + width: 120px; + text-align: center; +} diff --git a/web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.ts b/web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.ts new file mode 100644 index 0000000..ebc03eb --- /dev/null +++ b/web/app/configs/bridge/hookshot-github/hookshot-github.bridge.component.ts @@ -0,0 +1,101 @@ +import { Component, OnInit } from "@angular/core"; +import { BridgeComponent } from "../bridge.component"; +import { FE_SlackChannel, FE_SlackLink, FE_SlackTeam } from "../../../shared/models/slack"; +import { SlackApiService } from "../../../shared/services/integrations/slack-api.service"; +import { ScalarClientApiService } from "../../../shared/services/scalar/scalar-client-api.service"; +import { DomSanitizer, SafeUrl } from "@angular/platform-browser"; +import { TranslateService } from "@ngx-translate/core"; +import { FE_HookshotGithubBridge, FE_HookshotGithubConnection } from "../../../shared/models/hookshot_github"; +import { HookshotGithubApiService } from "../../../shared/services/integrations/hookshot-github-api.service"; + +interface HookshotConfig { + botUserId: string; + connections: FE_HookshotGithubConnection[]; +} + +@Component({ + templateUrl: "hookshot-github.bridge.component.html", + styleUrls: ["hookshot-github.bridge.component.scss"], +}) +export class HookshotGithubBridgeConfigComponent extends BridgeComponent implements OnInit { + + public isBusy: boolean; + public needsAuth = false; + public authUrl: SafeUrl; + public loadingConnections = false; + public orgs: string[] = []; + public repos: string[] = []; // for org + public orgId: string; + public repoId: string; + + constructor(private hookshot: HookshotGithubApiService, private scalar: ScalarClientApiService, public translate: TranslateService) { + super("hookshot_github", translate); + this.translate = translate; + } + + public ngOnInit() { + super.ngOnInit(); + + this.prepare(); + } + + private prepare() { + + } + + public loadRepos() { + // TODO + } + + public get isBridged(): boolean { + return this.bridge.config.connections.length > 0; + } + + public async bridgeRoom(): Promise { + this.isBusy = true; + + try { + await this.scalar.inviteUser(this.roomId, this.bridge.config.botUserId); + } catch (e) { + if (!e.response || !e.response.error || !e.response.error._error || + e.response.error._error.message.indexOf("already in the room") === -1) { + this.isBusy = false; + this.translate.get('Error inviting bridge').subscribe((res: string) => { + this.toaster.pop("error", res); + }); + return; + } + } + + this.hookshot.bridgeRoom(this.roomId).then(conn => { + this.bridge.config.connections.push(conn); + this.isBusy = false; + this.translate.get('Bridge requested').subscribe((res: string) => { + this.toaster.pop("success", res); + }); + }).catch(error => { + this.isBusy = false; + console.error(error); + this.translate.get('Error requesting bridge').subscribe((res: string) => { + this.toaster.pop("error", res); + }); + }); + } + + public unbridgeRoom(): void { + this.isBusy = true; + this.hookshot.unbridgeRoom(this.roomId).then(() => { + this.bridge.config.connections = []; + this.isBusy = false; + this.translate.get('Bridge removed').subscribe((res: string) => { + this.toaster.pop("success", res); + }); + }).catch(error => { + this.isBusy = false; + console.error(error); + this.translate.get('Error removing bridge').subscribe((res: string) => { + this.toaster.pop("error", res); + }); + }); + } +} diff --git a/web/app/home/home.component.html b/web/app/home/home.component.html index b3f4c61..b4abc72 100644 --- a/web/app/home/home.component.html +++ b/web/app/home/home.component.html @@ -161,6 +161,10 @@ Slack +
+ + GitHub +
Webhooks diff --git a/web/app/shared/models/hookshot_github.ts b/web/app/shared/models/hookshot_github.ts new file mode 100644 index 0000000..a8bfa35 --- /dev/null +++ b/web/app/shared/models/hookshot_github.ts @@ -0,0 +1,11 @@ +export interface FE_HookshotGithubBridge { + id: number; + upstreamId?: number; + provisionUrl?: string; + sharedSecret?: string; + isEnabled: boolean; +} + +export interface FE_HookshotGithubConnection { + +} diff --git a/web/app/shared/registry/integrations.registry.ts b/web/app/shared/registry/integrations.registry.ts index 6f60fd3..4c91532 100644 --- a/web/app/shared/registry/integrations.registry.ts +++ b/web/app/shared/registry/integrations.registry.ts @@ -31,6 +31,7 @@ export class IntegrationsRegistry { "telegram": {}, "webhooks": {}, "slack": {}, + "hookshot_github": {}, }, "widget": { "custom": { diff --git a/web/app/shared/services/admin/admin-hookshot-github-api.service.ts b/web/app/shared/services/admin/admin-hookshot-github-api.service.ts new file mode 100644 index 0000000..bd20f85 --- /dev/null +++ b/web/app/shared/services/admin/admin-hookshot-github-api.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from "@angular/core"; +import { AuthedApi } from "../authed-api"; +import { FE_Upstream } from "../../models/admin-responses"; +import { FE_TelegramBridge, FE_TelegramBridgeOptions } from "../../models/telegram"; +import { HttpClient } from "@angular/common/http"; +import { FE_HookshotGithubBridge } from "../../models/hookshot_github"; + +@Injectable() +export class AdminHookshotGithubApiService extends AuthedApi { + constructor(http: HttpClient) { + super(http); + } + + public getBridges(): Promise { + return this.authedGet("/api/v1/dimension/admin/hookshot/github/all").toPromise(); + } + + public getBridge(bridgeId: number): Promise { + return this.authedGet("/api/v1/dimension/admin/hookshot/github/" + bridgeId).toPromise(); + } + + public newFromUpstream(upstream: FE_Upstream): Promise { + return this.authedPost("/api/v1/dimension/admin/hookshot/github/new/upstream", {upstreamId: upstream.id}).toPromise(); + } + + public newSelfhosted(provisionUrl: string, sharedSecret: string): Promise { + return this.authedPost("/api/v1/dimension/admin/hookshot/github/new/selfhosted", { + provisionUrl: provisionUrl, + sharedSecret: sharedSecret, + }).toPromise(); + } + + public updateSelfhosted(bridgeId: number, provisionUrl: string, sharedSecret: string): Promise { + return this.authedPost("/api/v1/dimension/admin/hookshot/github/" + bridgeId, { + provisionUrl: provisionUrl, + sharedSecret: sharedSecret, + }).toPromise(); + } +} diff --git a/web/app/shared/services/integrations/hookshot-github-api.service.ts b/web/app/shared/services/integrations/hookshot-github-api.service.ts new file mode 100644 index 0000000..5d07ddc --- /dev/null +++ b/web/app/shared/services/integrations/hookshot-github-api.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from "@angular/core"; +import { AuthedApi } from "../authed-api"; +import { HttpClient } from "@angular/common/http"; +import { FE_HookshotGithubConnection } from "../../models/hookshot_github"; + +@Injectable() +export class HookshotGithubApiService extends AuthedApi { + constructor(http: HttpClient) { + super(http); + } + + public bridgeRoom(roomId: string): Promise { + return this.authedPost("/api/v1/dimension/hookshot/github/room/" + roomId + "/connect", { + // TODO + }).toPromise(); + } + + public unbridgeRoom(roomId: string): Promise { + return this.authedDelete("/api/v1/dimension/hookshot/github/room/" + roomId + "/connections/all").toPromise(); + } +} diff --git a/web/assets/i18n/en.json b/web/assets/i18n/en.json index 2f05ffc..53272f2 100644 --- a/web/assets/i18n/en.json +++ b/web/assets/i18n/en.json @@ -1,467 +1,463 @@ { - "Dashboard": "Dashboard", - "Widgets": "Widgets", - "go-neb": "go-neb", - "Custom Bots": "Custom Bots", - "Bridges": "Bridges", - "Sticker Packs": "Sticker Packs", - "Terms of Service": "Terms of Service", - "Bridges provide a way for rooms to interact with and/or bring in events from a third party network. For example, an IRC bridge can allow IRC and matrix users to communicate with each other.": "Bridges provide a way for rooms to interact with and/or bring in events from a third party network. For example, an IRC bridge can allow IRC and matrix users to communicate with each other.", - "Name": "Name", - "Description": "Description", - "Actions": "Actions", - "No bridges.": "No bridges.", - "matrix-appservice-gitter": "matrix-appservice-gitter", - "is a Gitter bridge that supports bridging Gitter rooms to Matrix. Users on Matrix are represented as a single bot user in Gitter, however Gitter users are represented as real-looking Matrix users in the room.": "is a Gitter bridge that supports bridging Gitter rooms to Matrix. Users on Matrix are represented as a single bot user in Gitter, however Gitter users are represented as real-looking Matrix users in the room.", - "No bridge configurations.": "No bridge configurations.", - "Add matrix.org's bridge": "Add matrix.org's bridge", - "Add self-hosted bridge": "Add self-hosted bridge", - "self-hosted Gitter bridge": "self-hosted Gitter bridge ", - "Self-hosted Gitter bridges already have provisioning enabled. Be careful not to expose the API to the public internet.": "Self-hosted Gitter bridges already have provisioning enabled. Be careful not to expose the API to the public internet.", - "Provisioning URL": "Provisioning URL", - "The provisioning URL for the bridge. This is usually the same as the URL your homeserver uses to communicate with the bridge.": "The provisioning URL for the bridge. This is usually the same as the URL your homeserver uses to communicate with the bridge.", - "Save": "Save", - "Cancel": "Cancel", - "Add a new self-hosted IRC Bridge": "Add a new self-hosted IRC Bridge ", - "Self-hosted IRC bridges must have": "Self-hosted IRC bridges must have", - "provisioning": "provisioning", - "enabled in the configuration.": "enabled in the configuration.", - "The provisioning URL for the bridge. This is usually the same as the URL given in the registration. This API is not authenticated and should be treated with caution.": "The provisioning URL for the bridge. This is usually the same as the URL given in the registration. This API is not authenticated and should be treated with caution.", - "matrix-appservice-irc": "matrix-appservice-irc", - "is an IRC bridge that supports multiple IRC networks. Dimension is capable of using multiple IRC bridges to better distribute the load across multiple networks in large deployments.": "is an IRC bridge that supports multiple IRC networks. Dimension is capable of using multiple IRC bridges to better distribute the load across multiple networks in large deployments.", - "Enabled Networks": "Enabled Networks", - "This bridge is offline or unavailable.": "This bridge is offline or unavailable.", - "Network": "Network", - "Enabled": "Enabled", - "Close": "Close", - "self-hosted Slack bridge": "self-hosted Slack bridge ", - "Self-hosted Slack bridges already have provisioning enabled. Be careful not to expose the API to the public internet.": "Self-hosted Slack bridges already have provisioning enabled. Be careful not to expose the API to the public internet.", - "matrix-appservice-slack": "matrix-appservice-slack", - "is a Slack bridge that supports bridging Slack channels to Matrix. Users authorize the bridge to access their Slack workspaces and from there they can pick the channels they'd like to bridge.": "is a Slack bridge that supports bridging Slack channels to Matrix. Users authorize the bridge to access their Slack workspaces and from there they can pick the channels they'd like to bridge.", - "self-hosted Telegram bridge": "self-hosted Telegram bridge ", - "Self-hosted Telegram bridges must have": "Self-hosted Telegram bridges must have", - "The provisioning URL for the bridge. This is the public address for the bridge followed by the provisioning prefix given in the configuration.": "The provisioning URL for the bridge. This is the public address for the bridge followed by the provisioning prefix given in the configuration.", - "Shared Secret": "Shared Secret", - "The shared secret defined in the configuration for provisioning.": "The shared secret defined in the configuration for provisioning.", - "Promote Telegram Puppeting": "Promote Telegram Puppeting", - "If enabled, Dimension will recommend that users log in to their Telegram accounts.": "If enabled, Dimension will recommend that users log in to their Telegram accounts.", - "Promote Matrix Puppeting": "Promote Matrix Puppeting", - "If enabled, Dimension will recommend that users log in to their Matrix accounts.": "If enabled, Dimension will recommend that users log in to their Matrix accounts.", - "mautrix-telegram": "mautrix-telegram", - "is a Telegram bridge that supports bridging channels/supergroups to Matrix. This can be done through a 'relay bot' (all Matrix users are represented through a single bot in Telegram) or by making use of a user's real Telegram account (known as 'puppeting'). Currently only one Telegram bridge can be configured at a time.": "is a Telegram bridge that supports bridging channels/supergroups to Matrix. This can be done through a 'relay bot' (all Matrix users are represented through a single bot in Telegram) or by making use of a user's real Telegram account (known as 'puppeting'). Currently only one Telegram bridge can be configured at a time.", - "Enabled Features": "Enabled Features", - "self-hosted webhook bridge": "self-hosted webhook bridge ", - "Self-hosted webhook bridges must have": "Self-hosted webhook bridges must have", - "The public URL for the bridge.": "The public URL for the bridge.", - "The provisioning secret defined in the configuration.": "The provisioning secret defined in the configuration.", - "matrix-appservice-webhooks": "matrix-appservice-webhooks", - "provides Slack-compatible webhooks for Matrix, making it easy to send updates into a room.": "provides Slack-compatible webhooks for Matrix, making it easy to send updates into a room.", - "custom bot": "", - "The user ID that Dimension will invite to rooms.": "The user ID that Dimension will invite to rooms.", - "A few words here will help people understand what the bot does.": "A few words here will help people understand what the bot does.", - "Display Name": "Display Name", - "This is the name Dimension will use to tell users which bot this is.": "This is the name Dimension will use to tell users which bot this is.", - "This can either be an MXC URI or a plain URL.": "This can either be an MXC URI or a plain URL.", - "This is used by Dimension to force the bot to leave the room when the user removes the bot.": "This is used by Dimension to force the bot to leave the room when the user removes the bot.", - "Learn more about access tokens.": "Learn more about access tokens.", - "Custom bots give you the ability to add your own bots to Dimension for users to add to their rooms. These bots can't have any configuration to them and must be able to accept room invites on their own. All Dimension will do when a user wants to add the bot is invite it to the room.": "Custom bots give you the ability to add your own bots to Dimension for users to add to their rooms. These bots can't have any configuration to them and must be able to accept room invites on their own. All Dimension will do when a user wants to add the bot is invite it to the room.", - "No custom bots.": "No custom bots.", - "Add custom bot": "Add custom bot", - "Custom bots": "Custom bots", - "Parts of your configuration are displayed below. To change these values, edit your configuration and restart Dimension.": "Parts of your configuration are displayed below. To change these values, edit your configuration and restart Dimension.", - "Administrators": "Administrators", - "Widget Blacklist": "Widget Blacklist", - "Homeserver": "Homeserver", - "Federation URL": "Federation URL", - "Federation Hostname": "Federation Hostname", - "Client/Server URL": "Client/Server URL", - "Utility User ID": "Utility User ID", - "Sessions": "Settings", - "Tokens registered": "Tokens registered", - "Logout Everyone": "Logout Everyone", - "Configuration": "Configuration", - "Logout confirmation": "Logout confirmation", - "Logging everyone out will disable all known login tokens for Dimension and upstream integration managers. Most clients will automatically re-register for a login token behind the scenes, similar to how a login token was first acquired.": "Logging everyone out will disable all known login tokens for Dimension and upstream integration managers. Most clients will automatically re-register for a login token behind the scenes, similar to how a login token was first acquired.", - "Self-hosted go-neb instances are powered by application services installed on your homeserver. The application service is responsible for creating the bots dynamically.": "Self-hosted go-neb instances are powered by application services installed on your homeserver. The application service is responsible for creating the bots dynamically.", - "User Prefix": "User Prefix", - "This is the prefix used for all bot users.": "This is the prefix used for all bot users.", - "API URL": "API URL", - "The admin/api url for go-neb. Be sure to not expose the admin API to the outside world because this endpoint is not authenticated.": "The admin/api url for go-neb. Be sure to not expose the admin API to the outside world because this endpoint is not authenticated.", - "New self-hosted go-neb": "New self-hosted go-neb", - "go-neb appservice configuration": "go-neb appservice configuration", - "Copy and paste this configuration to": "", - "on your homeserver and register it as an application service.": "", - "Test Configuration": "Test Configuration", - "Giphy Configuration": "Giphy Configuration", - "Api Key": "Api Key", - "The API key from": "The API key from", - "Image Size": "Image Size", - "GIFs can be large, and sometimes it is more desirable to have them downsized.": "GIFs can be large, and sometimes it is more desirable to have them downsized.", - "Use downsized images": "Use downsized images", - "Google Configuration": "Google Configuration", - "The API key for your Google Application.": "The API key for your Google Application.", - "The search engine ID": "The search engine ID", - "Guggy Configuration": "Guggy Configuration", - "The API key for": "The API key for", - "Imgur Configuration": "Imgur Configuration", - "Client ID": "Client ID", - "The client ID of your": "The client ID of your", - "Imgur Application": "Imgur Application", - "Client Secret": "Client Secret", - "The client secret of your": "The client secret of your", - "go-neb supports many different types of bots, each of which is listed below. Here you can configure which bots this go-neb instance should use.": "go-neb supports many different types of bots, each of which is listed below. Here you can configure which bots this go-neb instance should use.", - "is a multi-purpose bot that can provide various services, such as reaction GIFs and Github notifications. There are two options for go-neb support in Dimension: using matrix.org's or self-hosting it. Each go-neb instance can have multiple services associated with it (ie: one go-neb here can do everything).": "go-neb is a multi-purpose bot that can provide various services, such as reaction GIFs and Github notifications. There are two options for go-neb support in Dimension: using matrix.org's or self-hosting it. Each go-neb instance can have multiple services associated with it (ie: one go-neb here can do everything).", - "Enabled Bots": "Enabled Bots", - "No go-neb configurations.": "No go-neb configurations.", - "Add matrix.org's go-neb": "Add matrix.org's go-neb", - "Add self-hosted go-neb": "Add self-hosted go-neb", - "go-neb configurations": "go-neb configurations", - "Sticker packs provide a way to convey memes or feelings to others in a room. From here you're able to select which sticker packs users of this Dimension instance can use. If no sticker packs are enabled then the 'sticker picker' widget will be disabled.": "Sticker packs provide a way to convey memes or feelings to others in a room. From here you're able to select which sticker packs users of this Dimension instance can use. If no sticker packs are enabled then the 'sticker picker' widget will be disabled.", - "Import from Telegram": "Import from Telegram", - "Author": "Author", - "License": "License", - "No sticker packs installed.": "No sticker packs installed.", - "Dimension": "Dimension", - "version": "", - "The translated name of your policy": "The translated name of your policy", - "Policy text": "Policy text", - "This is where you put your policy's content.": "This is where you put your policy's content.", - "Create draft": "Create draft", - "Save draft": "Save draft", - "Publish": "Publish", - "Publish policy": "Publish policy", - "Version number": "Version number", - "The version number of this policy": "The version number of this policy", - "Before users can use Dimension they must agree to the terms of service for using your instance. If you're using any matrix.org bridges, users will be required to accept the terms of service for your upstream integration managers (scalar.vector.im usually) in addition to the terms you add here.": "Before users can use Dimension they must agree to the terms of service for using your instance. If you're using any matrix.org bridges, users will be required to accept the terms of service for your upstream integration managers (scalar.vector.im usually) in addition to the terms you add here.", - "Policy Name": "Policy Name", - "Version": "Version", - "No policies written.": "No policies written.", - "New draft policy": "New draft policy", - "Etherpad Widget Configuration": "Etherpad Widget Configuration", - "Default Pad URL Template": "Default Pad URL Template", - "$padName and $roomId will be replaced during creation to help create a unique pad URL.": "$padName and $roomId will be replaced during creation to help create a unique pad URL.", - "Jitsi Widget Configuration": "Jitsi Widget Configuration", - "Jitsi Domain": "Jitsi Domain", - "This is the domain that is used to host the conference.": "This is the domain that is used to host the conference.", - "Use this domain as the default conference domain": "Use this domain as the default conference domain", - "Some clients can create widgets that are not compatible with Dimension, making Dimension use jitsi.riot.im by default. By enabling this option, you'll force Dimension to use your Jitsi domain at risk of having clients not respect it.": "Some clients can create widgets that are not compatible with Dimension, making Dimension use jitsi.riot.im by default. By enabling this option, you'll force Dimension to use your Jitsi domain at risk of having clients not respect it.", - "Jitsi Script URL": "Jitsi Script URL", - "This is used to create the Jitsi widget. It is normally at /libs/external_api.min.js from your domain.": "This is used to create the Jitsi widget. It is normally at /libs/external_api.min.js from your domain.", - "Widgets are small webpages that can be embedded in a Matrix room. Here you can configure which widgets Dimension will offer to users.": "Widgets are small webpages that can be embedded in a Matrix room. Here you can configure which widgets Dimension will offer to users.", - "Bridge to Gitter": "Bridge to Gitter", - "This room is bridged to on Gitter": "This room is bridged to", - "on Gitter": "on Gitter", - "Unbridge": "Unbridge", - "Gitter Room": "Gitter Room", - "Add an IRC channel": "Add an IRC channel", - "Bridging a channel requires authorization from a channel operator. When entering a channel below, a bot will join the channel to ensure it exists and has operators available.": "Bridging a channel requires authorization from a channel operator. When entering a channel below, a bot will join the channel to ensure it exists and has operators available.", - "Channel Name": "Channel Name", - "Next": "Next", - "Operator": "Operator", - "The person selected here will be asked to approve or deny the bridge request.": "The person selected here will be asked to approve or deny the bridge request.", - "Request Bridge": "Request Bridge", - "IRC Networks": "IRC Networks", - "Channel": "Channel", - "No bridged channels": "No bridged channels", - "Remove": "Remove", - "Bridge to Slack": "Bridge to Slack", - "This room is bridged to Slack using webhooks. Webhook bridging is legacy and doesn't support as rich bridging as the new approach. It is recommended to re-create the bridge with the new process.": "This room is bridged to Slack using webhooks. Webhook bridging is legacy and doesn't support as rich bridging as the new approach. It is recommended to re-create the bridge with the new process.", - "In order to bridge Slack channels, you'll need to authorize the bridge to access your teams and channels. Please click the button below to do so.": "In order to bridge Slack channels, you'll need to authorize the bridge to access your teams and channels. Please click the button below to do so.", - "Team": "Team", - "Telegram chat is already bridged": "Telegram chat is already bridged", - "You have the appropriate permissions to be able to unbridge the chat, however. Would you like to unbridge the other room and instead bridge it here?": "You have the appropriate permissions to be able to unbridge the chat, however. Would you like to unbridge the other room and instead bridge it here?", - "Unbridge and continue": "Unbridge and continue", - "No, don't bridge": "No, don't bridge", - "That Telegram chat is bridged to another Matrix room and cannot be bridged here. Unfortunately, you do not have the required permissions to be able to unbridge the other room.": "That Telegram chat is bridged to another Matrix room and cannot be bridged here. Unfortunately, you do not have the required permissions to be able to unbridge the other room.", - "Bridge to Telegram": "Bridge to Telegram", - "This room is bridged to on Telegram": "This room is bridged to", - "on Telegram": "on Telegram", - "You do not have the necessary permissions in this room to unbridge the channel.": "You do not have the necessary permissions in this room to unbridge the channel.", - "After inviting": "After inviting", - "to your Telegram chat, run the command": "to your Telegram chat, run the command", - "in the Telegram room to get the chat ID.": "in the Telegram room to get the chat ID.", - "Add a new webhook": "Add a new webhook", - "Webhook Name": "Webhook Name", - "Create": "Create", - "Type": "Type", - "No webhooks": "No webhooks", - "No name": "No name", - "Delete": "Delete", - "Feeds": "Feeds", - "Added by": "Added by", - "Add": "Add", - ".travis.yml configuration and template information": ".travis.yml configuration and template information", - "The following section needs to be added to your": "", - "file in your repositories:": "", - "The following variables can be used in your template. This template is used to post a message to theroom when your webhook is activated.": "The following variables can be used in your template. This template is used to post a message to theroom when your webhook is activated.", - "The repository identifier": "The repository identifier", - "The repository name": "The repository name", - "The build number": "The build number", - "The build ID": "The build ID", - "The branch name": "The branch name", - "A short version of the commit SHA": "A short version of the commit SHA", - "The first line of the commit message": "The first line of the commit message", - "The full commit message": "The full commit message", - "The author of the commit": "The author of the commit", - "The result of the build": " '%result' - The result of the build", - "The message from Travis CI about the build": "The message from Travis CI about the build", - "The total duration of all builds in the matrix": "The total duration of all builds in the matrix", - "The time it took to run the build": "The time it took to run the build", - "A URL to see the changes which triggered the build": "A URL to see the changes which triggered the build", - "A URL to see the build information": "A URL to see the build information", - "Repositories": "Repositories", - "Repository": "", - "Template": "Template", - "Sticker packs are not enabled on this Dimension instance.": "Sticker packs are not enabled on this Dimension instance.", - "Start a conversation with": "Start a conversation with", - "to create your own stickerpack.": "to create your own stickerpack.", - "Add stickerpack": "Add stickerpack", - "Created by": "Created by", - "under": "under", - "BigBlueButton Meeting URL": "", - "Add Widget": "Add Widget", - "Save Widget": "Save Widget", - "Remove Widget": "Remove Widget", - "Widget Name": "Widget Name", - "Widget URL": "Widget URL", - "Pad Name": "Pad Name", - "Pad URL": "Pad URL", - "Shared Calendar ID": "Shared Calendar ID", - "Document URL": "Document URL", - "Grafana URL": "Grafana URL", - "To get a URL, go to Grafana and click 'share' on a graph.": "To get a URL, go to Grafana and click 'share' on a graph.", - "Conference URL": "Conference URL", - " Spotify URI": "", - "Click 'share' from your favourite playlist, artist, track, or album and paste the Spotify URI here.": "Click 'share' from your favourite playlist, artist, track, or album and paste the Spotify URI here.", - "Trading Pair": "Trading Pair", - "Interval": "Interval", - "Whiteboard Name": "Whiteboard Name", - "Whiteboard URL": "Whiteboard URL", - "Video URL": "Video URL", - "An open source integration manager for Matrix": "An open source integration manager for Matrix", - "Self-host your favourite bots, bridges, and widgets.": "Self-host your favourite bots, bridges, and widgets.", - "source": "source", - "Try it out or": "Try it out or", - "run your own": "run your own", - "Visit": "Visit", - "and log in with your Matrix account or point your Element": "and log in with your Matrix account or point your Element", - "at our servers:": "at our servers:", - "Add utility for everyone in your room by embedding an application.": "Add utility for everyone in your room by embedding an application.", - "Notes": "Notes", - "Google Calendar": "Google Calendar", - "Custom Widget": "Custom Widget", - "Bots bring entertainment or productivity to the room. They're here to help at your command.": "Bots bring entertainment or productivity to the room. They're here to help at your command.", - "Guggy": "Guggy", - "Giphy": "Giphy", - "Imgur": "Imgur", - "Google Image Search": "Google Image Search", - "Wikipedia": "Wikipedia", - "Travis CI": "Travis CI", - "RSS Notifications": "RSS Notifications", - "Echo": "Echo", - "Bring the outside world into your room with bridges.": "Bring the outside world into your room with bridges.", - "Stickers": "Stickers", - "Have some fun and post a sticker.": "Have some fun and post a sticker.", - "Huskies": "Huskies", - "Cats": "Cats", - "Cat Faces": "Cat Faces", - "Loading Artist": "Loading Artist", - "source on GitHub": "source on GitHub", - "Welcome to Dimension!": "Welcome to Dimension!", - "Join": "Join", - "for news and updates. Don't forget to star the repository on": "for news and updates. Don't forget to star the repository on", - "Here's the configuration options you'll need to update in your Element": "Here's the configuration options you'll need to update in your Element", - "Configuring integrations": "Configuring integrations", - "If everything is set up correctly, you'll be able to access the admin area of Dimension by clicking the 3x3 grid in the top right of any room in Element. The gear icon": "If everything is set up correctly, you'll be able to access the admin area of Dimension by clicking the 3x3 grid in the top right of any room in Element. The gear icon", - "in the top right is where you can configure your bots, bridges, and widgets.": "in the top right is where you can configure your bots, bridges, and widgets.", - "Could not connect to integrations server error": "Could not connect to integrations server error", - "When Element cannot reach Dimension or Dimension is unable to reach your homeserver an error saying 'Could not contact integrations server' shows up in every room. Before visiting us in": "When Element cannot reach Dimension or Dimension is unable to reach your homeserver an error saying 'Could not contact integrations server' shows up in every room. Before visiting us in", - "on Matrix, here's a few things to check:": "on Matrix, here's a few things to check:", - "Verify the homeserver configuration in Dimension.": "Verify the homeserver configuration in Dimension.", - "The name, client/server URL, and access token all need to be valid and directed at your homeserver.": "The name, client/server URL, and access token all need to be valid and directed at your homeserver.", - "Verify federation is enabled on your homeserver.": "Verify federation is enabled on your homeserver.", - "Even in a private, or non-federated, environment federation needs to be enabled so Dimension can work correctly. Dimension should still work okay if federation on your homeserver is bound to a private interface instead of being public - just be sure to set the federation URL in your configuration.": "Even in a private, or non-federated, environment federation needs to be enabled so Dimension can work correctly. Dimension should still work okay if federation on your homeserver is bound to a private interface instead of being public - just be sure to set the federation URL in your configuration.", - "Verify that federation is working on your homeserver.": "Verify that federation is working on your homeserver.", - "Using tools like the": "Using tools like the", - "federation tester": "federation tester", - ", make sure that federation is working on your homeserver.": ", make sure that federation is working on your homeserver.", - "Looking for your sticker packs?": "Looking for your sticker packs?", - "Click here": "Click here", - "This room is encrypted": "This room is encrypted", - "Integrations are not encrypted!": "Integrations are not encrypted!", - "This means that some information about yourself and the room may be leaked to the bot, bridge, or widget. This information includes the room ID, your display name, your username, your avatar, information about Element, and other similar details. Add integrations with caution.": "This means that some information about yourself and the room may be leaked to the bot, bridge, or widget. This information includes the room ID, your display name, your username, your avatar, information about Element, and other similar details. Add integrations with caution.", - "There are currently no integrations which support encrypted rooms. Sorry about that!": "There are currently no integrations which support encrypted rooms. Sorry about that!", - "No integrations available": "No integrations available", - "This room does not have any compatible integrations. Please contact the server owner if you're seeing this message.": "This room does not have any compatible integrations. Please contact the server owner if you're seeing this message.", - "BigBlueButton Conference": "BigBlueButton Conference", - "Join Conference": "Join Conference", - "Sorry, this content cannot be embedded": "Sorry, this content cannot be embedded", - "Start camera:": "", - "You": "You", - "Integrations": "Integrations", - "Your client is too old to use this widget. Try upgrading your client to the latest available version, or contact the author to try and diagnose the problem. Your client needs to support OpenID information exchange.": "Your client is too old to use this widget. Try upgrading your client to the latest available version, or contact the author to try and diagnose the problem. Your client needs to support OpenID information exchange.", - "Check connection": "Check connection", - "Click to start OpenID auth": "Click to start OpenID auth", - "User ID:": "User ID:", - "You have blocked this widget from receiving credentials.": "You have blocked this widget from receiving credentials.", - "An error has occurred - see logs for details": "An error has occurred - see logs for details", - "There was a problem authenticating your use of this sticker picker. Please make sure you're using a client that has Dimension enabled and correctly set up.": "There was a problem authenticating your use of this sticker picker. Please make sure you're using a client that has Dimension enabled and correctly set up.", - "You have no sticker packs.": "You have no sticker packs.", - "Add some stickers": "Add some stickers", - "Failed to load bridges": "Failed to load bridges", - "Error loading bridges": "Error loading bridges", - "matrix.org's Gitter bridge added": "matrix.org's Gitter bridge added", - "Error adding matrix.org's Gitter Bridge": "Error adding matrix.org's Gitter Bridge", - "Error creating matrix.org's Gitter Bridge": "Error creating matrix.org's Gitter Bridge", - "Failed to get an update Gitter bridge list": "Failed to get an update Gitter bridge list", - "Gitter bridge added": "Gitter bridge added", - "Failed to create Gitter bridge": "Failed to create Gitter bridge", - "Gitter bridge updated": "Gitter bridge updated", - "Failed to update Gitter bridge": "Failed to update Gitter bridge", - "IRC Bridge added": "IRC Bridge added", - "Failed to create IRC bridge": "Failed to create IRC bridge", - "Click the pencil icon to enable networks.": "Click the pencil icon to enable networks.", - "matrix.org's IRC bridge added": "matrix.org's IRC bridge added", - "Error adding matrix.org's IRC Bridge": "Error adding matrix.org's IRC Bridge", - "Error creating matrix.org's IRC Bridge": "Error creating matrix.org's IRC Bridge", - "Failed to get an update IRC bridge list": "Failed to get an update IRC bridge list", - "disabled": "disabled", - "Failed to update network": "Failed to update network", - "Slack bridge added": "Slack bridge added", - "Failed to create Slack bridge": "Failed to create Slack bridge", - "Slack bridge updated": "Slack bridge updated", - "Failed to update Slack bridge": "Failed to update Slack bridge", - "matrix.org's Slack bridge added": "matrix.org's Slack bridge added", - "Error adding matrix.org's Slack Bridge": "Error adding matrix.org's Slack Bridge", - "Error creating matrix.org's Slack Bridge": "Error creating matrix.org's Slack Bridge", - "Failed to get an update Slack bridge list": "Failed to get an update Slack bridge list", - "Telegram bridge added": "Telegram bridge added", - "Failed to create Telegram bridge": "Failed to create Telegram bridge", - "Telegram bridge updated": "Telegram bridge updated", - "Failed to update Telegram bridge": "Failed to update Telegram bridge", - "Failed to get an update Telegram bridge list": "Failed to get an update Telegram bridge list", - "Webhook bridge added": "Webhook bridge added", - "Failed to create Webhook bridge": "Failed to create Webhook bridge", - "Webhook bridge updated": "Webhook bridge updated", - "Failed to update Webhook bridge": "Failed to update Webhook bridge", - "Failed to get an update Webhooks bridge list": "Failed to get an update Webhooks bridge list", - "Please enter a name for the bot": "Please enter a name for the bot", - "Please enter an avatar URL for the bot": "Please enter an avatar URL for the bot", - "Please enter a user ID for the bot": "Please enter a user ID for the bot", - "Please enter a description for the bot": "Please enter a description for the bot", - "Please enter an access token for the bot": "Please enter an access token for the bot", - "Bot updated": "Bot updated", - "Error updating bot": "Error updating bot", - "Error loading go-neb configuration": "Error loading go-neb configuration", - "Failed to get an updated bot list": "Failed to get an updated bot list", - "Everyone has been logged out": "Everyone has been logged out", - "Error logging everyone out": "Error logging everyone out", - "New go-neb created": "New go-neb created", - "Error creating appservice": "Error creating appservice", - "Could not load appservice configuration": "Could not load appservice configuration", - "The appservice appears to be correctly set up": "The appservice appears to be correctly set up", - "The appservice is not correctly set up": "The appservice is not correctly set up", - "Error loading configuration": "Error loading configuration", - "Configuration updated": "Configuration updated", - "Error updating integration": "Error updating integration", - "Integration updated": "Integration updated", - "Failed to configure the integration": "Failed to configure the integration", - "Manual troubleshooting may be requred": "Manual troubleshooting may be requred", - "Could not get go-neb configuration": "Could not get go-neb configuration", - "matrix.org's go-neb added": "matrix.org's go-neb added", - "Click the pencil icon to enable the bots.": "Click the pencil icon to enable the bots.", - "Error adding matrix.org's go-neb": "Error adding matrix.org's go-neb", - "Error creating matrix.org go-neb": "Error creating matrix.org go-neb", - "Failed to load sticker packs": "Failed to load sticker packs", - "Sticker pack updated": "Sticker pack updated", - "Error updating sticker pack": "Error updating sticker pack", - "Telegram sticker pack imported": "Telegram sticker pack imported", - "Error importing sticker pack": "Error importing sticker pack", - "Failed to load policy": "Failed to load policy", - "Failed to load policies": "Failed to load policies", - "Policy published": "Policy published", - "Error publishing policy": "Error publishing policy", - "Please enter a name for all policies": "Please enter a name for all policies", - "Please enter text for all policies": "Please enter text for all policies", - "Draft saved": "Draft saved", - "Error saving policy": "Error saving policy", - "Draft created": "Draft created", - "Error creating document": "Error creating document", - "Please enter a version number": "Please enter a version number", - "Widget updated": "Widget updated", - "Error updating widget": "Error updating widget", - "Failed to load widgets": "Failed to load widgets", - "Error opening configuration page": "Error opening configuration page", - "Failed to load configuration": "Failed to load configuration", - "Error updating configuration": "Error updating configuration", - "Error inviting bridge": "Error inviting bridge", - "Bridge requested": "Bridge requested", - "Error requesting bridge": "Error requesting bridge", - "Bridge removed": "Bridge removed", - "Error removing bridge": "Error removing bridge", - "Please enter a channel name": "Please enter a channel name", - "Error loading channel operators": "Error loading channel operators", - "Failed to make the bridge an administrator": "Failed to make the bridge an administrator", - "Please ensure you are an 'Admin' for the room": "Please ensure you are an 'Admin' for the room", - "Link requested!": "Link requested!", - "The operator selected will have to approve the bridge for it to work": "The operator selected will have to approve the bridge for it to work", - "Failed to request a link": "Failed to request a link", - "Link removed": "Link removed", - "Failed to remove link": "Failed to remove link", - "Error getting Slack authorization information": "Error getting Slack authorization information", - "Error getting teams": "Error getting teams", - "Error getting channels for team": "Error getting channels for team", - "Bridge updated": "Bridge updated", - "Webhook created": "Webhook created", - "Error creating webhook": "Error creating webhook", - "Webhook deleted": "Webhook deleted", - "Error deleting webhook": "Error deleting webhook", - "Please enter a feed URL": "Please enter a feed URL", - "Please enter a repository": "Please enter a repository", - "was invited to the room": "was invited to the room", - "was removed from the room": " was removed from the room", - "Could not update integration status": "Could not update integration status", - "Stickerpack added": "Stickerpack added", - "Error adding stickerpack": "Error adding stickerpack", - "Stickers updated": "Stickers updated", - "Error updating stickers": "Error updating stickers", - "Please enter a URL for the widget": "Please enter a URL for the widget", - "Widget added!": "Widget added!", - "Widget updated!": "Widget updated!", - "Widget deleted!": "Widget deleted!", - "Please enter a video URL": "Please enter a video URL", - "Please enter a YouTube, Vimeo, or DailyMotion video URL": "Please enter a YouTube, Vimeo, or DailyMotion video URL", - "Unable to load Dimension - missing room ID or token.": "Unable to load Dimension - missing room ID or token.", - "Could not verify your token. Please try logging out of Element and back in. Be sure to back up your encryption keys!": "Could not verify your token. Please try logging out of Element and back in. Be sure to back up your encryption keys!", - "Unable to communicate with Dimension due to an unknown error.": "Unable to communicate with Dimension due to an unknown error.", - "You do not appear to have permission to modify widgets in this room": "You do not appear to have permission to modify widgets in this room", - "Unable to set up Dimension. This version of Element may not supported or there may be a problem with the server.": "Unable to set up Dimension. This version of Element may not supported or there may be a problem with the server.", - "This integration is offline or unavailable": "This integration is offline or unavailable", - "Could not communicate with Element": "Could not communicate with Element", - "The room must be": "The room must be", - "to use this integration": "to use this integration", - "You cannot modify widgets in this room": "You cannot modify widgets in this room", - "Error communicating with Element": "Error communicating with Element", - "Expected to not be able to send specific event types": "Expected to not be able to send specific event types", - "Expected to be able to send specific event types": "Expected to be able to send specific event types", - "Requirement": "Requirement ", - "not found": " not found", - "Failed to take screenshot: iframe not supported": "Failed to take screenshot: iframe not supported", - "Failed to take screenshot": "Failed to take screenshot", - "Click the button to test your connection. This may cause your client to ask if it is okay to share your identity with the widget - this is required to test your connection to your homeserver.": "Click the button to test your connection. This may cause your client to ask if it is okay to share your identity with the widget - this is required to test your connection to your homeserver.", - "Please accept the prompt to verify your identity.": "Please accept the prompt to verify your identity.", - "You have blocked this widget from verifying your identity.": "You have blocked this widget from verifying your identity.", - "Checking connectivity to integration manager...": "Checking connectivity to integration manager...", - "Checking connectivity to homeserver...": "Checking connectivity to homeserver...", - "Error checking if the integration manager is alive. This usually means that the manager which served this widget has gone offline.": "Error checking if the integration manager is alive. This usually means that the manager which served this widget has gone offline.", - "You're all set! Click the button below to re-run the test.": "You're all set! Click the button below to re-run the test.", - "Error contacting homeserver. This usually means your federation setup is incorrect, or your homeserver is offline. Consult your homeserver's documentation for how to set up federation.": "Error contacting homeserver. This usually means your federation setup is incorrect, or your homeserver is offline. Consult your homeserver's documentation for how to set up federation.", - "Checking client version...": "Checking client version...", - "Your client is too old to use this widget, sorry": "Your client is too old to use this widget, sorry", - "Please accept the prompt to verify your identity": "Please accept the prompt to verify your identity", - "Error loading policy": "Error loading policy", - "The location of": "The location of ", - "differs depending on whether the": " differs depending on whether the", - "or": " or ", - "version of Element is used.": " version of Element is used." -} + "Dashboard": "Dashboard", + "Widgets": "Widgets", + "go-neb": "go-neb", + "Custom Bots": "Custom Bots", + "Bridges": "Bridges", + "Sticker Packs": "Sticker Packs", + "Terms of Service": "Terms of Service", + "Bridges provide a way for rooms to interact with and/or bring in events from a third party network. For example, an IRC bridge can allow IRC and matrix users to communicate with each other.": "Bridges provide a way for rooms to interact with and/or bring in events from a third party network. For example, an IRC bridge can allow IRC and matrix users to communicate with each other.", + "Name": "Name", + "Description": "Description", + "Actions": "Actions", + "No bridges.": "No bridges.", + "matrix-hookshot": "matrix-hookshot", + "is a multi-purpose bridge which supports Github as an integration. If enabled in the configuration, it can be used here to offer a UI for setting up a room to pipe to a repository.": "is a multi-purpose bridge which supports Github as an integration. If enabled in the configuration, it can be used here to offer a UI for setting up a room to pipe to a repository.", + "No bridge configurations.": "No bridge configurations.", + "Add self-hosted bridge": "Add self-hosted bridge", + "self-hosted Github bridge": "self-hosted Github bridge", + "Self-hosted Github bridges must have": "Self-hosted Github bridges must have", + "provisioning": "provisioning", + "enabled in the configuration.": "enabled in the configuration.", + "Provisioning URL": "Provisioning URL", + "The provisioning URL for the bridge. This is the specific address for the bridge given in the configuration.": "The provisioning URL for the bridge. This is the specific address for the bridge given in the configuration.", + "Shared Secret": "Shared Secret", + "The shared secret defined in the configuration for provisioning.": "The shared secret defined in the configuration for provisioning.", + "Save": "Save", + "Cancel": "Cancel", + "Add a new self-hosted IRC Bridge": "Add a new self-hosted IRC Bridge ", + "Self-hosted IRC bridges must have": "Self-hosted IRC bridges must have", + "The provisioning URL for the bridge. This is usually the same as the URL given in the registration. This API is not authenticated and should be treated with caution.": "The provisioning URL for the bridge. This is usually the same as the URL given in the registration. This API is not authenticated and should be treated with caution.", + "matrix-appservice-irc": "matrix-appservice-irc", + "is an IRC bridge that supports multiple IRC networks. Dimension is capable of using multiple IRC bridges to better distribute the load across multiple networks in large deployments.": "is an IRC bridge that supports multiple IRC networks. Dimension is capable of using multiple IRC bridges to better distribute the load across multiple networks in large deployments.", + "Enabled Networks": "Enabled Networks", + "This bridge is offline or unavailable.": "This bridge is offline or unavailable.", + "Add matrix.org's bridge": "Add matrix.org's bridge", + "Network": "Network", + "Enabled": "Enabled", + "Close": "Close", + "self-hosted Slack bridge": "self-hosted Slack bridge ", + "Self-hosted Slack bridges already have provisioning enabled. Be careful not to expose the API to the public internet.": "Self-hosted Slack bridges already have provisioning enabled. Be careful not to expose the API to the public internet.", + "The provisioning URL for the bridge. This is usually the same as the URL your homeserver uses to communicate with the bridge.": "The provisioning URL for the bridge. This is usually the same as the URL your homeserver uses to communicate with the bridge.", + "matrix-appservice-slack": "matrix-appservice-slack", + "is a Slack bridge that supports bridging Slack channels to Matrix. Users authorize the bridge to access their Slack workspaces and from there they can pick the channels they'd like to bridge.": "is a Slack bridge that supports bridging Slack channels to Matrix. Users authorize the bridge to access their Slack workspaces and from there they can pick the channels they'd like to bridge.", + "self-hosted Telegram bridge": "self-hosted Telegram bridge ", + "Self-hosted Telegram bridges must have": "Self-hosted Telegram bridges must have", + "The provisioning URL for the bridge. This is the public address for the bridge followed by the provisioning prefix given in the configuration.": "The provisioning URL for the bridge. This is the public address for the bridge followed by the provisioning prefix given in the configuration.", + "Promote Telegram Puppeting": "Promote Telegram Puppeting", + "If enabled, Dimension will recommend that users log in to their Telegram accounts.": "If enabled, Dimension will recommend that users log in to their Telegram accounts.", + "Promote Matrix Puppeting": "Promote Matrix Puppeting", + "If enabled, Dimension will recommend that users log in to their Matrix accounts.": "If enabled, Dimension will recommend that users log in to their Matrix accounts.", + "mautrix-telegram": "mautrix-telegram", + "is a Telegram bridge that supports bridging channels/supergroups to Matrix. This can be done through a 'relay bot' (all Matrix users are represented through a single bot in Telegram) or by making use of a user's real Telegram account (known as 'puppeting'). Currently only one Telegram bridge can be configured at a time.": "is a Telegram bridge that supports bridging channels/supergroups to Matrix. This can be done through a 'relay bot' (all Matrix users are represented through a single bot in Telegram) or by making use of a user's real Telegram account (known as 'puppeting'). Currently only one Telegram bridge can be configured at a time.", + "Enabled Features": "Enabled Features", + "self-hosted webhook bridge": "self-hosted webhook bridge ", + "Self-hosted webhook bridges must have": "Self-hosted webhook bridges must have", + "The public URL for the bridge.": "The public URL for the bridge.", + "The provisioning secret defined in the configuration.": "The provisioning secret defined in the configuration.", + "matrix-appservice-webhooks": "matrix-appservice-webhooks", + "provides Slack-compatible webhooks for Matrix, making it easy to send updates into a room.": "provides Slack-compatible webhooks for Matrix, making it easy to send updates into a room.", + "custom bot": "custom bot", + "The user ID that Dimension will invite to rooms.": "The user ID that Dimension will invite to rooms.", + "A few words here will help people understand what the bot does.": "A few words here will help people understand what the bot does.", + "Display Name": "Display Name", + "This is the name Dimension will use to tell users which bot this is.": "This is the name Dimension will use to tell users which bot this is.", + "This can either be an MXC URI or a plain URL.": "This can either be an MXC URI or a plain URL.", + "This is used by Dimension to force the bot to leave the room when the user removes the bot.": "This is used by Dimension to force the bot to leave the room when the user removes the bot.", + "Learn more about access tokens.": "Learn more about access tokens.", + "Custom bots give you the ability to add your own bots to Dimension for users to add to their rooms. These bots can't have any configuration to them and must be able to accept room invites on their own. All Dimension will do when a user wants to add the bot is invite it to the room.": "Custom bots give you the ability to add your own bots to Dimension for users to add to their rooms. These bots can't have any configuration to them and must be able to accept room invites on their own. All Dimension will do when a user wants to add the bot is invite it to the room.", + "No custom bots.": "No custom bots.", + "Add custom bot": "Add custom bot", + "Custom bots": "Custom bots", + "Parts of your configuration are displayed below. To change these values, edit your configuration and restart Dimension.": "Parts of your configuration are displayed below. To change these values, edit your configuration and restart Dimension.", + "Administrators": "Administrators", + "Widget Blacklist": "Widget Blacklist", + "Homeserver": "Homeserver", + "Federation URL": "Federation URL", + "Federation Hostname": "Federation Hostname", + "Client/Server URL": "Client/Server URL", + "Utility User ID": "Utility User ID", + "Sessions": "Settings", + "Tokens registered": "Tokens registered", + "Logout Everyone": "Logout Everyone", + "Configuration": "Configuration", + "Logout confirmation": "Logout confirmation", + "Logging everyone out will disable all known login tokens for Dimension and upstream integration managers. Most clients will automatically re-register for a login token behind the scenes, similar to how a login token was first acquired.": "Logging everyone out will disable all known login tokens for Dimension and upstream integration managers. Most clients will automatically re-register for a login token behind the scenes, similar to how a login token was first acquired.", + "Self-hosted go-neb instances are powered by application services installed on your homeserver. The application service is responsible for creating the bots dynamically.": "Self-hosted go-neb instances are powered by application services installed on your homeserver. The application service is responsible for creating the bots dynamically.", + "User Prefix": "User Prefix", + "This is the prefix used for all bot users.": "This is the prefix used for all bot users.", + "API URL": "API URL", + "The admin/api url for go-neb. Be sure to not expose the admin API to the outside world because this endpoint is not authenticated.": "The admin/api url for go-neb. Be sure to not expose the admin API to the outside world because this endpoint is not authenticated.", + "New self-hosted go-neb": "New self-hosted go-neb", + "go-neb appservice configuration": "go-neb appservice configuration", + "Copy and paste this configuration to": "Copy and paste this configuration to", + "on your homeserver and register it as an application service.": "on your homeserver and register it as an application service.", + "Test Configuration": "Test Configuration", + "Giphy Configuration": "Giphy Configuration", + "Api Key": "Api Key", + "The API key from": "The API key from", + "Image Size": "Image Size", + "GIFs can be large, and sometimes it is more desirable to have them downsized.": "GIFs can be large, and sometimes it is more desirable to have them downsized.", + "Use downsized images": "Use downsized images", + "Google Configuration": "Google Configuration", + "The API key for your Google Application.": "The API key for your Google Application.", + "Search Engine ID": "Search Engine ID", + "The search engine ID": "The search engine ID", + "Guggy Configuration": "Guggy Configuration", + "The API key for": "The API key for", + "Imgur Configuration": "Imgur Configuration", + "Client ID": "Client ID", + "The client ID of your": "The client ID of your", + "Imgur Application": "Imgur Application", + "Client Secret": "Client Secret", + "The client secret of your": "The client secret of your", + "go-neb supports many different types of bots, each of which is listed below. Here you can configure which bots this go-neb instance should use.": "go-neb supports many different types of bots, each of which is listed below. Here you can configure which bots this go-neb instance should use.", + "is a multi-purpose bot that can provide various services, such as reaction GIFs and Github notifications. There are two options for go-neb support in Dimension: using matrix.org's or self-hosting it. Each go-neb instance can have multiple services associated with it (ie: one go-neb here can do everything).": "go-neb is a multi-purpose bot that can provide various services, such as reaction GIFs and Github notifications. There are two options for go-neb support in Dimension: using matrix.org's or self-hosting it. Each go-neb instance can have multiple services associated with it (ie: one go-neb here can do everything).", + "Enabled Bots": "Enabled Bots", + "No go-neb configurations.": "No go-neb configurations.", + "Add matrix.org's go-neb": "Add matrix.org's go-neb", + "Add self-hosted go-neb": "Add self-hosted go-neb", + "go-neb configurations": "go-neb configurations", + "Sticker packs provide a way to convey memes or feelings to others in a room. From here you're able to select which sticker packs users of this Dimension instance can use. If no sticker packs are enabled then the 'sticker picker' widget will be disabled.": "Sticker packs provide a way to convey memes or feelings to others in a room. From here you're able to select which sticker packs users of this Dimension instance can use. If no sticker packs are enabled then the 'sticker picker' widget will be disabled.", + "Import from Telegram": "Import from Telegram", + "Author": "Author", + "License": "License", + "No sticker packs installed.": "No sticker packs installed.", + "Dimension": "Dimension", + "version": "version", + "The translated name of your policy": "The translated name of your policy", + "Policy text": "Policy text", + "This is where you put your policy's content.": "This is where you put your policy's content.", + "Create draft": "Create draft", + "Save draft": "Save draft", + "Publish": "Publish", + "Publish policy": "Publish policy", + "Version number": "Version number", + "The version number of this policy": "The version number of this policy", + "Before users can use Dimension they must agree to the terms of service for using your instance. If you're using any matrix.org bridges, users will be required to accept the terms of service for your upstream integration managers (scalar.vector.im usually) in addition to the terms you add here.": "Before users can use Dimension they must agree to the terms of service for using your instance. If you're using any matrix.org bridges, users will be required to accept the terms of service for your upstream integration managers (scalar.vector.im usually) in addition to the terms you add here.", + "Policy Name": "Policy Name", + "Version": "Version", + "No policies written.": "No policies written.", + "New draft policy": "New draft policy", + "Etherpad Widget Configuration": "Etherpad Widget Configuration", + "Default Pad URL Template": "Default Pad URL Template", + "$padName and $roomId will be replaced during creation to help create a unique pad URL.": "$padName and $roomId will be replaced during creation to help create a unique pad URL.", + "Jitsi Widget Configuration": "Jitsi Widget Configuration", + "Jitsi Domain": "Jitsi Domain", + "This is the domain that is used to host the conference.": "This is the domain that is used to host the conference.", + "Use this domain as the default conference domain": "Use this domain as the default conference domain", + "Some clients can create widgets that are not compatible with Dimension, making Dimension use jitsi.riot.im by default. By enabling this option, you'll force Dimension to use your Jitsi domain at risk of having clients not respect it.": "Some clients can create widgets that are not compatible with Dimension, making Dimension use jitsi.riot.im by default. By enabling this option, you'll force Dimension to use your Jitsi domain at risk of having clients not respect it.", + "Jitsi Script URL": "Jitsi Script URL", + "This is used to create the Jitsi widget. It is normally at /libs/external_api.min.js from your domain.": "This is used to create the Jitsi widget. It is normally at /libs/external_api.min.js from your domain.", + "Widgets are small webpages that can be embedded in a Matrix room. Here you can configure which widgets Dimension will offer to users.": "Widgets are small webpages that can be embedded in a Matrix room. Here you can configure which widgets Dimension will offer to users.", + "Bridge to Github": "Bridge to Github", + "In order to bridge to Github, you'll need to authorize the bridge to access your organization(s). Please click the button below to do so.": "In order to bridge to Github, you'll need to authorize the bridge to access your organization(s). Please click the button below to do so.", + "Organization": "Organization", + "Repository": "Repository", + "Add an IRC channel": "Add an IRC channel", + "Bridging a channel requires authorization from a channel operator. When entering a channel below, a bot will join the channel to ensure it exists and has operators available.": "Bridging a channel requires authorization from a channel operator. When entering a channel below, a bot will join the channel to ensure it exists and has operators available.", + "Channel Name": "Channel Name", + "Next": "Next", + "Operator": "Operator", + "The person selected here will be asked to approve or deny the bridge request.": "The person selected here will be asked to approve or deny the bridge request.", + "Request Bridge": "Request Bridge", + "IRC Networks": "IRC Networks", + "Channel": "Channel", + "No bridged channels": "No bridged channels", + "Remove": "Remove", + "Bridge to Slack": "Bridge to Slack", + "This room is bridged to Slack using webhooks. Webhook bridging is legacy and doesn't support as rich bridging as the new approach. It is recommended to re-create the bridge with the new process.": "This room is bridged to Slack using webhooks. Webhook bridging is legacy and doesn't support as rich bridging as the new approach. It is recommended to re-create the bridge with the new process.", + "Unbridge": "Unbridge", + "In order to bridge Slack channels, you'll need to authorize the bridge to access your teams and channels. Please click the button below to do so.": "In order to bridge Slack channels, you'll need to authorize the bridge to access your teams and channels. Please click the button below to do so.", + "Team": "Team", + "Telegram chat is already bridged": "Telegram chat is already bridged", + "You have the appropriate permissions to be able to unbridge the chat, however. Would you like to unbridge the other room and instead bridge it here?": "You have the appropriate permissions to be able to unbridge the chat, however. Would you like to unbridge the other room and instead bridge it here?", + "Unbridge and continue": "Unbridge and continue", + "No, don't bridge": "No, don't bridge", + "That Telegram chat is bridged to another Matrix room and cannot be bridged here. Unfortunately, you do not have the required permissions to be able to unbridge the other room.": "That Telegram chat is bridged to another Matrix room and cannot be bridged here. Unfortunately, you do not have the required permissions to be able to unbridge the other room.", + "Bridge to Telegram": "Bridge to Telegram", + "This room is bridged to on Telegram": "This room is bridged to", + "on Telegram": "on Telegram", + "You do not have the necessary permissions in this room to unbridge the channel.": "You do not have the necessary permissions in this room to unbridge the channel.", + "After inviting": "After inviting", + "to your Telegram chat, run the command": "to your Telegram chat, run the command", + "in the Telegram room to get the chat ID.": "in the Telegram room to get the chat ID.", + "Add a new webhook": "Add a new webhook", + "Webhook Name": "Webhook Name", + "Create": "Create", + "Type": "Type", + "No webhooks": "No webhooks", + "No name": "No name", + "Delete": "Delete", + "Feeds": "Feeds", + "Added by": "Added by", + "Add": "Add", + ".travis.yml configuration and template information": ".travis.yml configuration and template information", + "The following section needs to be added to your": "The following section needs to be added to your", + "file in your repositories:": "file in your repositories:", + "The following variables can be used in your template. This template is used to post a message to theroom when your webhook is activated.": "The following variables can be used in your template. This template is used to post a message to theroom when your webhook is activated.", + "The repository identifier": "The repository identifier", + "The repository name": "The repository name", + "The build number": "The build number", + "The build ID": "The build ID", + "The branch name": "The branch name", + "A short version of the commit SHA": "A short version of the commit SHA", + "The first line of the commit message": "The first line of the commit message", + "The full commit message": "The full commit message", + "The author of the commit": "The author of the commit", + "The result of the build": " '%result' - The result of the build", + "The message from Travis CI about the build": "The message from Travis CI about the build", + "The total duration of all builds in the matrix": "The total duration of all builds in the matrix", + "The time it took to run the build": "The time it took to run the build", + "A URL to see the changes which triggered the build": "A URL to see the changes which triggered the build", + "A URL to see the build information": "A URL to see the build information", + "Repositories": "Repositories", + "Template": "Template", + "Sticker packs are not enabled on this Dimension instance.": "Sticker packs are not enabled on this Dimension instance.", + "Start a conversation with": "Start a conversation with", + "to create your own stickerpack.": "to create your own stickerpack.", + "Add stickerpack": "Add stickerpack", + "Created by": "Created by", + "under": "under", + "BigBlueButton Meeting URL": "BigBlueButton Meeting URL", + "Add Widget": "Add Widget", + "Save Widget": "Save Widget", + "Remove Widget": "Remove Widget", + "Widget Name": "Widget Name", + "Widget URL": "Widget URL", + "Pad Name": "Pad Name", + "Pad URL": "Pad URL", + "Shared Calendar ID": "Shared Calendar ID", + "Document URL": "Document URL", + "Grafana URL": "Grafana URL", + "To get a URL, go to Grafana and click 'share' on a graph.": "To get a URL, go to Grafana and click 'share' on a graph.", + "Conference URL": "Conference URL", + " Spotify URI": " Spotify URI", + "Click 'share' from your favourite playlist, artist, track, or album and paste the Spotify URI here.": "Click 'share' from your favourite playlist, artist, track, or album and paste the Spotify URI here.", + "Trading Pair": "Trading Pair", + "Interval": "Interval", + "Whiteboard Name": "Whiteboard Name", + "Whiteboard URL": "Whiteboard URL", + "Video URL": "Video URL", + "An open source integration manager for Matrix": "An open source integration manager for Matrix", + "Self-host your favourite bots, bridges, and widgets.": "Self-host your favourite bots, bridges, and widgets.", + "source": "source", + "Try it out or": "Try it out or", + "run your own": "run your own", + "Visit": "Visit", + "and log in with your Matrix account or point your Element": "and log in with your Matrix account or point your Element", + "at our servers:": "at our servers:", + "Add utility for everyone in your room by embedding an application.": "Add utility for everyone in your room by embedding an application.", + "Notes": "Notes", + "Google Calendar": "Google Calendar", + "Custom Widget": "Custom Widget", + "Bots bring entertainment or productivity to the room. They're here to help at your command.": "Bots bring entertainment or productivity to the room. They're here to help at your command.", + "Guggy": "Guggy", + "Giphy": "Giphy", + "Imgur": "Imgur", + "Google Image Search": "Google Image Search", + "Wikipedia": "Wikipedia", + "Travis CI": "Travis CI", + "RSS Notifications": "RSS Notifications", + "Echo": "Echo", + "Bring the outside world into your room with bridges.": "Bring the outside world into your room with bridges.", + "Stickers": "Stickers", + "Have some fun and post a sticker.": "Have some fun and post a sticker.", + "Huskies": "Huskies", + "Cats": "Cats", + "Cat Faces": "Cat Faces", + "Loading Artist": "Loading Artist", + "source on GitHub": "source on GitHub", + "Welcome to Dimension!": "Welcome to Dimension!", + "Join": "Join", + "for news and updates. Don't forget to star the repository on": "for news and updates. Don't forget to star the repository on", + "Here's the configuration options you'll need to update in your Element": "Here's the configuration options you'll need to update in your Element", + "The location of": "The location of ", + "differs depending on whether the": " differs depending on whether the", + "or": " or ", + "version of Element is used.": " version of Element is used.", + "Configuring integrations": "Configuring integrations", + "If everything is set up correctly, you'll be able to access the admin area of Dimension by clicking the 3x3 grid in the top right of any room in Element. The gear icon": "If everything is set up correctly, you'll be able to access the admin area of Dimension by clicking the 3x3 grid in the top right of any room in Element. The gear icon", + "in the top right is where you can configure your bots, bridges, and widgets.": "in the top right is where you can configure your bots, bridges, and widgets.", + "Could not connect to integrations server error": "Could not connect to integrations server error", + "When Element cannot reach Dimension or Dimension is unable to reach your homeserver an error saying 'Could not contact integrations server' shows up in every room. Before visiting us in": "When Element cannot reach Dimension or Dimension is unable to reach your homeserver an error saying 'Could not contact integrations server' shows up in every room. Before visiting us in", + "on Matrix, here's a few things to check:": "on Matrix, here's a few things to check:", + "Verify the homeserver configuration in Dimension.": "Verify the homeserver configuration in Dimension.", + "The name, client/server URL, and access token all need to be valid and directed at your homeserver.": "The name, client/server URL, and access token all need to be valid and directed at your homeserver.", + "Verify federation is enabled on your homeserver.": "Verify federation is enabled on your homeserver.", + "Even in a private, or non-federated, environment federation needs to be enabled so Dimension can work correctly. Dimension should still work okay if federation on your homeserver is bound to a private interface instead of being public - just be sure to set the federation URL in your configuration.": "Even in a private, or non-federated, environment federation needs to be enabled so Dimension can work correctly. Dimension should still work okay if federation on your homeserver is bound to a private interface instead of being public - just be sure to set the federation URL in your configuration.", + "Verify that federation is working on your homeserver.": "Verify that federation is working on your homeserver.", + "Using tools like the": "Using tools like the", + "federation tester": "federation tester", + ", make sure that federation is working on your homeserver.": ", make sure that federation is working on your homeserver.", + "Looking for your sticker packs?": "Looking for your sticker packs?", + "Click here": "Click here", + "This room is encrypted": "This room is encrypted", + "Integrations are not encrypted!": "Integrations are not encrypted!", + "This means that some information about yourself and the room may be leaked to the bot, bridge, or widget. This information includes the room ID, your display name, your username, your avatar, information about Element, and other similar details. Add integrations with caution.": "This means that some information about yourself and the room may be leaked to the bot, bridge, or widget. This information includes the room ID, your display name, your username, your avatar, information about Element, and other similar details. Add integrations with caution.", + "There are currently no integrations which support encrypted rooms. Sorry about that!": "There are currently no integrations which support encrypted rooms. Sorry about that!", + "No integrations available": "No integrations available", + "This room does not have any compatible integrations. Please contact the server owner if you're seeing this message.": "This room does not have any compatible integrations. Please contact the server owner if you're seeing this message.", + "BigBlueButton Conference": "BigBlueButton Conference", + "Join Conference": "Join Conference", + "Sorry, this content cannot be embedded": "Sorry, this content cannot be embedded", + "Start camera:": "Start camera:", + "You": "You", + "Integrations": "Integrations", + "Your client is too old to use this widget. Try upgrading your client to the latest available version, or contact the author to try and diagnose the problem. Your client needs to support OpenID information exchange.": "Your client is too old to use this widget. Try upgrading your client to the latest available version, or contact the author to try and diagnose the problem. Your client needs to support OpenID information exchange.", + "Check connection": "Check connection", + "Click to start OpenID auth": "Click to start OpenID auth", + "User ID:": "User ID:", + "You have blocked this widget from receiving credentials.": "You have blocked this widget from receiving credentials.", + "An error has occurred - see logs for details": "An error has occurred - see logs for details", + "There was a problem authenticating your use of this sticker picker. Please make sure you're using a client that has Dimension enabled and correctly set up.": "There was a problem authenticating your use of this sticker picker. Please make sure you're using a client that has Dimension enabled and correctly set up.", + "You have no sticker packs.": "You have no sticker packs.", + "Add some stickers": "Add some stickers", + "Failed to load bridges": "Failed to load bridges", + "Error loading bridges": "Error loading bridges", + "Failed to get an updated Github bridge list": "Failed to get an updated Github bridge list", + "Github bridge added": "Github bridge added", + "Failed to create Github bridge": "Failed to create Github bridge", + "Github bridge updated": "Github bridge updated", + "Failed to update Github bridge": "Failed to update Github bridge", + "IRC Bridge added": "IRC Bridge added", + "Failed to create IRC bridge": "Failed to create IRC bridge", + "Click the pencil icon to enable networks.": "Click the pencil icon to enable networks.", + "matrix.org's IRC bridge added": "matrix.org's IRC bridge added", + "Error adding matrix.org's IRC Bridge": "Error adding matrix.org's IRC Bridge", + "Error creating matrix.org's IRC Bridge": "Error creating matrix.org's IRC Bridge", + "Failed to get an update IRC bridge list": "Failed to get an update IRC bridge list", + "disabled": "disabled", + "Failed to update network": "Failed to update network", + "Slack bridge added": "Slack bridge added", + "Failed to create Slack bridge": "Failed to create Slack bridge", + "Slack bridge updated": "Slack bridge updated", + "Failed to update Slack bridge": "Failed to update Slack bridge", + "matrix.org's Slack bridge added": "matrix.org's Slack bridge added", + "Error adding matrix.org's Slack Bridge": "Error adding matrix.org's Slack Bridge", + "Error creating matrix.org's Slack Bridge": "Error creating matrix.org's Slack Bridge", + "Failed to get an update Slack bridge list": "Failed to get an update Slack bridge list", + "Telegram bridge added": "Telegram bridge added", + "Failed to create Telegram bridge": "Failed to create Telegram bridge", + "Telegram bridge updated": "Telegram bridge updated", + "Failed to update Telegram bridge": "Failed to update Telegram bridge", + "Failed to get an update Telegram bridge list": "Failed to get an update Telegram bridge list", + "Webhook bridge added": "Webhook bridge added", + "Failed to create Webhook bridge": "Failed to create Webhook bridge", + "Webhook bridge updated": "Webhook bridge updated", + "Failed to update Webhook bridge": "Failed to update Webhook bridge", + "Failed to get an update Webhooks bridge list": "Failed to get an update Webhooks bridge list", + "Please enter a name for the bot": "Please enter a name for the bot", + "Please enter an avatar URL for the bot": "Please enter an avatar URL for the bot", + "Please enter a user ID for the bot": "Please enter a user ID for the bot", + "Please enter a description for the bot": "Please enter a description for the bot", + "Please enter an access token for the bot": "Please enter an access token for the bot", + "Bot updated": "Bot updated", + "Error updating bot": "Error updating bot", + "Error loading go-neb configuration": "Error loading go-neb configuration", + "Failed to get an updated bot list": "Failed to get an updated bot list", + "Everyone has been logged out": "Everyone has been logged out", + "Error logging everyone out": "Error logging everyone out", + "New go-neb created": "New go-neb created", + "Error creating appservice": "Error creating appservice", + "Could not load appservice configuration": "Could not load appservice configuration", + "The appservice appears to be correctly set up": "The appservice appears to be correctly set up", + "The appservice is not correctly set up": "The appservice is not correctly set up", + "Error loading configuration": "Error loading configuration", + "Configuration updated": "Configuration updated", + "Error updating integration": "Error updating integration", + "Integration updated": "Integration updated", + "Failed to configure the integration": "Failed to configure the integration", + "Manual troubleshooting may be requred": "Manual troubleshooting may be requred", + "Could not get go-neb configuration": "Could not get go-neb configuration", + "matrix.org's go-neb added": "matrix.org's go-neb added", + "Click the pencil icon to enable the bots.": "Click the pencil icon to enable the bots.", + "Error adding matrix.org's go-neb": "Error adding matrix.org's go-neb", + "Error creating matrix.org go-neb": "Error creating matrix.org go-neb", + "Failed to load sticker packs": "Failed to load sticker packs", + "Sticker pack updated": "Sticker pack updated", + "Error updating sticker pack": "Error updating sticker pack", + "Telegram sticker pack imported": "Telegram sticker pack imported", + "Error importing sticker pack": "Error importing sticker pack", + "Failed to load policy": "Failed to load policy", + "Failed to load policies": "Failed to load policies", + "Policy published": "Policy published", + "Error publishing policy": "Error publishing policy", + "Please enter a name for all policies": "Please enter a name for all policies", + "Please enter text for all policies": "Please enter text for all policies", + "Draft saved": "Draft saved", + "Error saving policy": "Error saving policy", + "Draft created": "Draft created", + "Error creating document": "Error creating document", + "Please enter a version number": "Please enter a version number", + "Widget updated": "Widget updated", + "Error updating widget": "Error updating widget", + "Failed to load widgets": "Failed to load widgets", + "Error opening configuration page": "Error opening configuration page", + "Failed to load configuration": "Failed to load configuration", + "Error updating configuration": "Error updating configuration", + "Error inviting bridge": "Error inviting bridge", + "Bridge requested": "Bridge requested", + "Error requesting bridge": "Error requesting bridge", + "Bridge removed": "Bridge removed", + "Error removing bridge": "Error removing bridge", + "Please enter a channel name": "Please enter a channel name", + "Error loading channel operators": "Error loading channel operators", + "Failed to make the bridge an administrator": "Failed to make the bridge an administrator", + "Please ensure you are an 'Admin' for the room": "Please ensure you are an 'Admin' for the room", + "Link requested!": "Link requested!", + "The operator selected will have to approve the bridge for it to work": "The operator selected will have to approve the bridge for it to work", + "Failed to request a link": "Failed to request a link", + "Link removed": "Link removed", + "Failed to remove link": "Failed to remove link", + "Error getting Slack authorization information": "Error getting Slack authorization information", + "Error getting teams": "Error getting teams", + "Error getting channels for team": "Error getting channels for team", + "Bridge updated": "Bridge updated", + "Webhook created": "Webhook created", + "Error creating webhook": "Error creating webhook", + "Webhook deleted": "Webhook deleted", + "Error deleting webhook": "Error deleting webhook", + "Please enter a feed URL": "Please enter a feed URL", + "Please enter a repository": "Please enter a repository", + "was invited to the room": "was invited to the room", + "was removed from the room": " was removed from the room", + "Could not update integration status": "Could not update integration status", + "Stickerpack added": "Stickerpack added", + "Error adding stickerpack": "Error adding stickerpack", + "Stickers updated": "Stickers updated", + "Error updating stickers": "Error updating stickers", + "Please enter a URL for the widget": "Please enter a URL for the widget", + "Widget added!": "Widget added!", + "Widget updated!": "Widget updated!", + "Widget deleted!": "Widget deleted!", + "Please enter a video URL": "Please enter a video URL", + "Please enter a YouTube, Vimeo, or DailyMotion video URL": "Please enter a YouTube, Vimeo, or DailyMotion video URL", + "Unable to load Dimension - missing room ID or token.": "Unable to load Dimension - missing room ID or token.", + "Could not verify your token. Please try logging out of Element and back in. Be sure to back up your encryption keys!": "Could not verify your token. Please try logging out of Element and back in. Be sure to back up your encryption keys!", + "Unable to communicate with Dimension due to an unknown error.": "Unable to communicate with Dimension due to an unknown error.", + "You do not appear to have permission to modify widgets in this room": "You do not appear to have permission to modify widgets in this room", + "Unable to set up Dimension. This version of Element may not supported or there may be a problem with the server.": "Unable to set up Dimension. This version of Element may not supported or there may be a problem with the server.", + "This integration is offline or unavailable": "This integration is offline or unavailable", + "Could not communicate with Element": "Could not communicate with Element", + "You cannot modify widgets in this room": "You cannot modify widgets in this room", + "Error communicating with Element": "Error communicating with Element", + "Expected to not be able to send specific event types": "Expected to not be able to send specific event types", + "Expected to be able to send specific event types": "Expected to be able to send specific event types", + "Requirement": "Requirement ", + "not found": " not found", + "Failed to take screenshot: iframe not supported": "Failed to take screenshot: iframe not supported", + "Failed to take screenshot": "Failed to take screenshot", + "Click the button to test your connection. This may cause your client to ask if it is okay to share your identity with the widget - this is required to test your connection to your homeserver.": "Click the button to test your connection. This may cause your client to ask if it is okay to share your identity with the widget - this is required to test your connection to your homeserver.", + "Please accept the prompt to verify your identity.": "Please accept the prompt to verify your identity.", + "You have blocked this widget from verifying your identity.": "You have blocked this widget from verifying your identity.", + "Checking connectivity to integration manager...": "Checking connectivity to integration manager...", + "Checking connectivity to homeserver...": "Checking connectivity to homeserver...", + "Error checking if the integration manager is alive. This usually means that the manager which served this widget has gone offline.": "Error checking if the integration manager is alive. This usually means that the manager which served this widget has gone offline.", + "You're all set! Click the button below to re-run the test.": "You're all set! Click the button below to re-run the test.", + "Error contacting homeserver. This usually means your federation setup is incorrect, or your homeserver is offline. Consult your homeserver's documentation for how to set up federation.": "Error contacting homeserver. This usually means your federation setup is incorrect, or your homeserver is offline. Consult your homeserver's documentation for how to set up federation.", + "Checking client version...": "Checking client version...", + "Your client is too old to use this widget, sorry": "Your client is too old to use this widget, sorry", + "Please accept the prompt to verify your identity": "Please accept the prompt to verify your identity", + "Error loading policy": "Error loading policy" +} \ No newline at end of file diff --git a/web/assets/i18n/template.json b/web/assets/i18n/template.json index 274d8df..4fd3535 100644 --- a/web/assets/i18n/template.json +++ b/web/assets/i18n/template.json @@ -1,467 +1,463 @@ { - "Dashboard": "Dashboard", - "Widgets": "Widgets", - "go-neb": "go-neb", - "Custom Bots": "Custom Bots", - "Bridges": "Bridges", - "Sticker Packs": "Sticker Packs", - "Terms of Service": "Terms of Service", - "Bridges provide a way for rooms to interact with and/or bring in events from a third party network. For example, an IRC bridge can allow IRC and matrix users to communicate with each other.": "Bridges provide a way for rooms to interact with and/or bring in events from a third party network. For example, an IRC bridge can allow IRC and matrix users to communicate with each other.", - "Name": "Name", - "Description": "Description", - "Actions": "Actions", - "No bridges.": "No bridges.", - "matrix-appservice-gitter": "matrix-appservice-gitter", - "is a Gitter bridge that supports bridging Gitter rooms to Matrix. Users on Matrix are represented as a single bot user in Gitter, however Gitter users are represented as real-looking Matrix users in the room.": "is a Gitter bridge that supports bridging Gitter rooms to Matrix. Users on Matrix are represented as a single bot user in Gitter, however Gitter users are represented as real-looking Matrix users in the room.", - "No bridge configurations.": "No bridge configurations.", - "Add matrix.org's bridge": "Add matrix.org's bridge", - "Add self-hosted bridge": "Add self-hosted bridge", - "self-hosted Gitter bridge": "self-hosted Gitter bridge", - "Self-hosted Gitter bridges already have provisioning enabled. Be careful not to expose the API to the public internet.": "Self-hosted Gitter bridges already have provisioning enabled. Be careful not to expose the API to the public internet.", - "Provisioning URL": "Provisioning URL", - "The provisioning URL for the bridge. This is usually the same as the URL your homeserver uses to communicate with the bridge.": "The provisioning URL for the bridge. This is usually the same as the URL your homeserver uses to communicate with the bridge.", - "Save": "Save", - "Cancel": "Cancel", - "Add a new self-hosted IRC Bridge": "Add a new self-hosted IRC Bridge", - "Self-hosted IRC bridges must have": "Self-hosted IRC bridges must have", - "provisioning": "provisioning", - "enabled in the configuration.": "enabled in the configuration.", - "The provisioning URL for the bridge. This is usually the same as the URL given in the registration. This API is not authenticated and should be treated with caution.": "The provisioning URL for the bridge. This is usually the same as the URL given in the registration. This API is not authenticated and should be treated with caution.", - "matrix-appservice-irc": "matrix-appservice-irc", - "is an IRC bridge that supports multiple IRC networks. Dimension is capable of using multiple IRC bridges to better distribute the load across multiple networks in large deployments.": "is an IRC bridge that supports multiple IRC networks. Dimension is capable of using multiple IRC bridges to better distribute the load across multiple networks in large deployments.", - "Enabled Networks": "Enabled Networks", - "This bridge is offline or unavailable.": "This bridge is offline or unavailable.", - "Network": "Network", - "Enabled": "Enabled", - "Close": "Close", - "self-hosted Slack bridge": "self-hosted Slack bridge", - "Self-hosted Slack bridges already have provisioning enabled. Be careful not to expose the API to the public internet.": "Self-hosted Slack bridges already have provisioning enabled. Be careful not to expose the API to the public internet.", - "matrix-appservice-slack": "matrix-appservice-slack", - "is a Slack bridge that supports bridging Slack channels to Matrix. Users authorize the bridge to access their Slack workspaces and from there they can pick the channels they'd like to bridge.": "is a Slack bridge that supports bridging Slack channels to Matrix. Users authorize the bridge to access their Slack workspaces and from there they can pick the channels they'd like to bridge.", - "self-hosted Telegram bridge": "self-hosted Telegram bridge", - "Self-hosted Telegram bridges must have": "Self-hosted Telegram bridges must have", - "The provisioning URL for the bridge. This is the public address for the bridge followed by the provisioning prefix given in the configuration.": "The provisioning URL for the bridge. This is the public address for the bridge followed by the provisioning prefix given in the configuration.", - "Shared Secret": "Shared Secret", - "The shared secret defined in the configuration for provisioning.": "The shared secret defined in the configuration for provisioning.", - "Promote Telegram Puppeting": "Promote Telegram Puppeting", - "If enabled, Dimension will recommend that users log in to their Telegram accounts.": "If enabled, Dimension will recommend that users log in to their Telegram accounts.", - "Promote Matrix Puppeting": "Promote Matrix Puppeting", - "If enabled, Dimension will recommend that users log in to their Matrix accounts.": "If enabled, Dimension will recommend that users log in to their Matrix accounts.", - "mautrix-telegram": "mautrix-telegram", - "is a Telegram bridge that supports bridging channels/supergroups to Matrix. This can be done through a 'relay bot' (all Matrix users are represented through a single bot in Telegram) or by making use of a user's real Telegram account (known as 'puppeting'). Currently only one Telegram bridge can be configured at a time.": "is a Telegram bridge that supports bridging channels/supergroups to Matrix. This can be done through a 'relay bot' (all Matrix users are represented through a single bot in Telegram) or by making use of a user's real Telegram account (known as 'puppeting'). Currently only one Telegram bridge can be configured at a time.", - "Enabled Features": "Enabled Features", - "self-hosted webhook bridge": "self-hosted webhook bridge", - "Self-hosted webhook bridges must have": "Self-hosted webhook bridges must have", - "The public URL for the bridge.": "The public URL for the bridge.", - "The provisioning secret defined in the configuration.": "The provisioning secret defined in the configuration.", - "matrix-appservice-webhooks": "matrix-appservice-webhooks", - "provides Slack-compatible webhooks for Matrix, making it easy to send updates into a room.": "provides Slack-compatible webhooks for Matrix, making it easy to send updates into a room.", - "custom bot": "custom bot", - "The user ID that Dimension will invite to rooms.": "The user ID that Dimension will invite to rooms.", - "A few words here will help people understand what the bot does.": "A few words here will help people understand what the bot does.", - "Display Name": "Display Name", - "This is the name Dimension will use to tell users which bot this is.": "This is the name Dimension will use to tell users which bot this is.", - "This can either be an MXC URI or a plain URL.": "This can either be an MXC URI or a plain URL.", - "This is used by Dimension to force the bot to leave the room when the user removes the bot.": "This is used by Dimension to force the bot to leave the room when the user removes the bot.", - "Learn more about access tokens.": "Learn more about access tokens.", - "Custom bots give you the ability to add your own bots to Dimension for users to add to their rooms. These bots can't have any configuration to them and must be able to accept room invites on their own. All Dimension will do when a user wants to add the bot is invite it to the room.": "Custom bots give you the ability to add your own bots to Dimension for users to add to their rooms. These bots can't have any configuration to them and must be able to accept room invites on their own. All Dimension will do when a user wants to add the bot is invite it to the room.", - "No custom bots.": "No custom bots.", - "Add custom bot": "Add custom bot", - "Custom bots": "Custom bots", - "Parts of your configuration are displayed below. To change these values, edit your configuration and restart Dimension.": "Parts of your configuration are displayed below. To change these values, edit your configuration and restart Dimension.", - "Administrators": "Administrators", - "Widget Blacklist": "Widget Blacklist", - "Homeserver": "Homeserver", - "Federation URL": "Federation URL", - "Federation Hostname": "Federation Hostname", - "Client/Server URL": "Client/Server URL", - "Utility User ID": "Utility User ID", - "Sessions": "Sessions", - "Tokens registered": "Tokens registered", - "Logout Everyone": "Logout Everyone", - "Configuration": "Configuration", - "Logout confirmation": "Logout confirmation", - "Logging everyone out will disable all known login tokens for Dimension and upstream integration managers. Most clients will automatically re-register for a login token behind the scenes, similar to how a login token was first acquired.": "Logging everyone out will disable all known login tokens for Dimension and upstream integration managers. Most clients will automatically re-register for a login token behind the scenes, similar to how a login token was first acquired.", - "Self-hosted go-neb instances are powered by application services installed on your homeserver. The application service is responsible for creating the bots dynamically.": "Self-hosted go-neb instances are powered by application services installed on your homeserver. The application service is responsible for creating the bots dynamically.", - "User Prefix": "User Prefix", - "This is the prefix used for all bot users.": "This is the prefix used for all bot users.", - "API URL": "API URL", - "The admin/api url for go-neb. Be sure to not expose the admin API to the outside world because this endpoint is not authenticated.": "The admin/api url for go-neb. Be sure to not expose the admin API to the outside world because this endpoint is not authenticated.", - "New self-hosted go-neb": "New self-hosted go-neb", - "go-neb appservice configuration": "go-neb appservice configuration", - "Copy and paste this configuration to": "Copy and paste this configuration to", - "on your homeserver and register it as an application service.": "on your homeserver and register it as an application service.", - "Test Configuration": "Test Configuration", - "Giphy Configuration": "Giphy Configuration", - "Api Key": "Api Key", - "The API key from": "The API key from", - "Image Size": "Image Size", - "GIFs can be large, and sometimes it is more desirable to have them downsized.": "GIFs can be large, and sometimes it is more desirable to have them downsized.", - "Use downsized images": "Use downsized images", - "Google Configuration": "Google Configuration", - "The API key for your Google Application.": "The API key for your Google Application.", - "The search engine ID": "The search engine ID", - "Guggy Configuration": "Guggy Configuration", - "The API key for": "The API key for", - "Imgur Configuration": "Imgur Configuration", - "Client ID": "Client ID", - "The client ID of your": "The client ID of your", - "Imgur Application": "Imgur Application", - "Client Secret": "Client Secret", - "The client secret of your": "The client secret of your", - "go-neb supports many different types of bots, each of which is listed below. Here you can configure which bots this go-neb instance should use.": "go-neb supports many different types of bots, each of which is listed below. Here you can configure which bots this go-neb instance should use.", - "is a multi-purpose bot that can provide various services, such as reaction GIFs and Github notifications. There are two options for go-neb support in Dimension: using matrix.org's or self-hosting it. Each go-neb instance can have multiple services associated with it (ie: one go-neb here can do everything).": "is a multi-purpose bot that can provide various services, such as reaction GIFs and Github notifications. There are two options for go-neb support in Dimension: using matrix.org's or self-hosting it. Each go-neb instance can have multiple services associated with it (ie: one go-neb here can do everything).", - "Enabled Bots": "Enabled Bots", - "No go-neb configurations.": "No go-neb configurations.", - "Add matrix.org's go-neb": "Add matrix.org's go-neb", - "Add self-hosted go-neb": "Add self-hosted go-neb", - "go-neb configurations": "go-neb configurations", - "Sticker packs provide a way to convey memes or feelings to others in a room. From here you're able to select which sticker packs users of this Dimension instance can use. If no sticker packs are enabled then the 'sticker picker' widget will be disabled.": "Sticker packs provide a way to convey memes or feelings to others in a room. From here you're able to select which sticker packs users of this Dimension instance can use. If no sticker packs are enabled then the 'sticker picker' widget will be disabled.", - "Import from Telegram": "Import from Telegram", - "Author": "Author", - "License": "License", - "No sticker packs installed.": "No sticker packs installed.", - "Dimension": "Dimension", - "version": "version", - "The translated name of your policy": "The translated name of your policy", - "Policy text": "Policy text", - "This is where you put your policy's content.": "This is where you put your policy's content.", - "Create draft": "Create draft", - "Save draft": "Save draft", - "Publish": "Publish", - "Publish policy": "Publish policy", - "Version number": "Version number", - "The version number of this policy": "The version number of this policy", - "Before users can use Dimension they must agree to the terms of service for using your instance. If you're using any matrix.org bridges, users will be required to accept the terms of service for your upstream integration managers (scalar.vector.im usually) in addition to the terms you add here.": "Before users can use Dimension they must agree to the terms of service for using your instance. If you're using any matrix.org bridges, users will be required to accept the terms of service for your upstream integration managers (scalar.vector.im usually) in addition to the terms you add here.", - "Policy Name": "Policy Name", - "Version": "Version", - "No policies written.": "No policies written.", - "New draft policy": "New draft policy", - "Etherpad Widget Configuration": "Etherpad Widget Configuration", - "Default Pad URL Template": "Default Pad URL Template", - "$padName and $roomId will be replaced during creation to help create a unique pad URL.": "$padName and $roomId will be replaced during creation to help create a unique pad URL.", - "Jitsi Widget Configuration": "Jitsi Widget Configuration", - "Jitsi Domain": "Jitsi Domain", - "This is the domain that is used to host the conference.": "This is the domain that is used to host the conference.", - "Use this domain as the default conference domain": "Use this domain as the default conference domain", - "Some clients can create widgets that are not compatible with Dimension, making Dimension use jitsi.riot.im by default. By enabling this option, you'll force Dimension to use your Jitsi domain at risk of having clients not respect it.": "Some clients can create widgets that are not compatible with Dimension, making Dimension use jitsi.riot.im by default. By enabling this option, you'll force Dimension to use your Jitsi domain at risk of having clients not respect it.", - "Jitsi Script URL": "Jitsi Script URL", - "This is used to create the Jitsi widget. It is normally at /libs/external_api.min.js from your domain.": "This is used to create the Jitsi widget. It is normally at /libs/external_api.min.js from your domain.", - "Widgets are small webpages that can be embedded in a Matrix room. Here you can configure which widgets Dimension will offer to users.": "Widgets are small webpages that can be embedded in a Matrix room. Here you can configure which widgets Dimension will offer to users.", - "Bridge to Gitter": "Bridge to Gitter", - "This room is bridged to on Gitter": "This room is bridged to on Gitter", - "on Gitter": "on Gitter", - "Unbridge": "Unbridge", - "Gitter Room": "Gitter Room", - "Add an IRC channel": "Add an IRC channel", - "Bridging a channel requires authorization from a channel operator. When entering a channel below, a bot will join the channel to ensure it exists and has operators available.": "Bridging a channel requires authorization from a channel operator. When entering a channel below, a bot will join the channel to ensure it exists and has operators available.", - "Channel Name": "Channel Name", - "Next": "Next", - "Operator": "Operator", - "The person selected here will be asked to approve or deny the bridge request.": "The person selected here will be asked to approve or deny the bridge request.", - "Request Bridge": "Request Bridge", - "IRC Networks": "IRC Networks", - "Channel": "Channel", - "No bridged channels": "No bridged channels", - "Remove": "Remove", - "Bridge to Slack": "Bridge to Slack", - "This room is bridged to Slack using webhooks. Webhook bridging is legacy and doesn't support as rich bridging as the new approach. It is recommended to re-create the bridge with the new process.": "This room is bridged to Slack using webhooks. Webhook bridging is legacy and doesn't support as rich bridging as the new approach. It is recommended to re-create the bridge with the new process.", - "In order to bridge Slack channels, you'll need to authorize the bridge to access your teams and channels. Please click the button below to do so.": "In order to bridge Slack channels, you'll need to authorize the bridge to access your teams and channels. Please click the button below to do so.", - "Team": "Team", - "Telegram chat is already bridged": "Telegram chat is already bridged", - "You have the appropriate permissions to be able to unbridge the chat, however. Would you like to unbridge the other room and instead bridge it here?": "You have the appropriate permissions to be able to unbridge the chat, however. Would you like to unbridge the other room and instead bridge it here?", - "Unbridge and continue": "Unbridge and continue", - "No, don't bridge": "No, don't bridge", - "That Telegram chat is bridged to another Matrix room and cannot be bridged here. Unfortunately, you do not have the required permissions to be able to unbridge the other room.": "That Telegram chat is bridged to another Matrix room and cannot be bridged here. Unfortunately, you do not have the required permissions to be able to unbridge the other room.", - "Bridge to Telegram": "Bridge to Telegram", - "This room is bridged to on Telegram": "This room is bridged to on Telegram", - "on Telegram": "on Telegram", - "You do not have the necessary permissions in this room to unbridge the channel.": "You do not have the necessary permissions in this room to unbridge the channel.", - "After inviting": "After inviting", - "to your Telegram chat, run the command": "to your Telegram chat, run the command", - "in the Telegram room to get the chat ID.": "in the Telegram room to get the chat ID.", - "Add a new webhook": "Add a new webhook", - "Webhook Name": "Webhook Name", - "Create": "Create", - "Type": "Type", - "No webhooks": "No webhooks", - "No name": "No name", - "Delete": "Delete", - "Feeds": "Feeds", - "Added by": "Added by", - "Add": "Add", - ".travis.yml configuration and template information": ".travis.yml configuration and template information", - "The following section needs to be added to your": "The following section needs to be added to your", - "file in your repositories:": "file in your repositories:", - "The following variables can be used in your template. This template is used to post a message to theroom when your webhook is activated.": "The following variables can be used in your template. This template is used to post a message to theroom when your webhook is activated.", - "The repository identifier": "The repository identifier", - "The repository name": "The repository name", - "The build number": "The build number", - "The build ID": "The build ID", - "The branch name": "The branch name", - "A short version of the commit SHA": "A short version of the commit SHA", - "The first line of the commit message": "The first line of the commit message", - "The full commit message": "The full commit message", - "The author of the commit": "The author of the commit", - "The result of the build": "The result of the build", - "The message from Travis CI about the build": "The message from Travis CI about the build", - "The total duration of all builds in the matrix": "The total duration of all builds in the matrix", - "The time it took to run the build": "The time it took to run the build", - "A URL to see the changes which triggered the build": "A URL to see the changes which triggered the build", - "A URL to see the build information": "A URL to see the build information", - "Repositories": "Repositories", - "Repository": "Repository", - "Template": "Template", - "Sticker packs are not enabled on this Dimension instance.": "Sticker packs are not enabled on this Dimension instance.", - "Start a conversation with": "Start a conversation with", - "to create your own stickerpack.": "to create your own stickerpack.", - "Add stickerpack": "Add stickerpack", - "Created by": "Created by", - "under": "under", - "BigBlueButton Meeting URL": "BigBlueButton Meeting URL", - "Add Widget": "Add Widget", - "Save Widget": "Save Widget", - "Remove Widget": "Remove Widget", - "Widget Name": "Widget Name", - "Widget URL": "Widget URL", - "Pad Name": "Pad Name", - "Pad URL": "Pad URL", - "Shared Calendar ID": "Shared Calendar ID", - "Document URL": "Document URL", - "Grafana URL": "Grafana URL", - "To get a URL, go to Grafana and click 'share' on a graph.": "To get a URL, go to Grafana and click 'share' on a graph.", - "Conference URL": "Conference URL", - " Spotify URI": " Spotify URI", - "Click 'share' from your favourite playlist, artist, track, or album and paste the Spotify URI here.": "Click 'share' from your favourite playlist, artist, track, or album and paste the Spotify URI here.", - "Trading Pair": "Trading Pair", - "Interval": "Interval", - "Whiteboard Name": "Whiteboard Name", - "Whiteboard URL": "Whiteboard URL", - "Video URL": "Video URL", - "An open source integration manager for Matrix": "An open source integration manager for Matrix", - "Self-host your favourite bots, bridges, and widgets.": "Self-host your favourite bots, bridges, and widgets.", - "source": "source", - "Try it out or": "Try it out or", - "run your own": "run your own", - "Visit": "Visit", - "and log in with your Matrix account or point your Element": "and log in with your Matrix account or point your Element", - "at our servers:": "at our servers:", - "Add utility for everyone in your room by embedding an application.": "Add utility for everyone in your room by embedding an application.", - "Notes": "Notes", - "Google Calendar": "Google Calendar", - "Custom Widget": "Custom Widget", - "Bots bring entertainment or productivity to the room. They're here to help at your command.": "Bots bring entertainment or productivity to the room. They're here to help at your command.", - "Guggy": "Guggy", - "Giphy": "Giphy", - "Imgur": "Imgur", - "Google Image Search": "Google Image Search", - "Wikipedia": "Wikipedia", - "Travis CI": "Travis CI", - "RSS Notifications": "RSS Notifications", - "Echo": "Echo", - "Bring the outside world into your room with bridges.": "Bring the outside world into your room with bridges.", - "Stickers": "Stickers", - "Have some fun and post a sticker.": "Have some fun and post a sticker.", - "Huskies": "Huskies", - "Cats": "Cats", - "Cat Faces": "Cat Faces", - "Loading Artist": "Loading Artist", - "source on GitHub": "source on GitHub", - "Welcome to Dimension!": "Welcome to Dimension!", - "Join": "Join", - "for news and updates. Don't forget to star the repository on": "for news and updates. Don't forget to star the repository on", - "Here's the configuration options you'll need to update in your Element": "Here's the configuration options you'll need to update in your Element", - "Configuring integrations": "Configuring integrations", - "If everything is set up correctly, you'll be able to access the admin area of Dimension by clicking the 3x3 grid in the top right of any room in Element. The gear icon": "If everything is set up correctly, you'll be able to access the admin area of Dimension by clicking the 3x3 grid in the top right of any room in Element. The gear icon", - "in the top right is where you can configure your bots, bridges, and widgets.": "in the top right is where you can configure your bots, bridges, and widgets.", - "Could not connect to integrations server error": "Could not connect to integrations server error", - "When Element cannot reach Dimension or Dimension is unable to reach your homeserver an error saying 'Could not contact integrations server' shows up in every room. Before visiting us in": "When Element cannot reach Dimension or Dimension is unable to reach your homeserver an error saying 'Could not contact integrations server' shows up in every room. Before visiting us in", - "on Matrix, here's a few things to check:": "on Matrix, here's a few things to check:", - "Verify the homeserver configuration in Dimension.": "Verify the homeserver configuration in Dimension.", - "The name, client/server URL, and access token all need to be valid and directed at your homeserver.": "The name, client/server URL, and access token all need to be valid and directed at your homeserver.", - "Verify federation is enabled on your homeserver.": "Verify federation is enabled on your homeserver.", - "Even in a private, or non-federated, environment federation needs to be enabled so Dimension can work correctly. Dimension should still work okay if federation on your homeserver is bound to a private interface instead of being public - just be sure to set the federation URL in your configuration.": "Even in a private, or non-federated, environment federation needs to be enabled so Dimension can work correctly. Dimension should still work okay if federation on your homeserver is bound to a private interface instead of being public - just be sure to set the federation URL in your configuration.", - "Verify that federation is working on your homeserver.": "Verify that federation is working on your homeserver.", - "Using tools like the": "Using tools like the", - "federation tester": "federation tester", - ", make sure that federation is working on your homeserver.": ", make sure that federation is working on your homeserver.", - "Looking for your sticker packs?": "Looking for your sticker packs?", - "Click here": "Click here", - "This room is encrypted": "This room is encrypted", - "Integrations are not encrypted!": "Integrations are not encrypted!", - "This means that some information about yourself and the room may be leaked to the bot, bridge, or widget. This information includes the room ID, your display name, your username, your avatar, information about Element, and other similar details. Add integrations with caution.": "This means that some information about yourself and the room may be leaked to the bot, bridge, or widget. This information includes the room ID, your display name, your username, your avatar, information about Element, and other similar details. Add integrations with caution.", - "There are currently no integrations which support encrypted rooms. Sorry about that!": "There are currently no integrations which support encrypted rooms. Sorry about that!", - "No integrations available": "No integrations available", - "This room does not have any compatible integrations. Please contact the server owner if you're seeing this message.": "This room does not have any compatible integrations. Please contact the server owner if you're seeing this message.", - "BigBlueButton Conference": "BigBlueButton Conference", - "Join Conference": "Join Conference", - "Sorry, this content cannot be embedded": "Sorry, this content cannot be embedded", - "Start camera:": "Start camera:", - "You": "You", - "Integrations": "Integrations", - "Your client is too old to use this widget. Try upgrading your client to the latest available version, or contact the author to try and diagnose the problem. Your client needs to support OpenID information exchange.": "Your client is too old to use this widget. Try upgrading your client to the latest available version, or contact the author to try and diagnose the problem. Your client needs to support OpenID information exchange.", - "Check connection": "Check connection", - "Click to start OpenID auth": "Click to start OpenID auth", - "User ID:": "User ID:", - "You have blocked this widget from receiving credentials.": "You have blocked this widget from receiving credentials.", - "An error has occurred - see logs for details": "An error has occurred - see logs for details", - "There was a problem authenticating your use of this sticker picker. Please make sure you're using a client that has Dimension enabled and correctly set up.": "There was a problem authenticating your use of this sticker picker. Please make sure you're using a client that has Dimension enabled and correctly set up.", - "You have no sticker packs.": "You have no sticker packs.", - "Add some stickers": "Add some stickers", - "Failed to load bridges": "Failed to load bridges", - "Error loading bridges": "Error loading bridges", - "matrix.org's Gitter bridge added": "matrix.org's Gitter bridge added", - "Error adding matrix.org's Gitter Bridge": "Error adding matrix.org's Gitter Bridge", - "Error creating matrix.org's Gitter Bridge": "Error creating matrix.org's Gitter Bridge", - "Failed to get an update Gitter bridge list": "Failed to get an update Gitter bridge list", - "Gitter bridge added": "Gitter bridge added", - "Failed to create Gitter bridge": "Failed to create Gitter bridge", - "Gitter bridge updated": "Gitter bridge updated", - "Failed to update Gitter bridge": "Failed to update Gitter bridge", - "IRC Bridge added": "IRC Bridge added", - "Failed to create IRC bridge": "Failed to create IRC bridge", - "Click the pencil icon to enable networks.": "Click the pencil icon to enable networks.", - "matrix.org's IRC bridge added": "matrix.org's IRC bridge added", - "Error adding matrix.org's IRC Bridge": "Error adding matrix.org's IRC Bridge", - "Error creating matrix.org's IRC Bridge": "Error creating matrix.org's IRC Bridge", - "Failed to get an update IRC bridge list": "Failed to get an update IRC bridge list", - "disabled": "disabled", - "Failed to update network": "Failed to update network", - "Slack bridge added": "Slack bridge added", - "Failed to create Slack bridge": "Failed to create Slack bridge", - "Slack bridge updated": "Slack bridge updated", - "Failed to update Slack bridge": "Failed to update Slack bridge", - "matrix.org's Slack bridge added": "matrix.org's Slack bridge added", - "Error adding matrix.org's Slack Bridge": "Error adding matrix.org's Slack Bridge", - "Error creating matrix.org's Slack Bridge": "Error creating matrix.org's Slack Bridge", - "Failed to get an update Slack bridge list": "Failed to get an update Slack bridge list", - "Telegram bridge added": "Telegram bridge added", - "Failed to create Telegram bridge": "Failed to create Telegram bridge", - "Telegram bridge updated": "Telegram bridge updated", - "Failed to update Telegram bridge": "Failed to update Telegram bridge", - "Failed to get an update Telegram bridge list": "Failed to get an update Telegram bridge list", - "Webhook bridge added": "Webhook bridge added", - "Failed to create Webhook bridge": "Failed to create Webhook bridge", - "Webhook bridge updated": "Webhook bridge updated", - "Failed to update Webhook bridge": "Failed to update Webhook bridge", - "Failed to get an update Webhooks bridge list": "Failed to get an update Webhooks bridge list", - "Please enter a name for the bot": "Please enter a name for the bot", - "Please enter an avatar URL for the bot": "Please enter an avatar URL for the bot", - "Please enter a user ID for the bot": "Please enter a user ID for the bot", - "Please enter a description for the bot": "Please enter a description for the bot", - "Please enter an access token for the bot": "Please enter an access token for the bot", - "Bot updated": "Bot updated", - "Error updating bot": "Error updating bot", - "Error loading go-neb configuration": "Error loading go-neb configuration", - "Failed to get an updated bot list": "Failed to get an updated bot list", - "Everyone has been logged out": "Everyone has been logged out", - "Error logging everyone out": "Error logging everyone out", - "New go-neb created": "New go-neb created", - "Error creating appservice": "Error creating appservice", - "Could not load appservice configuration": "Could not load appservice configuration", - "The appservice appears to be correctly set up": "The appservice appears to be correctly set up", - "The appservice is not correctly set up": "The appservice is not correctly set up", - "Error loading configuration": "Error loading configuration", - "Configuration updated": "Configuration updated", - "Error updating integration": "Error updating integration", - "Integration updated": "Integration updated", - "Failed to configure the integration": "Failed to configure the integration", - "Manual troubleshooting may be requred": "Manual troubleshooting may be requred", - "Could not get go-neb configuration": "Could not get go-neb configuration", - "matrix.org's go-neb added": "matrix.org's go-neb added", - "Click the pencil icon to enable the bots.": "Click the pencil icon to enable the bots.", - "Error adding matrix.org's go-neb": "Error adding matrix.org's go-neb", - "Error creating matrix.org go-neb": "Error creating matrix.org go-neb", - "Failed to load sticker packs": "Failed to load sticker packs", - "Sticker pack updated": "Sticker pack updated", - "Error updating sticker pack": "Error updating sticker pack", - "Telegram sticker pack imported": "Telegram sticker pack imported", - "Error importing sticker pack": "Error importing sticker pack", - "Failed to load policy": "Failed to load policy", - "Failed to load policies": "Failed to load policies", - "Policy published": "Policy published", - "Error publishing policy": "Error publishing policy", - "Please enter a name for all policies": "Please enter a name for all policies", - "Please enter text for all policies": "Please enter text for all policies", - "Draft saved": "Draft saved", - "Error saving policy": "Error saving policy", - "Draft created": "Draft created", - "Error creating document": "Error creating document", - "Please enter a version number": "Please enter a version number", - "Widget updated": "Widget updated", - "Error updating widget": "Error updating widget", - "Failed to load widgets": "Failed to load widgets", - "Error opening configuration page": "Error opening configuration page", - "Failed to load configuration": "Failed to load configuration", - "Error updating configuration": "Error updating configuration", - "Error inviting bridge": "Error inviting bridge", - "Bridge requested": "Bridge requested", - "Error requesting bridge": "Error requesting bridge", - "Bridge removed": "Bridge removed", - "Error removing bridge": "Error removing bridge", - "Please enter a channel name": "Please enter a channel name", - "Error loading channel operators": "Error loading channel operators", - "Failed to make the bridge an administrator": "Failed to make the bridge an administrator", - "Please ensure you are an 'Admin' for the room": "Please ensure you are an 'Admin' for the room", - "Link requested!": "Link requested!", - "The operator selected will have to approve the bridge for it to work": "The operator selected will have to approve the bridge for it to work", - "Failed to request a link": "Failed to request a link", - "Link removed": "Link removed", - "Failed to remove link": "Failed to remove link", - "Error getting Slack authorization information": "Error getting Slack authorization information", - "Error getting teams": "Error getting teams", - "Error getting channels for team": "Error getting channels for team", - "Bridge updated": "Bridge updated", - "Webhook created": "Webhook created", - "Error creating webhook": "Error creating webhook", - "Webhook deleted": "Webhook deleted", - "Error deleting webhook": "Error deleting webhook", - "Please enter a feed URL": "Please enter a feed URL", - "Please enter a repository": "Please enter a repository", - "was invited to the room": "was invited to the room", - "was removed from the room": "was removed from the room", - "Could not update integration status": "Could not update integration status", - "Stickerpack added": "Stickerpack added", - "Error adding stickerpack": "Error adding stickerpack", - "Stickers updated": "Stickers updated", - "Error updating stickers": "Error updating stickers", - "Please enter a URL for the widget": "Please enter a URL for the widget", - "Widget added!": "Widget added!", - "Widget updated!": "Widget updated!", - "Widget deleted!": "Widget deleted!", - "Please enter a video URL": "Please enter a video URL", - "Please enter a YouTube, Vimeo, or DailyMotion video URL": "Please enter a YouTube, Vimeo, or DailyMotion video URL", - "Unable to load Dimension - missing room ID or token.": "Unable to load Dimension - missing room ID or token.", - "Could not verify your token. Please try logging out of Element and back in. Be sure to back up your encryption keys!": "Could not verify your token. Please try logging out of Element and back in. Be sure to back up your encryption keys!", - "Unable to communicate with Dimension due to an unknown error.": "Unable to communicate with Dimension due to an unknown error.", - "You do not appear to have permission to modify widgets in this room": "You do not appear to have permission to modify widgets in this room", - "Unable to set up Dimension. This version of Element may not supported or there may be a problem with the server.": "Unable to set up Dimension. This version of Element may not supported or there may be a problem with the server.", - "This integration is offline or unavailable": "This integration is offline or unavailable", - "Could not communicate with Element": "Could not communicate with Element", - "The room must be": "The room must be", - "to use this integration": "to use this integration", - "You cannot modify widgets in this room": "You cannot modify widgets in this room", - "Error communicating with Element": "Error communicating with Element", - "Expected to not be able to send specific event types": "Expected to not be able to send specific event types", - "Expected to be able to send specific event types": "Expected to be able to send specific event types", - "Requirement": "Requirement", - "not found": "not found", - "Failed to take screenshot: iframe not supported": "Failed to take screenshot: iframe not supported", - "Failed to take screenshot": "Failed to take screenshot", - "Click the button to test your connection. This may cause your client to ask if it is okay to share your identity with the widget - this is required to test your connection to your homeserver.": "Click the button to test your connection. This may cause your client to ask if it is okay to share your identity with the widget - this is required to test your connection to your homeserver.", - "Please accept the prompt to verify your identity.": "Please accept the prompt to verify your identity.", - "You have blocked this widget from verifying your identity.": "You have blocked this widget from verifying your identity.", - "Checking connectivity to integration manager...": "Checking connectivity to integration manager...", - "Checking connectivity to homeserver...": "Checking connectivity to homeserver...", - "Error checking if the integration manager is alive. This usually means that the manager which served this widget has gone offline.": "Error checking if the integration manager is alive. This usually means that the manager which served this widget has gone offline.", - "You're all set! Click the button below to re-run the test.": "You're all set! Click the button below to re-run the test.", - "Error contacting homeserver. This usually means your federation setup is incorrect, or your homeserver is offline. Consult your homeserver's documentation for how to set up federation.": "Error contacting homeserver. This usually means your federation setup is incorrect, or your homeserver is offline. Consult your homeserver's documentation for how to set up federation.", - "Checking client version...": "Checking client version...", - "Your client is too old to use this widget, sorry": "Your client is too old to use this widget, sorry", - "Please accept the prompt to verify your identity": "Please accept the prompt to verify your identity", - "Error loading policy": "Error loading policy", - "The location of": "The location of", - "differs depending on whether the": "differs depending on whether the", - "or": "or", - "version of Element is used.": "version of Element is used." -} + "Dashboard": "Dashboard", + "Widgets": "Widgets", + "go-neb": "go-neb", + "Custom Bots": "Custom Bots", + "Bridges": "Bridges", + "Sticker Packs": "Sticker Packs", + "Terms of Service": "Terms of Service", + "Bridges provide a way for rooms to interact with and/or bring in events from a third party network. For example, an IRC bridge can allow IRC and matrix users to communicate with each other.": "Bridges provide a way for rooms to interact with and/or bring in events from a third party network. For example, an IRC bridge can allow IRC and matrix users to communicate with each other.", + "Name": "Name", + "Description": "Description", + "Actions": "Actions", + "No bridges.": "No bridges.", + "matrix-hookshot": "matrix-hookshot", + "is a multi-purpose bridge which supports Github as an integration. If enabled in the configuration, it can be used here to offer a UI for setting up a room to pipe to a repository.": "is a multi-purpose bridge which supports Github as an integration. If enabled in the configuration, it can be used here to offer a UI for setting up a room to pipe to a repository.", + "No bridge configurations.": "No bridge configurations.", + "Add self-hosted bridge": "Add self-hosted bridge", + "self-hosted Github bridge": "self-hosted Github bridge", + "Self-hosted Github bridges must have": "Self-hosted Github bridges must have", + "provisioning": "provisioning", + "enabled in the configuration.": "enabled in the configuration.", + "Provisioning URL": "Provisioning URL", + "The provisioning URL for the bridge. This is the specific address for the bridge given in the configuration.": "The provisioning URL for the bridge. This is the specific address for the bridge given in the configuration.", + "Shared Secret": "Shared Secret", + "The shared secret defined in the configuration for provisioning.": "The shared secret defined in the configuration for provisioning.", + "Save": "Save", + "Cancel": "Cancel", + "Add a new self-hosted IRC Bridge": "Add a new self-hosted IRC Bridge", + "Self-hosted IRC bridges must have": "Self-hosted IRC bridges must have", + "The provisioning URL for the bridge. This is usually the same as the URL given in the registration. This API is not authenticated and should be treated with caution.": "The provisioning URL for the bridge. This is usually the same as the URL given in the registration. This API is not authenticated and should be treated with caution.", + "matrix-appservice-irc": "matrix-appservice-irc", + "is an IRC bridge that supports multiple IRC networks. Dimension is capable of using multiple IRC bridges to better distribute the load across multiple networks in large deployments.": "is an IRC bridge that supports multiple IRC networks. Dimension is capable of using multiple IRC bridges to better distribute the load across multiple networks in large deployments.", + "Enabled Networks": "Enabled Networks", + "This bridge is offline or unavailable.": "This bridge is offline or unavailable.", + "Add matrix.org's bridge": "Add matrix.org's bridge", + "Network": "Network", + "Enabled": "Enabled", + "Close": "Close", + "self-hosted Slack bridge": "self-hosted Slack bridge", + "Self-hosted Slack bridges already have provisioning enabled. Be careful not to expose the API to the public internet.": "Self-hosted Slack bridges already have provisioning enabled. Be careful not to expose the API to the public internet.", + "The provisioning URL for the bridge. This is usually the same as the URL your homeserver uses to communicate with the bridge.": "The provisioning URL for the bridge. This is usually the same as the URL your homeserver uses to communicate with the bridge.", + "matrix-appservice-slack": "matrix-appservice-slack", + "is a Slack bridge that supports bridging Slack channels to Matrix. Users authorize the bridge to access their Slack workspaces and from there they can pick the channels they'd like to bridge.": "is a Slack bridge that supports bridging Slack channels to Matrix. Users authorize the bridge to access their Slack workspaces and from there they can pick the channels they'd like to bridge.", + "self-hosted Telegram bridge": "self-hosted Telegram bridge", + "Self-hosted Telegram bridges must have": "Self-hosted Telegram bridges must have", + "The provisioning URL for the bridge. This is the public address for the bridge followed by the provisioning prefix given in the configuration.": "The provisioning URL for the bridge. This is the public address for the bridge followed by the provisioning prefix given in the configuration.", + "Promote Telegram Puppeting": "Promote Telegram Puppeting", + "If enabled, Dimension will recommend that users log in to their Telegram accounts.": "If enabled, Dimension will recommend that users log in to their Telegram accounts.", + "Promote Matrix Puppeting": "Promote Matrix Puppeting", + "If enabled, Dimension will recommend that users log in to their Matrix accounts.": "If enabled, Dimension will recommend that users log in to their Matrix accounts.", + "mautrix-telegram": "mautrix-telegram", + "is a Telegram bridge that supports bridging channels/supergroups to Matrix. This can be done through a 'relay bot' (all Matrix users are represented through a single bot in Telegram) or by making use of a user's real Telegram account (known as 'puppeting'). Currently only one Telegram bridge can be configured at a time.": "is a Telegram bridge that supports bridging channels/supergroups to Matrix. This can be done through a 'relay bot' (all Matrix users are represented through a single bot in Telegram) or by making use of a user's real Telegram account (known as 'puppeting'). Currently only one Telegram bridge can be configured at a time.", + "Enabled Features": "Enabled Features", + "self-hosted webhook bridge": "self-hosted webhook bridge", + "Self-hosted webhook bridges must have": "Self-hosted webhook bridges must have", + "The public URL for the bridge.": "The public URL for the bridge.", + "The provisioning secret defined in the configuration.": "The provisioning secret defined in the configuration.", + "matrix-appservice-webhooks": "matrix-appservice-webhooks", + "provides Slack-compatible webhooks for Matrix, making it easy to send updates into a room.": "provides Slack-compatible webhooks for Matrix, making it easy to send updates into a room.", + "custom bot": "custom bot", + "The user ID that Dimension will invite to rooms.": "The user ID that Dimension will invite to rooms.", + "A few words here will help people understand what the bot does.": "A few words here will help people understand what the bot does.", + "Display Name": "Display Name", + "This is the name Dimension will use to tell users which bot this is.": "This is the name Dimension will use to tell users which bot this is.", + "This can either be an MXC URI or a plain URL.": "This can either be an MXC URI or a plain URL.", + "This is used by Dimension to force the bot to leave the room when the user removes the bot.": "This is used by Dimension to force the bot to leave the room when the user removes the bot.", + "Learn more about access tokens.": "Learn more about access tokens.", + "Custom bots give you the ability to add your own bots to Dimension for users to add to their rooms. These bots can't have any configuration to them and must be able to accept room invites on their own. All Dimension will do when a user wants to add the bot is invite it to the room.": "Custom bots give you the ability to add your own bots to Dimension for users to add to their rooms. These bots can't have any configuration to them and must be able to accept room invites on their own. All Dimension will do when a user wants to add the bot is invite it to the room.", + "No custom bots.": "No custom bots.", + "Add custom bot": "Add custom bot", + "Custom bots": "Custom bots", + "Parts of your configuration are displayed below. To change these values, edit your configuration and restart Dimension.": "Parts of your configuration are displayed below. To change these values, edit your configuration and restart Dimension.", + "Administrators": "Administrators", + "Widget Blacklist": "Widget Blacklist", + "Homeserver": "Homeserver", + "Federation URL": "Federation URL", + "Federation Hostname": "Federation Hostname", + "Client/Server URL": "Client/Server URL", + "Utility User ID": "Utility User ID", + "Sessions": "Sessions", + "Tokens registered": "Tokens registered", + "Logout Everyone": "Logout Everyone", + "Configuration": "Configuration", + "Logout confirmation": "Logout confirmation", + "Logging everyone out will disable all known login tokens for Dimension and upstream integration managers. Most clients will automatically re-register for a login token behind the scenes, similar to how a login token was first acquired.": "Logging everyone out will disable all known login tokens for Dimension and upstream integration managers. Most clients will automatically re-register for a login token behind the scenes, similar to how a login token was first acquired.", + "Self-hosted go-neb instances are powered by application services installed on your homeserver. The application service is responsible for creating the bots dynamically.": "Self-hosted go-neb instances are powered by application services installed on your homeserver. The application service is responsible for creating the bots dynamically.", + "User Prefix": "User Prefix", + "This is the prefix used for all bot users.": "This is the prefix used for all bot users.", + "API URL": "API URL", + "The admin/api url for go-neb. Be sure to not expose the admin API to the outside world because this endpoint is not authenticated.": "The admin/api url for go-neb. Be sure to not expose the admin API to the outside world because this endpoint is not authenticated.", + "New self-hosted go-neb": "New self-hosted go-neb", + "go-neb appservice configuration": "go-neb appservice configuration", + "Copy and paste this configuration to": "Copy and paste this configuration to", + "on your homeserver and register it as an application service.": "on your homeserver and register it as an application service.", + "Test Configuration": "Test Configuration", + "Giphy Configuration": "Giphy Configuration", + "Api Key": "Api Key", + "The API key from": "The API key from", + "Image Size": "Image Size", + "GIFs can be large, and sometimes it is more desirable to have them downsized.": "GIFs can be large, and sometimes it is more desirable to have them downsized.", + "Use downsized images": "Use downsized images", + "Google Configuration": "Google Configuration", + "The API key for your Google Application.": "The API key for your Google Application.", + "Search Engine ID": "Search Engine ID", + "The search engine ID": "The search engine ID", + "Guggy Configuration": "Guggy Configuration", + "The API key for": "The API key for", + "Imgur Configuration": "Imgur Configuration", + "Client ID": "Client ID", + "The client ID of your": "The client ID of your", + "Imgur Application": "Imgur Application", + "Client Secret": "Client Secret", + "The client secret of your": "The client secret of your", + "go-neb supports many different types of bots, each of which is listed below. Here you can configure which bots this go-neb instance should use.": "go-neb supports many different types of bots, each of which is listed below. Here you can configure which bots this go-neb instance should use.", + "is a multi-purpose bot that can provide various services, such as reaction GIFs and Github notifications. There are two options for go-neb support in Dimension: using matrix.org's or self-hosting it. Each go-neb instance can have multiple services associated with it (ie: one go-neb here can do everything).": "is a multi-purpose bot that can provide various services, such as reaction GIFs and Github notifications. There are two options for go-neb support in Dimension: using matrix.org's or self-hosting it. Each go-neb instance can have multiple services associated with it (ie: one go-neb here can do everything).", + "Enabled Bots": "Enabled Bots", + "No go-neb configurations.": "No go-neb configurations.", + "Add matrix.org's go-neb": "Add matrix.org's go-neb", + "Add self-hosted go-neb": "Add self-hosted go-neb", + "go-neb configurations": "go-neb configurations", + "Sticker packs provide a way to convey memes or feelings to others in a room. From here you're able to select which sticker packs users of this Dimension instance can use. If no sticker packs are enabled then the 'sticker picker' widget will be disabled.": "Sticker packs provide a way to convey memes or feelings to others in a room. From here you're able to select which sticker packs users of this Dimension instance can use. If no sticker packs are enabled then the 'sticker picker' widget will be disabled.", + "Import from Telegram": "Import from Telegram", + "Author": "Author", + "License": "License", + "No sticker packs installed.": "No sticker packs installed.", + "Dimension": "Dimension", + "version": "version", + "The translated name of your policy": "The translated name of your policy", + "Policy text": "Policy text", + "This is where you put your policy's content.": "This is where you put your policy's content.", + "Create draft": "Create draft", + "Save draft": "Save draft", + "Publish": "Publish", + "Publish policy": "Publish policy", + "Version number": "Version number", + "The version number of this policy": "The version number of this policy", + "Before users can use Dimension they must agree to the terms of service for using your instance. If you're using any matrix.org bridges, users will be required to accept the terms of service for your upstream integration managers (scalar.vector.im usually) in addition to the terms you add here.": "Before users can use Dimension they must agree to the terms of service for using your instance. If you're using any matrix.org bridges, users will be required to accept the terms of service for your upstream integration managers (scalar.vector.im usually) in addition to the terms you add here.", + "Policy Name": "Policy Name", + "Version": "Version", + "No policies written.": "No policies written.", + "New draft policy": "New draft policy", + "Etherpad Widget Configuration": "Etherpad Widget Configuration", + "Default Pad URL Template": "Default Pad URL Template", + "$padName and $roomId will be replaced during creation to help create a unique pad URL.": "$padName and $roomId will be replaced during creation to help create a unique pad URL.", + "Jitsi Widget Configuration": "Jitsi Widget Configuration", + "Jitsi Domain": "Jitsi Domain", + "This is the domain that is used to host the conference.": "This is the domain that is used to host the conference.", + "Use this domain as the default conference domain": "Use this domain as the default conference domain", + "Some clients can create widgets that are not compatible with Dimension, making Dimension use jitsi.riot.im by default. By enabling this option, you'll force Dimension to use your Jitsi domain at risk of having clients not respect it.": "Some clients can create widgets that are not compatible with Dimension, making Dimension use jitsi.riot.im by default. By enabling this option, you'll force Dimension to use your Jitsi domain at risk of having clients not respect it.", + "Jitsi Script URL": "Jitsi Script URL", + "This is used to create the Jitsi widget. It is normally at /libs/external_api.min.js from your domain.": "This is used to create the Jitsi widget. It is normally at /libs/external_api.min.js from your domain.", + "Widgets are small webpages that can be embedded in a Matrix room. Here you can configure which widgets Dimension will offer to users.": "Widgets are small webpages that can be embedded in a Matrix room. Here you can configure which widgets Dimension will offer to users.", + "Bridge to Github": "Bridge to Github", + "In order to bridge to Github, you'll need to authorize the bridge to access your organization(s). Please click the button below to do so.": "In order to bridge to Github, you'll need to authorize the bridge to access your organization(s). Please click the button below to do so.", + "Organization": "Organization", + "Repository": "Repository", + "Add an IRC channel": "Add an IRC channel", + "Bridging a channel requires authorization from a channel operator. When entering a channel below, a bot will join the channel to ensure it exists and has operators available.": "Bridging a channel requires authorization from a channel operator. When entering a channel below, a bot will join the channel to ensure it exists and has operators available.", + "Channel Name": "Channel Name", + "Next": "Next", + "Operator": "Operator", + "The person selected here will be asked to approve or deny the bridge request.": "The person selected here will be asked to approve or deny the bridge request.", + "Request Bridge": "Request Bridge", + "IRC Networks": "IRC Networks", + "Channel": "Channel", + "No bridged channels": "No bridged channels", + "Remove": "Remove", + "Bridge to Slack": "Bridge to Slack", + "This room is bridged to Slack using webhooks. Webhook bridging is legacy and doesn't support as rich bridging as the new approach. It is recommended to re-create the bridge with the new process.": "This room is bridged to Slack using webhooks. Webhook bridging is legacy and doesn't support as rich bridging as the new approach. It is recommended to re-create the bridge with the new process.", + "Unbridge": "Unbridge", + "In order to bridge Slack channels, you'll need to authorize the bridge to access your teams and channels. Please click the button below to do so.": "In order to bridge Slack channels, you'll need to authorize the bridge to access your teams and channels. Please click the button below to do so.", + "Team": "Team", + "Telegram chat is already bridged": "Telegram chat is already bridged", + "You have the appropriate permissions to be able to unbridge the chat, however. Would you like to unbridge the other room and instead bridge it here?": "You have the appropriate permissions to be able to unbridge the chat, however. Would you like to unbridge the other room and instead bridge it here?", + "Unbridge and continue": "Unbridge and continue", + "No, don't bridge": "No, don't bridge", + "That Telegram chat is bridged to another Matrix room and cannot be bridged here. Unfortunately, you do not have the required permissions to be able to unbridge the other room.": "That Telegram chat is bridged to another Matrix room and cannot be bridged here. Unfortunately, you do not have the required permissions to be able to unbridge the other room.", + "Bridge to Telegram": "Bridge to Telegram", + "This room is bridged to on Telegram": "This room is bridged to on Telegram", + "on Telegram": "on Telegram", + "You do not have the necessary permissions in this room to unbridge the channel.": "You do not have the necessary permissions in this room to unbridge the channel.", + "After inviting": "After inviting", + "to your Telegram chat, run the command": "to your Telegram chat, run the command", + "in the Telegram room to get the chat ID.": "in the Telegram room to get the chat ID.", + "Add a new webhook": "Add a new webhook", + "Webhook Name": "Webhook Name", + "Create": "Create", + "Type": "Type", + "No webhooks": "No webhooks", + "No name": "No name", + "Delete": "Delete", + "Feeds": "Feeds", + "Added by": "Added by", + "Add": "Add", + ".travis.yml configuration and template information": ".travis.yml configuration and template information", + "The following section needs to be added to your": "The following section needs to be added to your", + "file in your repositories:": "file in your repositories:", + "The following variables can be used in your template. This template is used to post a message to theroom when your webhook is activated.": "The following variables can be used in your template. This template is used to post a message to theroom when your webhook is activated.", + "The repository identifier": "The repository identifier", + "The repository name": "The repository name", + "The build number": "The build number", + "The build ID": "The build ID", + "The branch name": "The branch name", + "A short version of the commit SHA": "A short version of the commit SHA", + "The first line of the commit message": "The first line of the commit message", + "The full commit message": "The full commit message", + "The author of the commit": "The author of the commit", + "The result of the build": "The result of the build", + "The message from Travis CI about the build": "The message from Travis CI about the build", + "The total duration of all builds in the matrix": "The total duration of all builds in the matrix", + "The time it took to run the build": "The time it took to run the build", + "A URL to see the changes which triggered the build": "A URL to see the changes which triggered the build", + "A URL to see the build information": "A URL to see the build information", + "Repositories": "Repositories", + "Template": "Template", + "Sticker packs are not enabled on this Dimension instance.": "Sticker packs are not enabled on this Dimension instance.", + "Start a conversation with": "Start a conversation with", + "to create your own stickerpack.": "to create your own stickerpack.", + "Add stickerpack": "Add stickerpack", + "Created by": "Created by", + "under": "under", + "BigBlueButton Meeting URL": "BigBlueButton Meeting URL", + "Add Widget": "Add Widget", + "Save Widget": "Save Widget", + "Remove Widget": "Remove Widget", + "Widget Name": "Widget Name", + "Widget URL": "Widget URL", + "Pad Name": "Pad Name", + "Pad URL": "Pad URL", + "Shared Calendar ID": "Shared Calendar ID", + "Document URL": "Document URL", + "Grafana URL": "Grafana URL", + "To get a URL, go to Grafana and click 'share' on a graph.": "To get a URL, go to Grafana and click 'share' on a graph.", + "Conference URL": "Conference URL", + " Spotify URI": " Spotify URI", + "Click 'share' from your favourite playlist, artist, track, or album and paste the Spotify URI here.": "Click 'share' from your favourite playlist, artist, track, or album and paste the Spotify URI here.", + "Trading Pair": "Trading Pair", + "Interval": "Interval", + "Whiteboard Name": "Whiteboard Name", + "Whiteboard URL": "Whiteboard URL", + "Video URL": "Video URL", + "An open source integration manager for Matrix": "An open source integration manager for Matrix", + "Self-host your favourite bots, bridges, and widgets.": "Self-host your favourite bots, bridges, and widgets.", + "source": "source", + "Try it out or": "Try it out or", + "run your own": "run your own", + "Visit": "Visit", + "and log in with your Matrix account or point your Element": "and log in with your Matrix account or point your Element", + "at our servers:": "at our servers:", + "Add utility for everyone in your room by embedding an application.": "Add utility for everyone in your room by embedding an application.", + "Notes": "Notes", + "Google Calendar": "Google Calendar", + "Custom Widget": "Custom Widget", + "Bots bring entertainment or productivity to the room. They're here to help at your command.": "Bots bring entertainment or productivity to the room. They're here to help at your command.", + "Guggy": "Guggy", + "Giphy": "Giphy", + "Imgur": "Imgur", + "Google Image Search": "Google Image Search", + "Wikipedia": "Wikipedia", + "Travis CI": "Travis CI", + "RSS Notifications": "RSS Notifications", + "Echo": "Echo", + "Bring the outside world into your room with bridges.": "Bring the outside world into your room with bridges.", + "Stickers": "Stickers", + "Have some fun and post a sticker.": "Have some fun and post a sticker.", + "Huskies": "Huskies", + "Cats": "Cats", + "Cat Faces": "Cat Faces", + "Loading Artist": "Loading Artist", + "source on GitHub": "source on GitHub", + "Welcome to Dimension!": "Welcome to Dimension!", + "Join": "Join", + "for news and updates. Don't forget to star the repository on": "for news and updates. Don't forget to star the repository on", + "Here's the configuration options you'll need to update in your Element": "Here's the configuration options you'll need to update in your Element", + "The location of": "The location of", + "differs depending on whether the": "differs depending on whether the", + "or": "or", + "version of Element is used.": "version of Element is used.", + "Configuring integrations": "Configuring integrations", + "If everything is set up correctly, you'll be able to access the admin area of Dimension by clicking the 3x3 grid in the top right of any room in Element. The gear icon": "If everything is set up correctly, you'll be able to access the admin area of Dimension by clicking the 3x3 grid in the top right of any room in Element. The gear icon", + "in the top right is where you can configure your bots, bridges, and widgets.": "in the top right is where you can configure your bots, bridges, and widgets.", + "Could not connect to integrations server error": "Could not connect to integrations server error", + "When Element cannot reach Dimension or Dimension is unable to reach your homeserver an error saying 'Could not contact integrations server' shows up in every room. Before visiting us in": "When Element cannot reach Dimension or Dimension is unable to reach your homeserver an error saying 'Could not contact integrations server' shows up in every room. Before visiting us in", + "on Matrix, here's a few things to check:": "on Matrix, here's a few things to check:", + "Verify the homeserver configuration in Dimension.": "Verify the homeserver configuration in Dimension.", + "The name, client/server URL, and access token all need to be valid and directed at your homeserver.": "The name, client/server URL, and access token all need to be valid and directed at your homeserver.", + "Verify federation is enabled on your homeserver.": "Verify federation is enabled on your homeserver.", + "Even in a private, or non-federated, environment federation needs to be enabled so Dimension can work correctly. Dimension should still work okay if federation on your homeserver is bound to a private interface instead of being public - just be sure to set the federation URL in your configuration.": "Even in a private, or non-federated, environment federation needs to be enabled so Dimension can work correctly. Dimension should still work okay if federation on your homeserver is bound to a private interface instead of being public - just be sure to set the federation URL in your configuration.", + "Verify that federation is working on your homeserver.": "Verify that federation is working on your homeserver.", + "Using tools like the": "Using tools like the", + "federation tester": "federation tester", + ", make sure that federation is working on your homeserver.": ", make sure that federation is working on your homeserver.", + "Looking for your sticker packs?": "Looking for your sticker packs?", + "Click here": "Click here", + "This room is encrypted": "This room is encrypted", + "Integrations are not encrypted!": "Integrations are not encrypted!", + "This means that some information about yourself and the room may be leaked to the bot, bridge, or widget. This information includes the room ID, your display name, your username, your avatar, information about Element, and other similar details. Add integrations with caution.": "This means that some information about yourself and the room may be leaked to the bot, bridge, or widget. This information includes the room ID, your display name, your username, your avatar, information about Element, and other similar details. Add integrations with caution.", + "There are currently no integrations which support encrypted rooms. Sorry about that!": "There are currently no integrations which support encrypted rooms. Sorry about that!", + "No integrations available": "No integrations available", + "This room does not have any compatible integrations. Please contact the server owner if you're seeing this message.": "This room does not have any compatible integrations. Please contact the server owner if you're seeing this message.", + "BigBlueButton Conference": "BigBlueButton Conference", + "Join Conference": "Join Conference", + "Sorry, this content cannot be embedded": "Sorry, this content cannot be embedded", + "Start camera:": "Start camera:", + "You": "You", + "Integrations": "Integrations", + "Your client is too old to use this widget. Try upgrading your client to the latest available version, or contact the author to try and diagnose the problem. Your client needs to support OpenID information exchange.": "Your client is too old to use this widget. Try upgrading your client to the latest available version, or contact the author to try and diagnose the problem. Your client needs to support OpenID information exchange.", + "Check connection": "Check connection", + "Click to start OpenID auth": "Click to start OpenID auth", + "User ID:": "User ID:", + "You have blocked this widget from receiving credentials.": "You have blocked this widget from receiving credentials.", + "An error has occurred - see logs for details": "An error has occurred - see logs for details", + "There was a problem authenticating your use of this sticker picker. Please make sure you're using a client that has Dimension enabled and correctly set up.": "There was a problem authenticating your use of this sticker picker. Please make sure you're using a client that has Dimension enabled and correctly set up.", + "You have no sticker packs.": "You have no sticker packs.", + "Add some stickers": "Add some stickers", + "Failed to load bridges": "Failed to load bridges", + "Error loading bridges": "Error loading bridges", + "Failed to get an updated Github bridge list": "Failed to get an updated Github bridge list", + "Github bridge added": "Github bridge added", + "Failed to create Github bridge": "Failed to create Github bridge", + "Github bridge updated": "Github bridge updated", + "Failed to update Github bridge": "Failed to update Github bridge", + "IRC Bridge added": "IRC Bridge added", + "Failed to create IRC bridge": "Failed to create IRC bridge", + "Click the pencil icon to enable networks.": "Click the pencil icon to enable networks.", + "matrix.org's IRC bridge added": "matrix.org's IRC bridge added", + "Error adding matrix.org's IRC Bridge": "Error adding matrix.org's IRC Bridge", + "Error creating matrix.org's IRC Bridge": "Error creating matrix.org's IRC Bridge", + "Failed to get an update IRC bridge list": "Failed to get an update IRC bridge list", + "disabled": "disabled", + "Failed to update network": "Failed to update network", + "Slack bridge added": "Slack bridge added", + "Failed to create Slack bridge": "Failed to create Slack bridge", + "Slack bridge updated": "Slack bridge updated", + "Failed to update Slack bridge": "Failed to update Slack bridge", + "matrix.org's Slack bridge added": "matrix.org's Slack bridge added", + "Error adding matrix.org's Slack Bridge": "Error adding matrix.org's Slack Bridge", + "Error creating matrix.org's Slack Bridge": "Error creating matrix.org's Slack Bridge", + "Failed to get an update Slack bridge list": "Failed to get an update Slack bridge list", + "Telegram bridge added": "Telegram bridge added", + "Failed to create Telegram bridge": "Failed to create Telegram bridge", + "Telegram bridge updated": "Telegram bridge updated", + "Failed to update Telegram bridge": "Failed to update Telegram bridge", + "Failed to get an update Telegram bridge list": "Failed to get an update Telegram bridge list", + "Webhook bridge added": "Webhook bridge added", + "Failed to create Webhook bridge": "Failed to create Webhook bridge", + "Webhook bridge updated": "Webhook bridge updated", + "Failed to update Webhook bridge": "Failed to update Webhook bridge", + "Failed to get an update Webhooks bridge list": "Failed to get an update Webhooks bridge list", + "Please enter a name for the bot": "Please enter a name for the bot", + "Please enter an avatar URL for the bot": "Please enter an avatar URL for the bot", + "Please enter a user ID for the bot": "Please enter a user ID for the bot", + "Please enter a description for the bot": "Please enter a description for the bot", + "Please enter an access token for the bot": "Please enter an access token for the bot", + "Bot updated": "Bot updated", + "Error updating bot": "Error updating bot", + "Error loading go-neb configuration": "Error loading go-neb configuration", + "Failed to get an updated bot list": "Failed to get an updated bot list", + "Everyone has been logged out": "Everyone has been logged out", + "Error logging everyone out": "Error logging everyone out", + "New go-neb created": "New go-neb created", + "Error creating appservice": "Error creating appservice", + "Could not load appservice configuration": "Could not load appservice configuration", + "The appservice appears to be correctly set up": "The appservice appears to be correctly set up", + "The appservice is not correctly set up": "The appservice is not correctly set up", + "Error loading configuration": "Error loading configuration", + "Configuration updated": "Configuration updated", + "Error updating integration": "Error updating integration", + "Integration updated": "Integration updated", + "Failed to configure the integration": "Failed to configure the integration", + "Manual troubleshooting may be requred": "Manual troubleshooting may be requred", + "Could not get go-neb configuration": "Could not get go-neb configuration", + "matrix.org's go-neb added": "matrix.org's go-neb added", + "Click the pencil icon to enable the bots.": "Click the pencil icon to enable the bots.", + "Error adding matrix.org's go-neb": "Error adding matrix.org's go-neb", + "Error creating matrix.org go-neb": "Error creating matrix.org go-neb", + "Failed to load sticker packs": "Failed to load sticker packs", + "Sticker pack updated": "Sticker pack updated", + "Error updating sticker pack": "Error updating sticker pack", + "Telegram sticker pack imported": "Telegram sticker pack imported", + "Error importing sticker pack": "Error importing sticker pack", + "Failed to load policy": "Failed to load policy", + "Failed to load policies": "Failed to load policies", + "Policy published": "Policy published", + "Error publishing policy": "Error publishing policy", + "Please enter a name for all policies": "Please enter a name for all policies", + "Please enter text for all policies": "Please enter text for all policies", + "Draft saved": "Draft saved", + "Error saving policy": "Error saving policy", + "Draft created": "Draft created", + "Error creating document": "Error creating document", + "Please enter a version number": "Please enter a version number", + "Widget updated": "Widget updated", + "Error updating widget": "Error updating widget", + "Failed to load widgets": "Failed to load widgets", + "Error opening configuration page": "Error opening configuration page", + "Failed to load configuration": "Failed to load configuration", + "Error updating configuration": "Error updating configuration", + "Error inviting bridge": "Error inviting bridge", + "Bridge requested": "Bridge requested", + "Error requesting bridge": "Error requesting bridge", + "Bridge removed": "Bridge removed", + "Error removing bridge": "Error removing bridge", + "Please enter a channel name": "Please enter a channel name", + "Error loading channel operators": "Error loading channel operators", + "Failed to make the bridge an administrator": "Failed to make the bridge an administrator", + "Please ensure you are an 'Admin' for the room": "Please ensure you are an 'Admin' for the room", + "Link requested!": "Link requested!", + "The operator selected will have to approve the bridge for it to work": "The operator selected will have to approve the bridge for it to work", + "Failed to request a link": "Failed to request a link", + "Link removed": "Link removed", + "Failed to remove link": "Failed to remove link", + "Error getting Slack authorization information": "Error getting Slack authorization information", + "Error getting teams": "Error getting teams", + "Error getting channels for team": "Error getting channels for team", + "Bridge updated": "Bridge updated", + "Webhook created": "Webhook created", + "Error creating webhook": "Error creating webhook", + "Webhook deleted": "Webhook deleted", + "Error deleting webhook": "Error deleting webhook", + "Please enter a feed URL": "Please enter a feed URL", + "Please enter a repository": "Please enter a repository", + "was invited to the room": "was invited to the room", + "was removed from the room": "was removed from the room", + "Could not update integration status": "Could not update integration status", + "Stickerpack added": "Stickerpack added", + "Error adding stickerpack": "Error adding stickerpack", + "Stickers updated": "Stickers updated", + "Error updating stickers": "Error updating stickers", + "Please enter a URL for the widget": "Please enter a URL for the widget", + "Widget added!": "Widget added!", + "Widget updated!": "Widget updated!", + "Widget deleted!": "Widget deleted!", + "Please enter a video URL": "Please enter a video URL", + "Please enter a YouTube, Vimeo, or DailyMotion video URL": "Please enter a YouTube, Vimeo, or DailyMotion video URL", + "Unable to load Dimension - missing room ID or token.": "Unable to load Dimension - missing room ID or token.", + "Could not verify your token. Please try logging out of Element and back in. Be sure to back up your encryption keys!": "Could not verify your token. Please try logging out of Element and back in. Be sure to back up your encryption keys!", + "Unable to communicate with Dimension due to an unknown error.": "Unable to communicate with Dimension due to an unknown error.", + "You do not appear to have permission to modify widgets in this room": "You do not appear to have permission to modify widgets in this room", + "Unable to set up Dimension. This version of Element may not supported or there may be a problem with the server.": "Unable to set up Dimension. This version of Element may not supported or there may be a problem with the server.", + "This integration is offline or unavailable": "This integration is offline or unavailable", + "Could not communicate with Element": "Could not communicate with Element", + "You cannot modify widgets in this room": "You cannot modify widgets in this room", + "Error communicating with Element": "Error communicating with Element", + "Expected to not be able to send specific event types": "Expected to not be able to send specific event types", + "Expected to be able to send specific event types": "Expected to be able to send specific event types", + "Requirement": "Requirement", + "not found": "not found", + "Failed to take screenshot: iframe not supported": "Failed to take screenshot: iframe not supported", + "Failed to take screenshot": "Failed to take screenshot", + "Click the button to test your connection. This may cause your client to ask if it is okay to share your identity with the widget - this is required to test your connection to your homeserver.": "Click the button to test your connection. This may cause your client to ask if it is okay to share your identity with the widget - this is required to test your connection to your homeserver.", + "Please accept the prompt to verify your identity.": "Please accept the prompt to verify your identity.", + "You have blocked this widget from verifying your identity.": "You have blocked this widget from verifying your identity.", + "Checking connectivity to integration manager...": "Checking connectivity to integration manager...", + "Checking connectivity to homeserver...": "Checking connectivity to homeserver...", + "Error checking if the integration manager is alive. This usually means that the manager which served this widget has gone offline.": "Error checking if the integration manager is alive. This usually means that the manager which served this widget has gone offline.", + "You're all set! Click the button below to re-run the test.": "You're all set! Click the button below to re-run the test.", + "Error contacting homeserver. This usually means your federation setup is incorrect, or your homeserver is offline. Consult your homeserver's documentation for how to set up federation.": "Error contacting homeserver. This usually means your federation setup is incorrect, or your homeserver is offline. Consult your homeserver's documentation for how to set up federation.", + "Checking client version...": "Checking client version...", + "Your client is too old to use this widget, sorry": "Your client is too old to use this widget, sorry", + "Please accept the prompt to verify your identity": "Please accept the prompt to verify your identity", + "Error loading policy": "Error loading policy" +} \ No newline at end of file