diff --git a/public/locales/en.json b/public/locales/en.json
index d360962d..b8be7e7b 100644
--- a/public/locales/en.json
+++ b/public/locales/en.json
@@ -607,5 +607,228 @@
"existing_space": "Existing Space",
"add_room": "Add Room",
"existing_room": "Existing Room"
+ },
+
+ "RoomSettings": {
+ "general": "General",
+ "members": "Members",
+ "permissions": "Permissions",
+ "emojis_stickers": "Emojis & Stickers",
+ "developer_tools": "Developer Tools",
+
+ "profile": "Profile",
+ "edit": "Edit",
+ "unknown": "Unknown",
+ "avatar": "Avatar",
+ "upload": "Upload",
+ "reset": "Reset",
+ "remove": "Remove",
+ "name": "Name",
+ "topic": "Topic",
+ "save": "Save",
+ "cancel": "Cancel",
+
+ "options": "Options",
+ "addresses": "Addresses",
+ "advanced_options": "Advanced Options",
+
+ "space_access": "Space Access",
+ "room_access": "Room Access",
+ "space_access_desc": "Change how people can join the space.",
+ "room_access_desc": "Change how people can join the room.",
+
+ "join_invite_only": "Invite Only",
+ "join_knock_invite": "Knock & Invite",
+ "join_space_members_or_knock": "Space Members or Knock",
+ "join_space_members": "Space Members",
+ "join_public": "Public",
+ "join_unsupported": "Unsupported",
+
+ "history_visibility": "Message History Visibility",
+ "history_visibility_desc": "Changes to history visibility will only apply to future messages and will not affect existing history.",
+ "visibility_after_invite": "After Invite",
+ "visibility_after_join": "After Join",
+ "visibility_all_messages": "All Messages",
+ "visibility_all_messages_guests": "All Messages (Guests)",
+
+ "room_encryption": "Room Encryption",
+ "encryption_enabled_desc": "Messages in this room are protected by end-to-end encryption.",
+ "encryption_disabled_desc": "Once enabled, encryption cannot be disabled!",
+ "enabled": "Enabled",
+ "enable": "Enable",
+ "enable_encryption": "Enable Encryption",
+ "enable_encryption_confirm": "Are you sure? Once enabled, encryption cannot be disabled!",
+ "enable_e2e_encryption": "Enable E2E Encryption",
+
+ "publish_to_directory": "Publish to Directory",
+ "publish_space_desc": "List the space in the public directory to make it discoverable by others.",
+ "publish_room_desc": "List the room in the public directory to make it discoverable by others.",
+
+ "published_addresses": "Published Addresses",
+ "published_addresses_desc": "If access is Public, Published addresses will be used to join by anyone.",
+ "no_addresses": "No Addresses",
+ "no_addresses_hint": "To publish an address, it needs to be set as a local address first",
+ "main": "Main",
+ "unset_main": "Unset Main",
+ "set_main": "Set Main",
+ "address_in_use": "Address is already in use!",
+ "published": "Published",
+ "unpublish": "Unpublish",
+ "publish": "Publish",
+ "delete": "Delete",
+ "selected_count": "{{count}} Selected",
+
+ "local_addresses": "Local Addresses",
+ "local_addresses_desc": "Set local address so users can join through your homeserver.",
+ "collapse": "Collapse",
+ "expand": "Expand",
+ "loading": "Loading...",
+
+ "space_upgrade": "Space Upgrade",
+ "room_upgrade": "Room Upgrade",
+ "upgrade": "Upgrade",
+ "action_irreversible": "This action is irreversible!",
+ "upgrade_space": "Upgrade Space",
+ "upgrade_room": "Upgrade Room",
+ "space_replaced": "This space has been replaced!",
+ "room_replaced": "This room has been replaced!",
+ "current_version": "Current version: {{version}}.",
+ "old_space": "Old Space",
+ "old_room": "Old Room",
+ "open_new_space": "Open New Space",
+ "open_new_room": "Open New Room",
+
+ "members_count": "{{count}} Members",
+ "search": "Search",
+ "no_results": "No Results",
+ "results_count": "{{count}} Results",
+ "scroll_to_top": "Scroll to Top",
+ "no_membership_members": "No \"{{filter}}\" Members",
+
+ "filter_joined": "Joined",
+ "filter_invited": "Invited",
+ "filter_left": "Left",
+ "filter_kicked": "Kicked",
+ "filter_banned": "Banned",
+
+ "sort_a_to_z": "A to Z",
+ "sort_z_to_a": "Z to A",
+ "sort_newest": "Newest",
+ "sort_oldest": "Oldest",
+
+ "perm_messages": "Messages",
+ "perm_send_messages": "Send Messages",
+ "perm_send_stickers": "Send Stickers",
+ "perm_send_reactions": "Send Reactions",
+ "perm_ping_room": "Ping @room",
+ "perm_pin_messages": "Pin Messages",
+ "perm_other_message_events": "Other Message Events",
+ "perm_calls": "Calls",
+ "perm_join_call": "Join Call",
+ "perm_moderation": "Moderation",
+ "perm_invite": "Invite",
+ "perm_kick": "Kick",
+ "perm_ban": "Ban",
+ "perm_delete_others_messages": "Delete Others' Messages",
+ "perm_delete_self_messages": "Delete Self Messages",
+ "perm_room_overview": "Room Overview",
+ "perm_room_avatar": "Room Avatar",
+ "perm_room_name": "Room Name",
+ "perm_room_topic": "Room Topic",
+ "perm_settings": "Settings",
+ "perm_change_room_access": "Change Room Access",
+ "perm_publish_address": "Publish Address",
+ "perm_change_all_permission": "Change All Permissions",
+ "perm_edit_power_levels": "Edit Power Levels",
+ "perm_enable_encryption": "Enable Encryption",
+ "perm_history_visibility": "History Visibility",
+ "perm_upgrade_room": "Upgrade Room",
+ "perm_other_settings": "Other Settings",
+ "perm_other": "Other",
+ "perm_manage_emojis_stickers": "Manage Emojis & Stickers",
+ "perm_change_server_acls": "Change Server ACLs",
+ "perm_modify_widgets": "Modify Widgets",
+
+ "founders": "Founders",
+ "founders_desc": "Founding members have all permissions and can only be changed during a room upgrade.",
+ "power_levels": "Power Levels",
+ "power_levels_desc": "Manage and customize incremental power levels for users.",
+
+ "new_power_level": "New Power Level",
+ "new_power_level_desc": "Create a new power level.",
+ "power_level_placeholder": "Bot",
+ "create": "Create",
+ "color": "Color",
+ "pick": "Pick",
+ "power": "Power",
+ "icon": "Icon",
+ "import": "Import",
+ "undo": "Undo",
+ "used_power_level": "Used Power Level",
+ "used_power_level_desc": "You have to remove its use before you can delete it.",
+ "changes_saved": "Changes saved! Apply when ready.",
+ "failed_to_apply": "Failed to apply changes! Please try again.",
+ "apply_changes": "Apply Changes",
+ "and_above": "& Above",
+
+ "users": "Users",
+ "default_power": "Default Power",
+ "default_power_desc": "Default power level for all users.",
+
+ "packs": "Packs",
+ "new_pack": "New Pack",
+ "new_pack_desc": "Add your own emoji and sticker pack to use in room.",
+ "no_packs": "No Packs",
+ "no_packs_desc": "There are no emoji or sticker packs to display at the moment.",
+ "view": "View",
+ "failed_to_remove_packs": "Failed to remove packs! Please try again.",
+ "delete_selected_packs": "Delete selected packs. ({{count}} selected)",
+
+ "enable_developer_tools": "Enable Developer Tools",
+ "room_id": "Room ID",
+ "room_id_desc": "Copy room ID to clipboard.",
+ "copy": "Copy",
+ "data": "Data",
+ "new_message_event": "New Message Event",
+ "new_message_event_desc": "Create and send a new message event within the room.",
+ "compose": "Compose",
+ "room_state": "Room State",
+ "room_state_desc": "State events of the room.",
+ "events": "Events",
+ "total": "Total: {{count}}",
+ "add_new": "Add New",
+ "default_key": "Default",
+ "account_data": "Account Data",
+ "account_data_desc": "Private personalization data stored within room.",
+ "state_event": "State Event",
+ "json_content": "JSON Content",
+ "state_event_type": "State Event Type",
+ "message_event_type": "Message Event Type",
+ "send": "Send",
+ "state_key_optional": "State Key (Optional)",
+
+ "pack": "Pack",
+ "images_usage": "Images Usage",
+ "images_usage_desc": "Select how the images are being used: as emojis, as stickers, or as both.",
+ "images": "Images",
+ "upload_images": "Upload Images",
+ "upload_images_desc": "Select images from your storage to upload them in pack.",
+ "select": "Select",
+ "pack_avatar": "Pack Avatar",
+ "attribution": "Attribution",
+ "shortcode": "Shortcode:",
+ "body": "Body:",
+ "usage_both": "Both",
+ "usage_sticker": "Sticker",
+ "usage_emoji": "Emoji",
+
+ "power_goku": "Goku",
+ "power_manager": "Manager",
+ "power_founder": "Founder",
+ "power_admin": "Admin",
+ "power_moderator": "Moderator",
+ "power_member": "Member",
+ "power_muted": "Muted",
+ "power_team": "Team"
}
}
diff --git a/public/locales/ru.json b/public/locales/ru.json
index 661e2cb1..7038ed20 100644
--- a/public/locales/ru.json
+++ b/public/locales/ru.json
@@ -609,5 +609,228 @@
"existing_space": "Существующее пространство",
"add_room": "Добавить комнату",
"existing_room": "Существующая комната"
+ },
+
+ "RoomSettings": {
+ "general": "Основные",
+ "members": "Участники",
+ "permissions": "Права доступа",
+ "emojis_stickers": "Эмодзи и стикеры",
+ "developer_tools": "Инструменты разработчика",
+
+ "profile": "Профиль",
+ "edit": "Редактировать",
+ "unknown": "Неизвестно",
+ "avatar": "Аватар",
+ "upload": "Загрузить",
+ "reset": "Сбросить",
+ "remove": "Удалить",
+ "name": "Название",
+ "topic": "Тема",
+ "save": "Сохранить",
+ "cancel": "Отмена",
+
+ "options": "Настройки",
+ "addresses": "Адреса",
+ "advanced_options": "Дополнительные настройки",
+
+ "space_access": "Доступ к пространству",
+ "room_access": "Доступ к комнате",
+ "space_access_desc": "Изменить способ вступления в пространство.",
+ "room_access_desc": "Изменить способ вступления в комнату.",
+
+ "join_invite_only": "Только по приглашению",
+ "join_knock_invite": "Запрос и приглашение",
+ "join_space_members_or_knock": "Участники пространства или запрос",
+ "join_space_members": "Участники пространства",
+ "join_public": "Публичный",
+ "join_unsupported": "Не поддерживается",
+
+ "history_visibility": "Видимость истории сообщений",
+ "history_visibility_desc": "Изменения видимости истории применяются только к новым сообщениям и не затрагивают существующую историю.",
+ "visibility_after_invite": "После приглашения",
+ "visibility_after_join": "После вступления",
+ "visibility_all_messages": "Все сообщения",
+ "visibility_all_messages_guests": "Все сообщения (гости)",
+
+ "room_encryption": "Шифрование комнаты",
+ "encryption_enabled_desc": "Сообщения в этой комнате защищены сквозным шифрованием.",
+ "encryption_disabled_desc": "После включения шифрование невозможно отключить!",
+ "enabled": "Включено",
+ "enable": "Включить",
+ "enable_encryption": "Включить шифрование",
+ "enable_encryption_confirm": "Вы уверены? После включения шифрование невозможно отключить!",
+ "enable_e2e_encryption": "Включить E2E-шифрование",
+
+ "publish_to_directory": "Показывать в поиске",
+ "publish_space_desc": "Сделать пространство видимым в общем списке, чтобы другие пользователи могли его найти.",
+ "publish_room_desc": "Сделать комнату видимой в общем списке, чтобы другие пользователи могли её найти.",
+
+ "published_addresses": "Опубликованные адреса",
+ "published_addresses_desc": "Если доступ публичный, опубликованные адреса будут использоваться для присоединения.",
+ "no_addresses": "Нет адресов",
+ "no_addresses_hint": "Чтобы опубликовать адрес, его сначала нужно задать как локальный",
+ "main": "Основной",
+ "unset_main": "Снять основной",
+ "set_main": "Сделать основным",
+ "address_in_use": "Адрес уже занят!",
+ "published": "Опубликован",
+ "unpublish": "Снять публикацию",
+ "publish": "Опубликовать",
+ "delete": "Удалить",
+ "selected_count": "Выбрано: {{count}}",
+
+ "local_addresses": "Локальные адреса",
+ "local_addresses_desc": "Задайте локальный адрес, чтобы пользователи могли присоединиться через ваш сервер.",
+ "collapse": "Свернуть",
+ "expand": "Развернуть",
+ "loading": "Загрузка...",
+
+ "space_upgrade": "Обновление пространства",
+ "room_upgrade": "Обновление комнаты",
+ "upgrade": "Обновить",
+ "action_irreversible": "Это действие необратимо!",
+ "upgrade_space": "Обновить пространство",
+ "upgrade_room": "Обновить комнату",
+ "space_replaced": "Это пространство было заменено!",
+ "room_replaced": "Эта комната была заменена!",
+ "current_version": "Текущая версия: {{version}}.",
+ "old_space": "Старое пространство",
+ "old_room": "Старая комната",
+ "open_new_space": "Открыть новое пространство",
+ "open_new_room": "Открыть новую комнату",
+
+ "members_count": "{{count}} участников",
+ "search": "Поиск",
+ "no_results": "Ничего не найдено",
+ "results_count": "{{count}} результатов",
+ "scroll_to_top": "Наверх",
+ "no_membership_members": "Нет участников «{{filter}}»",
+
+ "filter_joined": "Вступившие",
+ "filter_invited": "Приглашённые",
+ "filter_left": "Вышедшие",
+ "filter_kicked": "Исключённые",
+ "filter_banned": "Забаненные",
+
+ "sort_a_to_z": "А — Я",
+ "sort_z_to_a": "Я — А",
+ "sort_newest": "Новые",
+ "sort_oldest": "Старые",
+
+ "perm_messages": "Сообщения",
+ "perm_send_messages": "Отправка сообщений",
+ "perm_send_stickers": "Отправка стикеров",
+ "perm_send_reactions": "Отправка реакций",
+ "perm_ping_room": "Упоминание @room",
+ "perm_pin_messages": "Закрепление сообщений",
+ "perm_other_message_events": "Прочие события сообщений",
+ "perm_calls": "Звонки",
+ "perm_join_call": "Присоединиться к звонку",
+ "perm_moderation": "Модерация",
+ "perm_invite": "Приглашение",
+ "perm_kick": "Исключение",
+ "perm_ban": "Бан",
+ "perm_delete_others_messages": "Удаление чужих сообщений",
+ "perm_delete_self_messages": "Удаление своих сообщений",
+ "perm_room_overview": "Обзор комнаты",
+ "perm_room_avatar": "Аватар комнаты",
+ "perm_room_name": "Название комнаты",
+ "perm_room_topic": "Тема комнаты",
+ "perm_settings": "Настройки",
+ "perm_change_room_access": "Изменение доступа к комнате",
+ "perm_publish_address": "Публикация адреса",
+ "perm_change_all_permission": "Изменение всех прав",
+ "perm_edit_power_levels": "Редактирование уровней власти",
+ "perm_enable_encryption": "Включение шифрования",
+ "perm_history_visibility": "Видимость истории",
+ "perm_upgrade_room": "Обновление комнаты",
+ "perm_other_settings": "Прочие настройки",
+ "perm_other": "Прочее",
+ "perm_manage_emojis_stickers": "Управление эмодзи и стикерами",
+ "perm_change_server_acls": "Изменение ACL серверов",
+ "perm_modify_widgets": "Изменение виджетов",
+
+ "founders": "Основатели",
+ "founders_desc": "Основатели имеют все права. Изменить их состав можно только при обновлении комнаты.",
+ "power_levels": "Уровни власти",
+ "power_levels_desc": "Управление и настройка уровней власти для пользователей.",
+
+ "new_power_level": "Новый уровень власти",
+ "power_level_placeholder": "Бот",
+ "new_power_level_desc": "Создать новый уровень власти.",
+ "create": "Создать",
+ "color": "Цвет",
+ "pick": "Выбрать",
+ "power": "Уровень",
+ "icon": "Иконка",
+ "import": "Импорт",
+ "undo": "Отменить",
+ "used_power_level": "Используемый уровень власти",
+ "used_power_level_desc": "Необходимо убрать его использование, прежде чем удалить.",
+ "changes_saved": "Изменения сохранены! Примените, когда будете готовы.",
+ "failed_to_apply": "Не удалось применить изменения! Попробуйте ещё раз.",
+ "apply_changes": "Применить изменения",
+ "and_above": "и выше",
+
+ "users": "Пользователи",
+ "default_power": "Уровень по умолчанию",
+ "default_power_desc": "Уровень власти по умолчанию для всех пользователей.",
+
+ "packs": "Паки",
+ "new_pack": "Новый пак",
+ "new_pack_desc": "Добавьте свой пак эмодзи и стикеров для использования в комнате.",
+ "no_packs": "Нет паков",
+ "no_packs_desc": "На данный момент нет паков эмодзи или стикеров для отображения.",
+ "view": "Открыть",
+ "failed_to_remove_packs": "Не удалось удалить паки! Попробуйте ещё раз.",
+ "delete_selected_packs": "Удалить выбранные паки. (Выбрано: {{count}})",
+
+ "enable_developer_tools": "Включить инструменты разработчика",
+ "room_id": "ID комнаты",
+ "room_id_desc": "Скопировать ID комнаты в буфер обмена.",
+ "copy": "Копировать",
+ "data": "Данные",
+ "new_message_event": "Новое событие сообщения",
+ "new_message_event_desc": "Создать и отправить новое событие сообщения в комнату.",
+ "compose": "Создать",
+ "room_state": "Состояние комнаты",
+ "room_state_desc": "State-события комнаты.",
+ "events": "События",
+ "total": "Всего: {{count}}",
+ "add_new": "Добавить",
+ "default_key": "По умолчанию",
+ "account_data": "Данные аккаунта",
+ "account_data_desc": "Персональные данные, хранящиеся в комнате.",
+ "state_event": "State-событие",
+ "json_content": "JSON-содержимое",
+ "state_event_type": "Тип state-события",
+ "message_event_type": "Тип события сообщения",
+ "send": "Отправить",
+ "state_key_optional": "State Key (необязательно)",
+
+ "pack": "Пак",
+ "images_usage": "Использование изображений",
+ "images_usage_desc": "Выберите, как используются изображения: как эмодзи, как стикеры или как и то, и другое.",
+ "images": "Изображения",
+ "upload_images": "Загрузить изображения",
+ "upload_images_desc": "Выберите изображения из хранилища для загрузки в пак.",
+ "select": "Выбрать",
+ "pack_avatar": "Аватар пака",
+ "attribution": "Авторство",
+ "shortcode": "Шорткод:",
+ "body": "Описание:",
+ "usage_both": "Оба",
+ "usage_sticker": "Стикер",
+ "usage_emoji": "Эмодзи",
+
+ "power_goku": "Гоку",
+ "power_manager": "Менеджер",
+ "power_founder": "Основатель",
+ "power_admin": "Админ",
+ "power_moderator": "Модератор",
+ "power_member": "Участник",
+ "power_muted": "Без голоса",
+ "power_team": "Команда"
}
}
diff --git a/src/app/components/AccountDataEditor.tsx b/src/app/components/AccountDataEditor.tsx
index 2dbaf1f1..d09701ca 100644
--- a/src/app/components/AccountDataEditor.tsx
+++ b/src/app/components/AccountDataEditor.tsx
@@ -14,6 +14,7 @@ import {
Scroll,
config,
} from 'folds';
+import { useTranslation } from 'react-i18next';
import { MatrixError } from 'matrix-js-sdk';
import { Cursor } from '../plugins/text-area';
import { syntaxErrorPosition } from '../utils/dom';
@@ -47,6 +48,7 @@ function AccountDataEdit({
onCancel,
onSave,
}: AccountDataEditProps) {
+ const { t } = useTranslation();
const alive = useAlive();
const textAreaRef = useRef(null);
@@ -121,7 +123,7 @@ function AccountDataEdit({
aria-disabled={submitting}
>
- Account Data
+ {t('RoomSettings.account_data')}
}
>
- Save
+ {t('RoomSettings.save')}
@@ -165,7 +167,7 @@ function AccountDataEdit({
- JSON Content
+ {t('RoomSettings.json_content')}
void;
};
function AccountDataView({ type, defaultContent, onEdit }: AccountDataViewProps) {
+ const { t } = useTranslation();
return (
- Account Data
+ {t('RoomSettings.account_data')}
- JSON Content
+ {t('RoomSettings.json_content')}
({
type: type ?? '',
content: content ?? {},
@@ -290,7 +294,7 @@ export function AccountDataEditor({
onClick={requestClose}
before={}
>
- Developer Tools
+ {t('RoomSettings.developer_tools')}
diff --git a/src/app/components/JoinRulesSwitcher.tsx b/src/app/components/JoinRulesSwitcher.tsx
index bbc0a65d..249178b4 100644
--- a/src/app/components/JoinRulesSwitcher.tsx
+++ b/src/app/components/JoinRulesSwitcher.tsx
@@ -15,6 +15,7 @@ import {
} from 'folds';
import { JoinRule } from 'matrix-js-sdk';
import FocusTrap from 'focus-trap-react';
+import { useTranslation } from 'react-i18next';
import { stopPropagation } from '../utils/keyboard';
import { getRoomIconSrc } from '../utils/room';
@@ -37,18 +38,20 @@ export const useJoinRuleIcons = (roomType?: string): JoinRuleIcons =>
);
type JoinRuleLabels = Record;
-export const useRoomJoinRuleLabel = (): JoinRuleLabels =>
- useMemo(
+export const useRoomJoinRuleLabel = (): JoinRuleLabels => {
+ const { t } = useTranslation();
+ return useMemo(
() => ({
- [JoinRule.Invite]: 'Invite Only',
- [JoinRule.Knock]: 'Knock & Invite',
- knock_restricted: 'Space Members or Knock',
- [JoinRule.Restricted]: 'Space Members',
- [JoinRule.Public]: 'Public',
- [JoinRule.Private]: 'Invite Only',
+ [JoinRule.Invite]: t('RoomSettings.join_invite_only'),
+ [JoinRule.Knock]: t('RoomSettings.join_knock_invite'),
+ knock_restricted: t('RoomSettings.join_space_members_or_knock'),
+ [JoinRule.Restricted]: t('RoomSettings.join_space_members'),
+ [JoinRule.Public]: t('RoomSettings.join_public'),
+ [JoinRule.Private]: t('RoomSettings.join_invite_only'),
}),
- []
+ [t]
);
+};
type JoinRulesSwitcherProps = {
icons: JoinRuleIcons;
@@ -68,6 +71,7 @@ export function JoinRulesSwitcher({
disabled,
changing,
}: JoinRulesSwitcherProps) {
+ const { t } = useTranslation();
const [cords, setCords] = useState();
const handleOpenMenu: MouseEventHandler = (evt) => {
@@ -138,7 +142,7 @@ export function JoinRulesSwitcher({
onClick={handleOpenMenu}
disabled={disabled}
>
- {labels[value] ?? 'Unsupported'}
+ {labels[value] ?? t('RoomSettings.join_unsupported')}
);
diff --git a/src/app/components/image-pack-view/ImagePackContent.tsx b/src/app/components/image-pack-view/ImagePackContent.tsx
index a696ebe8..8e42fe52 100644
--- a/src/app/components/image-pack-view/ImagePackContent.tsx
+++ b/src/app/components/image-pack-view/ImagePackContent.tsx
@@ -1,5 +1,6 @@
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { as, Box, Text, config, Button, Menu, Spinner } from 'folds';
+import { useTranslation } from 'react-i18next';
import {
ImagePack,
ImageUsage,
@@ -33,6 +34,7 @@ export type ImagePackContentProps = {
export const ImagePackContent = as<'div', ImagePackContentProps>(
({ imagePack, canEdit, onUpdate, ...props }, ref) => {
+ const { t } = useTranslation();
const useAuthentication = useMediaAuthentication();
const [metaEditing, setMetaEditing] = useState(false);
@@ -256,11 +258,11 @@ export const ImagePackContent = as<'div', ImagePackContentProps>(
{applyState.status === AsyncStatus.Error ? (
- Failed to apply changes! Please try again.
+ {t('RoomSettings.failed_to_apply')}
) : (
- Changes saved! Apply when ready.
+ {t('RoomSettings.changes_saved')}
)}
@@ -273,7 +275,7 @@ export const ImagePackContent = as<'div', ImagePackContentProps>(
disabled={!canApplyChanges || applying}
onClick={handleResetSavedChanges}
>
- Reset
+ {t('RoomSettings.reset')}
)}
- Pack
+ {t('RoomSettings.pack')}
(
gap="400"
>
(
{images.length === 0 && !canEdit ? null : (
- Images
+ {t('RoomSettings.images')}
{canEdit && (
(
gap="400"
>
(
outlined
onClick={() => pickFiles('image/*')}
>
- Select
+ {t('RoomSettings.select')}
}
/>
diff --git a/src/app/components/image-pack-view/ImagePackView.tsx b/src/app/components/image-pack-view/ImagePackView.tsx
index ab81d503..808e30ee 100644
--- a/src/app/components/image-pack-view/ImagePackView.tsx
+++ b/src/app/components/image-pack-view/ImagePackView.tsx
@@ -1,5 +1,6 @@
import React from 'react';
import { Box, IconButton, Text, Icon, Icons, Scroll, Chip } from 'folds';
+import { useTranslation } from 'react-i18next';
import { PackAddress } from '../../plugins/custom-emoji';
import { Page, PageHeader, PageContent } from '../page';
import { useMatrixClient } from '../../hooks/useMatrixClient';
@@ -11,6 +12,7 @@ type ImagePackViewProps = {
requestClose: () => void;
};
export function ImagePackView({ address, requestClose }: ImagePackViewProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = address && mx.getRoom(address.roomId);
@@ -25,7 +27,7 @@ export function ImagePackView({ address, requestClose }: ImagePackViewProps) {
onClick={requestClose}
before={}
>
- Emojis & Stickers
+ {t('RoomSettings.emojis_stickers')}
diff --git a/src/app/components/image-pack-view/ImageTile.tsx b/src/app/components/image-pack-view/ImageTile.tsx
index 37337ff7..b642828a 100644
--- a/src/app/components/image-pack-view/ImageTile.tsx
+++ b/src/app/components/image-pack-view/ImageTile.tsx
@@ -1,5 +1,6 @@
import React, { FormEventHandler, ReactNode, useMemo, useState } from 'react';
import { Badge, Box, Button, Chip, Icon, Icons, Input, Text } from 'folds';
+import { useTranslation } from 'react-i18next';
import { UsageSwitcher, useUsageStr } from './UsageSwitcher';
import { mxcUrlToHttp } from '../../utils/matrix';
import * as css from './style.css';
@@ -30,6 +31,7 @@ export function ImageTile({
onDeleteToggle,
deleted,
}: ImageTileProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const getUsageStr = useUsageStr();
@@ -71,7 +73,7 @@ export function ImageTile({
radii="Pill"
onClick={() => onDeleteToggle?.(defaultShortcode)}
>
- {deleted ? Undo : }
+ {deleted ? {t('RoomSettings.undo')} : }
{!deleted && (
onEdit?.(defaultShortcode, image)}
>
- Edit
+ {t('RoomSettings.edit')}
)}
@@ -120,6 +122,7 @@ export function ImageTileEdit({
onCancel,
onSave,
}: ImageTileEditProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const defaultUsage = image.usage ?? packUsage;
@@ -171,7 +174,7 @@ export function ImageTileEdit({
Shortcode:}
+ before={{t('RoomSettings.shortcode')}}
defaultValue={image.shortcode}
name="shortcodeInput"
variant="Secondary"
@@ -181,7 +184,7 @@ export function ImageTileEdit({
autoFocus
/>
Body:}
+ before={{t('RoomSettings.body')}}
defaultValue={image.body}
name="bodyInput"
variant="Secondary"
@@ -195,7 +198,7 @@ export function ImageTileEdit({
diff --git a/src/app/components/image-pack-view/PackMeta.tsx b/src/app/components/image-pack-view/PackMeta.tsx
index f091f30b..3717c0ba 100644
--- a/src/app/components/image-pack-view/PackMeta.tsx
+++ b/src/app/components/image-pack-view/PackMeta.tsx
@@ -13,6 +13,7 @@ import {
Chip,
} from 'folds';
import Linkify from 'linkify-react';
+import { useTranslation } from 'react-i18next';
import { mxcUrlToHttp } from '../../utils/matrix';
import { useMatrixClient } from '../../hooks/useMatrixClient';
import { nameInitials } from '../../utils/common';
@@ -31,13 +32,14 @@ type ImagePackAvatarProps = {
name?: string;
};
function ImagePackAvatar({ url, name }: ImagePackAvatarProps) {
+ const { t } = useTranslation();
return (
{url ? (
-
+
) : (
- {nameInitials(name ?? 'Unknown')}
+ {nameInitials(name ?? t('RoomSettings.unknown'))}
)}
@@ -50,6 +52,7 @@ type ImagePackProfileProps = {
onEdit?: () => void;
};
export function ImagePackProfile({ meta, canEdit, onEdit }: ImagePackProfileProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const useAuthentication = useMediaAuthentication();
const avatarUrl = meta.avatar
@@ -61,7 +64,7 @@ export function ImagePackProfile({ meta, canEdit, onEdit }: ImagePackProfileProp
- {meta.name ?? 'Unknown'}
+ {meta.name ?? t('RoomSettings.unknown')}
{meta.attribution && (
@@ -79,7 +82,7 @@ export function ImagePackProfile({ meta, canEdit, onEdit }: ImagePackProfileProp
onClick={onEdit}
outlined
>
- Edit
+ {t('RoomSettings.edit')}
)}
@@ -97,6 +100,7 @@ type ImagePackProfileEditProps = {
onSave: (meta: PackMetaReader) => void;
};
export function ImagePackProfileEdit({ meta, onCancel, onSave }: ImagePackProfileEditProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const useAuthentication = useMediaAuthentication();
const [avatar, setAvatar] = useState(meta.avatar);
@@ -147,7 +151,7 @@ export function ImagePackProfileEdit({ meta, onCancel, onSave }: ImagePackProfil
- Pack Avatar
+ {t('RoomSettings.pack_avatar')}
{uploadAtom ? (
pickFile('image/*')}
>
- Upload
+ {t('RoomSettings.upload')}
{!avatar && meta.avatar && (
)}
{avatar && (
@@ -189,7 +193,7 @@ export function ImagePackProfileEdit({ meta, onCancel, onSave }: ImagePackProfil
radii="300"
onClick={() => setAvatar(undefined)}
>
- Remove
+ {t('RoomSettings.remove')}
)}
@@ -200,11 +204,11 @@ export function ImagePackProfileEdit({ meta, onCancel, onSave }: ImagePackProfil
- Name
+ {t('RoomSettings.name')}
- Attribution
+ {t('RoomSettings.attribution')}
diff --git a/src/app/components/image-pack-view/UsageSwitcher.tsx b/src/app/components/image-pack-view/UsageSwitcher.tsx
index 1a1eb432..1f1287b2 100644
--- a/src/app/components/image-pack-view/UsageSwitcher.tsx
+++ b/src/app/components/image-pack-view/UsageSwitcher.tsx
@@ -1,18 +1,20 @@
import React, { MouseEventHandler, useMemo, useState } from 'react';
import { Box, Button, config, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text } from 'folds';
import FocusTrap from 'focus-trap-react';
+import { useTranslation } from 'react-i18next';
import { ImageUsage } from '../../plugins/custom-emoji';
import { stopPropagation } from '../../utils/keyboard';
export const useUsageStr = (): ((usage: ImageUsage[]) => string) => {
+ const { t } = useTranslation();
const getUsageStr = (usage: ImageUsage[]): string => {
const sticker = usage.includes(ImageUsage.Sticker);
const emoticon = usage.includes(ImageUsage.Emoticon);
- if (sticker && emoticon) return 'Both';
- if (sticker) return 'Sticker';
- if (emoticon) return 'Emoji';
- return 'Both';
+ if (sticker && emoticon) return t('RoomSettings.usage_both');
+ if (sticker) return t('RoomSettings.usage_sticker');
+ if (emoticon) return t('RoomSettings.usage_emoji');
+ return t('RoomSettings.usage_both');
};
return getUsageStr;
};
diff --git a/src/app/features/common-settings/developer-tools/DevelopTools.tsx b/src/app/features/common-settings/developer-tools/DevelopTools.tsx
index 29b6aa51..fcce6da8 100644
--- a/src/app/features/common-settings/developer-tools/DevelopTools.tsx
+++ b/src/app/features/common-settings/developer-tools/DevelopTools.tsx
@@ -12,6 +12,7 @@ import {
config,
color,
} from 'folds';
+import { useTranslation } from 'react-i18next';
import { Page, PageContent, PageHeader } from '../../../components/page';
import { SequenceCard } from '../../../components/sequence-card';
import { SequenceCardStyle } from '../styles.css';
@@ -35,6 +36,7 @@ type DeveloperToolsProps = {
requestClose: () => void;
};
export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
+ const { t } = useTranslation();
const [developerTools, setDeveloperTools] = useSetting(settingsAtom, 'developerTools');
const mx = useMatrixClient();
const room = useRoom();
@@ -88,7 +90,7 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
- Developer Tools
+ {t('RoomSettings.developer_tools')}
@@ -103,7 +105,7 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
- Options
+ {t('RoomSettings.options')}
copyToClipboard(room.roomId ?? '')}
@@ -140,7 +142,7 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
radii="300"
outlined
>
- Copy
+ {t('RoomSettings.copy')}
}
/>
@@ -150,7 +152,7 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
{developerTools && (
- Data
+ {t('RoomSettings.data')}
setComposeEvent({})}
@@ -170,7 +172,7 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
radii="300"
outlined
>
- Compose
+ {t('RoomSettings.compose')}
}
/>
@@ -182,8 +184,8 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
gap="400"
>
setExpandState(!expandState)}
@@ -200,15 +202,15 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
/>
}
>
- {expandState ? 'Collapse' : 'Expand'}
+ {expandState ? t('RoomSettings.collapse') : t('RoomSettings.expand')}
}
/>
{expandState && (
- Events
- Total: {roomState.size}
+ {t('RoomSettings.events')}
+ {t('RoomSettings.total', { count: roomState.size })}
@@ -275,7 +277,7 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
>
- Add New
+ {t('RoomSettings.add_new')}
@@ -298,7 +300,7 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
>
- {stateKey ? `"${stateKey}"` : 'Default'}
+ {stateKey ? `"${stateKey}"` : t('RoomSettings.default_key')}
@@ -319,8 +321,8 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
gap="400"
>
setExpandAccountData(!expandAccountData)}
@@ -337,15 +339,15 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) {
/>
}
>
- {expandAccountData ? 'Collapse' : 'Expand'}
+ {expandAccountData ? t('RoomSettings.collapse') : t('RoomSettings.expand')}
}
/>
{expandAccountData && (
- Events
- Total: {accountData.size}
+ {t('RoomSettings.events')}
+ {t('RoomSettings.total', { count: accountData.size })}
diff --git a/src/app/features/common-settings/developer-tools/SendRoomEvent.tsx b/src/app/features/common-settings/developer-tools/SendRoomEvent.tsx
index f25ba7c3..ca645a3b 100644
--- a/src/app/features/common-settings/developer-tools/SendRoomEvent.tsx
+++ b/src/app/features/common-settings/developer-tools/SendRoomEvent.tsx
@@ -1,4 +1,5 @@
import React, { useCallback, useRef, useState, FormEventHandler, useEffect } from 'react';
+import { useTranslation } from 'react-i18next';
import { MatrixError } from 'matrix-js-sdk';
import {
Box,
@@ -31,6 +32,7 @@ export type SendRoomEventProps = {
requestClose: () => void;
};
export function SendRoomEvent({ type, stateKey, requestClose }: SendRoomEventProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
const alive = useAlive();
@@ -114,7 +116,7 @@ export function SendRoomEvent({ type, stateKey, requestClose }: SendRoomEventPro
onClick={requestClose}
before={}
>
- Developer Tools
+ {t('RoomSettings.developer_tools')}
@@ -135,7 +137,7 @@ export function SendRoomEvent({ type, stateKey, requestClose }: SendRoomEventPro
aria-disabled={submitting}
>
- {composeStateEvent ? 'State Event Type' : 'Message Event Type'}
+ {composeStateEvent ? t('RoomSettings.state_event_type') : t('RoomSettings.message_event_type')}
}
>
- Send
+ {t('RoomSettings.send')}
@@ -168,7 +170,7 @@ export function SendRoomEvent({ type, stateKey, requestClose }: SendRoomEventPro
{composeStateEvent && (
- State Key (Optional)
+ {t('RoomSettings.state_key_optional')}
- JSON Content
+ {t('RoomSettings.json_content')}
void;
};
function StateEventEdit({ type, stateKey, content, requestClose }: StateEventEditProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
const alive = useAlive();
@@ -118,7 +120,7 @@ function StateEventEdit({ type, stateKey, content, requestClose }: StateEventEdi
aria-disabled={submitting}
>
- State Event
+ {t('RoomSettings.state_event')}
}
>
- Save
+ {t('RoomSettings.save')}
}
@@ -163,7 +165,7 @@ function StateEventEdit({ type, stateKey, content, requestClose }: StateEventEdi
- JSON Content
+ {t('RoomSettings.json_content')}
void;
};
function StateEventView({ content, eventJSONStr, onEditContent }: StateEventViewProps) {
+ const { t } = useTranslation();
return (
- State Event
+ {t('RoomSettings.state_event')}
{onEditContent && (
@@ -210,7 +213,7 @@ function StateEventView({ content, eventJSONStr, onEditContent }: StateEventView
outlined
onClick={() => onEditContent(content)}
>
- Edit
+ {t('RoomSettings.edit')}
)}
@@ -241,6 +244,7 @@ export type StateEventEditorProps = StateEventInfo & {
};
export function StateEventEditor({ type, stateKey, requestClose }: StateEventEditorProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
const stateEvent = useStateEvent(room, type as unknown as StateEvent, stateKey);
@@ -271,7 +275,7 @@ export function StateEventEditor({ type, stateKey, requestClose }: StateEventEdi
onClick={requestClose}
before={}
>
- Developer Tools
+ {t('RoomSettings.developer_tools')}
diff --git a/src/app/features/common-settings/emojis-stickers/EmojisStickers.tsx b/src/app/features/common-settings/emojis-stickers/EmojisStickers.tsx
index ad8ffae6..f752ca8c 100644
--- a/src/app/features/common-settings/emojis-stickers/EmojisStickers.tsx
+++ b/src/app/features/common-settings/emojis-stickers/EmojisStickers.tsx
@@ -1,5 +1,6 @@
import React, { useState } from 'react';
import { Box, Icon, IconButton, Icons, Scroll, Text } from 'folds';
+import { useTranslation } from 'react-i18next';
import { Page, PageContent, PageHeader } from '../../../components/page';
import { ImagePack } from '../../../plugins/custom-emoji';
import { ImagePackView } from '../../../components/image-pack-view';
@@ -9,6 +10,7 @@ type EmojisStickersProps = {
requestClose: () => void;
};
export function EmojisStickers({ requestClose }: EmojisStickersProps) {
+ const { t } = useTranslation();
const [imagePack, setImagePack] = useState();
const handleImagePackViewClose = () => {
@@ -25,7 +27,7 @@ export function EmojisStickers({ requestClose }: EmojisStickersProps) {
- Emojis & Stickers
+ {t('RoomSettings.emojis_stickers')}
diff --git a/src/app/features/common-settings/emojis-stickers/RoomPacks.tsx b/src/app/features/common-settings/emojis-stickers/RoomPacks.tsx
index fdbe546e..8a6abf0e 100644
--- a/src/app/features/common-settings/emojis-stickers/RoomPacks.tsx
+++ b/src/app/features/common-settings/emojis-stickers/RoomPacks.tsx
@@ -16,6 +16,7 @@ import {
IconButton,
Menu,
} from 'folds';
+import { useTranslation } from 'react-i18next';
import { MatrixError } from 'matrix-js-sdk';
import { SequenceCard } from '../../../components/sequence-card';
import {
@@ -46,6 +47,7 @@ type CreatePackTileProps = {
roomId: string;
};
function CreatePackTile({ packs, roomId }: CreatePackTileProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const alive = useAlive();
@@ -97,8 +99,8 @@ function CreatePackTile({ packs, roomId }: CreatePackTileProps) {
gap="400"
>
- Name
+ {t('RoomSettings.name')}
}
>
- Create
+ {t('RoomSettings.create')}
@@ -142,6 +144,7 @@ type RoomPacksProps = {
onViewPack: (imagePack: ImagePack) => void;
};
export function RoomPacks({ onViewPack }: RoomPacksProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const useAuthentication = useMediaAuthentication();
const room = useRoom();
@@ -255,7 +258,7 @@ export function RoomPacks({ onViewPack }: RoomPacksProps) {
outlined
onClick={() => onViewPack(pack)}
>
- View
+ {t('RoomSettings.view')}
)
}
@@ -267,7 +270,7 @@ export function RoomPacks({ onViewPack }: RoomPacksProps) {
return (
<>
- Packs
+ {t('RoomSettings.packs')}
{canEdit && }
{packs.map(renderPack)}
{packs.length === 0 && (
@@ -288,10 +291,10 @@ export function RoomPacks({ onViewPack }: RoomPacksProps) {
}}
>
- No Packs
+ {t('RoomSettings.no_packs')}
- There are no emoji or sticker packs to display at the moment.
+ {t('RoomSettings.no_packs_desc')}
@@ -315,11 +318,11 @@ export function RoomPacks({ onViewPack }: RoomPacksProps) {
{applyState.status === AsyncStatus.Error ? (
- Failed to remove packs! Please try again.
+ {t('RoomSettings.failed_to_remove_packs')}
) : (
- Delete selected packs. ({removedPacks.length} selected)
+ {t('RoomSettings.delete_selected_packs', { count: removedPacks.length })}
)}
@@ -332,7 +335,7 @@ export function RoomPacks({ onViewPack }: RoomPacksProps) {
disabled={applyingChanges}
onClick={handleCancelChanges}
>
- Cancel
+ {t('RoomSettings.cancel')}
}
onClick={handleApplyChanges}
>
- Delete
+ {t('RoomSettings.delete')}
diff --git a/src/app/features/common-settings/general/RoomAddress.tsx b/src/app/features/common-settings/general/RoomAddress.tsx
index 767a967e..071d332e 100644
--- a/src/app/features/common-settings/general/RoomAddress.tsx
+++ b/src/app/features/common-settings/general/RoomAddress.tsx
@@ -15,6 +15,7 @@ import {
toRem,
} from 'folds';
import { MatrixError } from 'matrix-js-sdk';
+import { useTranslation } from 'react-i18next';
import { SettingTile } from '../../../components/setting-tile';
import { SequenceCard } from '../../../components/sequence-card';
import { SequenceCardStyle } from '../../room-settings/styles.css';
@@ -39,6 +40,7 @@ type RoomPublishedAddressesProps = {
};
export function RoomPublishedAddresses({ permissions }: RoomPublishedAddressesProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
@@ -61,19 +63,17 @@ export function RoomPublishedAddresses({ permissions }: RoomPublishedAddressesPr
gap="400"
>
- If access is Public, Published addresses will be used to join by anyone.
-
+
}
/>
{publishedAliases.length === 0 ? (
- No Addresses
+ {t('RoomSettings.no_addresses')}
- To publish an address, it needs to be set as a local address first
+ {t('RoomSettings.no_addresses_hint')}
) : (
@@ -86,7 +86,7 @@ export function RoomPublishedAddresses({ permissions }: RoomPublishedAddressesPr
{alias === canonicalAlias && (
- Main
+ {t('RoomSettings.main')}
)}
@@ -100,7 +100,7 @@ export function RoomPublishedAddresses({ permissions }: RoomPublishedAddressesPr
disabled={loading}
onClick={() => setMain(undefined)}
>
- Unset Main
+ {t('RoomSettings.unset_main')}
) : (
setMain(alias)}
>
- Set Main
+ {t('RoomSettings.set_main')}
)}
@@ -131,6 +131,7 @@ export function RoomPublishedAddresses({ permissions }: RoomPublishedAddressesPr
}
function LocalAddressInput({ addLocalAlias }: { addLocalAlias: (alias: string) => Promise }) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const userId = mx.getSafeUserId();
const server = getMxIdServer(userId);
@@ -183,14 +184,14 @@ function LocalAddressInput({ addLocalAlias }: { addLocalAlias: (alias: string) =
disabled={adding}
before={adding && }
>
- Save
+ {t('RoomSettings.save')}
{addState.status === AsyncStatus.Error && (
{(addState.error as MatrixError).httpStatus === 409
- ? 'Address is already in use!'
+ ? t('RoomSettings.address_in_use')
: (addState.error as MatrixError).message}
)}
@@ -207,6 +208,7 @@ function LocalAddressesList({
removeLocalAlias: (alias: string) => Promise;
canEditCanonical?: boolean;
}) {
+ const { t } = useTranslation();
const room = useRoom();
const alive = useAlive();
@@ -271,7 +273,7 @@ function LocalAddressesList({
{selectedAliases.length > 0 && (
- {selectedAliases.length} Selected
+ {t('RoomSettings.selected_count', { count: selectedAliases.length })}
{canEditCanonical &&
@@ -287,7 +289,7 @@ function LocalAddressesList({
)
}
>
- Unpublish
+ {t('RoomSettings.unpublish')}
) : (
- Publish
+ {t('RoomSettings.publish')}
))}
- Delete
+ {t('RoomSettings.delete')}
@@ -343,7 +345,7 @@ function LocalAddressesList({
{published && (
- Published
+ {t('RoomSettings.published')}
)}
@@ -360,6 +362,7 @@ function LocalAddressesList({
}
export function RoomLocalAddresses({ permissions }: { permissions: RoomPermissionsAPI }) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
@@ -380,8 +383,8 @@ export function RoomLocalAddresses({ permissions }: { permissions: RoomPermissio
gap="400"
>
- {expand ? 'Collapse' : 'Expand'}
+ {expand ? t('RoomSettings.collapse') : t('RoomSettings.expand')}
}
@@ -406,13 +409,13 @@ export function RoomLocalAddresses({ permissions }: { permissions: RoomPermissio
{localAliasesState.status === AsyncStatus.Loading && (
- Loading...
+ {t('RoomSettings.loading')}
)}
{localAliasesState.status === AsyncStatus.Success &&
(localAliasesState.data.length === 0 ? (
- No Addresses
+ {t('RoomSettings.no_addresses')}
) : (
- Enabled
+ {t('RoomSettings.enabled')}
) : (
)
}
@@ -121,7 +123,7 @@ export function RoomEncryption({ permissions }: RoomEncryptionProps) {
size="500"
>
- Enable Encryption
+ {t('RoomSettings.enable_encryption')}
setPrompt(false)} radii="300">
@@ -129,10 +131,10 @@ export function RoomEncryption({ permissions }: RoomEncryptionProps) {
- Are you sure? Once enabled, encryption cannot be disabled!
+ {t('RoomSettings.enable_encryption_confirm')}
diff --git a/src/app/features/common-settings/general/RoomHistoryVisibility.tsx b/src/app/features/common-settings/general/RoomHistoryVisibility.tsx
index 2e42785f..4c9ccf9b 100644
--- a/src/app/features/common-settings/general/RoomHistoryVisibility.tsx
+++ b/src/app/features/common-settings/general/RoomHistoryVisibility.tsx
@@ -15,6 +15,7 @@ import {
import { HistoryVisibility, MatrixError } from 'matrix-js-sdk';
import { RoomHistoryVisibilityEventContent } from 'matrix-js-sdk/lib/types';
import FocusTrap from 'focus-trap-react';
+import { useTranslation } from 'react-i18next';
import { SequenceCard } from '../../../components/sequence-card';
import { SequenceCardStyle } from '../../room-settings/styles.css';
import { SettingTile } from '../../../components/setting-tile';
@@ -26,16 +27,18 @@ import { useStateEvent } from '../../../hooks/useStateEvent';
import { stopPropagation } from '../../../utils/keyboard';
import { RoomPermissionsAPI } from '../../../hooks/useRoomPermissions';
-const useVisibilityStr = () =>
- useMemo(
+const useVisibilityStr = () => {
+ const { t } = useTranslation();
+ return useMemo(
() => ({
- [HistoryVisibility.Invited]: 'After Invite',
- [HistoryVisibility.Joined]: 'After Join',
- [HistoryVisibility.Shared]: 'All Messages',
- [HistoryVisibility.WorldReadable]: 'All Messages (Guests)',
+ [HistoryVisibility.Invited]: t('RoomSettings.visibility_after_invite'),
+ [HistoryVisibility.Joined]: t('RoomSettings.visibility_after_join'),
+ [HistoryVisibility.Shared]: t('RoomSettings.visibility_all_messages'),
+ [HistoryVisibility.WorldReadable]: t('RoomSettings.visibility_all_messages_guests'),
}),
- []
+ [t]
);
+};
const useVisibilityMenu = () =>
useMemo(
@@ -52,6 +55,7 @@ type RoomHistoryVisibilityProps = {
permissions: RoomPermissionsAPI;
};
export function RoomHistoryVisibility({ permissions }: RoomHistoryVisibilityProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
@@ -96,8 +100,8 @@ export function RoomHistoryVisibility({ permissions }: RoomHistoryVisibilityProp
gap="400"
>
- Avatar
+ {t('RoomSettings.avatar')}
{uploadAtom ? (
pickFile('image/*')}
>
- Upload
+ {t('RoomSettings.upload')}
{!roomAvatar && avatar && (
)}
{roomAvatar && (
@@ -185,7 +187,7 @@ export function RoomProfileEdit({
disabled={!canEditAvatar || submitting}
onClick={() => setRoomAvatar(undefined)}
>
- Remove
+ {t('RoomSettings.remove')}
)}
@@ -210,7 +212,7 @@ export function RoomProfileEdit({
- Name
+ {t('RoomSettings.name')}
- Topic
+ {t('RoomSettings.topic')}
}
>
- Save
+ {t('RoomSettings.save')}
@@ -264,6 +266,7 @@ type RoomProfileProps = {
permissions: RoomPermissionsAPI;
};
export function RoomProfile({ permissions }: RoomProfileProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const useAuthentication = useMediaAuthentication();
const room = useRoom();
@@ -289,7 +292,7 @@ export function RoomProfile({ permissions }: RoomProfileProps) {
return (
- Profile
+ {t('RoomSettings.profile')}
- {name ?? 'Unknown'}
+ {name ?? t('RoomSettings.unknown')}
{topic && (
@@ -329,7 +332,7 @@ export function RoomProfile({ permissions }: RoomProfileProps) {
onClick={() => setEdit(true)}
outlined
>
- Edit
+ {t('RoomSettings.edit')}
)}
diff --git a/src/app/features/common-settings/general/RoomPublish.tsx b/src/app/features/common-settings/general/RoomPublish.tsx
index ce014210..ef90330d 100644
--- a/src/app/features/common-settings/general/RoomPublish.tsx
+++ b/src/app/features/common-settings/general/RoomPublish.tsx
@@ -1,5 +1,6 @@
import React from 'react';
import { Box, color, Spinner, Switch, Text } from 'folds';
+import { useTranslation } from 'react-i18next';
import { JoinRule, MatrixError } from 'matrix-js-sdk';
import { RoomJoinRulesEventContent } from 'matrix-js-sdk/lib/types';
import { SequenceCard } from '../../../components/sequence-card';
@@ -18,6 +19,7 @@ type RoomPublishProps = {
permissions: RoomPermissionsAPI;
};
export function RoomPublish({ permissions }: RoomPublishProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
@@ -46,11 +48,11 @@ export function RoomPublish({ permissions }: RoomPublishProps) {
gap="400"
>
diff --git a/src/app/features/common-settings/general/RoomUpgrade.tsx b/src/app/features/common-settings/general/RoomUpgrade.tsx
index 45a480aa..bde87c1c 100644
--- a/src/app/features/common-settings/general/RoomUpgrade.tsx
+++ b/src/app/features/common-settings/general/RoomUpgrade.tsx
@@ -16,6 +16,7 @@ import {
Icons,
} from 'folds';
import FocusTrap from 'focus-trap-react';
+import { useTranslation } from 'react-i18next';
import { MatrixError, Method } from 'matrix-js-sdk';
import { RoomTombstoneEventContent } from 'matrix-js-sdk/lib/types';
import { SequenceCard } from '../../../components/sequence-card';
@@ -41,6 +42,7 @@ import { useRoomCreators } from '../../../hooks/useRoomCreators';
import { BreakWord } from '../../../styles/Text.css';
function RoomUpgradeDialog({ requestClose }: { requestClose: () => void }) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
const alive = useAlive();
@@ -103,7 +105,7 @@ function RoomUpgradeDialog({ requestClose }: { requestClose: () => void }) {
size="500"
>
- {room.isSpaceRoom() ? 'Space Upgrade' : 'Room Upgrade'}
+ {room.isSpaceRoom() ? t('RoomSettings.space_upgrade') : t('RoomSettings.room_upgrade')}
@@ -111,10 +113,10 @@ function RoomUpgradeDialog({ requestClose }: { requestClose: () => void }) {
- This action is irreversible!
+ {t('RoomSettings.action_irreversible')}
- Options
+ {t('RoomSettings.options')}
void }) {
disabled={upgrading}
before={upgrading && }
>
- {room.isSpaceRoom() ? 'Upgrade Space' : 'Upgrade Room'}
+ {room.isSpaceRoom() ? t('RoomSettings.upgrade_space') : t('RoomSettings.upgrade_room')}
@@ -163,6 +165,7 @@ type RoomUpgradeProps = {
requestClose: () => void;
};
export function RoomUpgrade({ permissions, requestClose }: RoomUpgradeProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
const { navigateRoom, navigateSpace } = useRoomNavigate();
@@ -213,12 +216,12 @@ export function RoomUpgrade({ permissions, requestClose }: RoomUpgradeProps) {
gap="400"
>
@@ -231,7 +234,7 @@ export function RoomUpgrade({ permissions, requestClose }: RoomUpgradeProps) {
radii="300"
onClick={handleOpenOldRoom}
>
- {room.isSpaceRoom() ? 'Old Space' : 'Old Room'}
+ {room.isSpaceRoom() ? t('RoomSettings.old_space') : t('RoomSettings.old_room')}
)}
{replacementRoom ? (
@@ -242,7 +245,7 @@ export function RoomUpgrade({ permissions, requestClose }: RoomUpgradeProps) {
radii="300"
onClick={handleOpenRoom}
>
- {room.isSpaceRoom() ? 'Open New Space' : 'Open New Room'}
+ {room.isSpaceRoom() ? t('RoomSettings.open_new_space') : t('RoomSettings.open_new_room')}
) : (
)}
diff --git a/src/app/features/common-settings/members/Members.tsx b/src/app/features/common-settings/members/Members.tsx
index 15cd1d08..3e781258 100644
--- a/src/app/features/common-settings/members/Members.tsx
+++ b/src/app/features/common-settings/members/Members.tsx
@@ -21,6 +21,7 @@ import {
Text,
toRem,
} from 'folds';
+import { useTranslation } from 'react-i18next';
import { useVirtualizer } from '@tanstack/react-virtual';
import { RoomMember } from 'matrix-js-sdk';
import { Page, PageContent, PageHeader } from '../../../components/page';
@@ -75,6 +76,7 @@ type MembersProps = {
requestClose: () => void;
};
export function Members({ requestClose }: MembersProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const useAuthentication = useMediaAuthentication();
const room = useRoom();
@@ -157,7 +159,7 @@ export function Members({ requestClose }: MembersProps) {
- {room.getJoinedMemberCount()} Members
+ {t('RoomSettings.members_count', { count: room.getJoinedMemberCount() })}
@@ -182,7 +184,7 @@ export function Members({ requestClose }: MembersProps) {
before={}
variant="SurfaceVariant"
size="500"
- placeholder="Search"
+ placeholder={t('RoomSettings.search')}
outlined
after={
result && (
@@ -197,8 +199,8 @@ export function Members({ requestClose }: MembersProps) {
>
{result.items.length === 0
- ? 'No Results'
- : `${result.items.length} Results`}
+ ? t('RoomSettings.no_results')
+ : t('RoomSettings.results_count', { count: result.items.length })}
)
@@ -282,7 +284,7 @@ export function Members({ requestClose }: MembersProps) {
radii="Pill"
outlined
size="300"
- aria-label="Scroll to Top"
+ aria-label={t('RoomSettings.scroll_to_top')}
>
@@ -295,7 +297,7 @@ export function Members({ requestClose }: MembersProps) {
{!fetchingMembers && !result && flattenTagMembers.length === 0 && (
- {`No "${membershipFilter.name}" Members`}
+ {t('RoomSettings.no_membership_members', { filter: membershipFilter.name })}
)}
diff --git a/src/app/features/common-settings/permissions/PermissionGroups.tsx b/src/app/features/common-settings/permissions/PermissionGroups.tsx
index 12150773..673043fc 100644
--- a/src/app/features/common-settings/permissions/PermissionGroups.tsx
+++ b/src/app/features/common-settings/permissions/PermissionGroups.tsx
@@ -1,6 +1,7 @@
/* eslint-disable react/no-array-index-key */
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { Badge, Box, Button, Chip, config, Icon, Icons, Menu, Spinner, Text } from 'folds';
+import { useTranslation } from 'react-i18next';
import produce from 'immer';
import { SequenceCard } from '../../../components/sequence-card';
import { SequenceCardStyle } from '../styles.css';
@@ -34,6 +35,7 @@ export function PermissionGroups({
permissionGroups,
canEdit,
}: PermissionGroupsProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
const alive = useAlive();
@@ -114,7 +116,7 @@ export function PermissionGroups({
return (
- Users
+ {t('RoomSettings.users')}
{tag.name}
- {value < maxPower && & Above}
+ {value < maxPower && {t('RoomSettings.and_above')}}
)}
@@ -249,11 +251,11 @@ export function PermissionGroups({
{applyState.status === AsyncStatus.Error ? (
- Failed to apply changes! Please try again.
+ {t('RoomSettings.failed_to_apply')}
) : (
- Changes saved! Apply when ready.
+ {t('RoomSettings.changes_saved')}
)}
@@ -266,7 +268,7 @@ export function PermissionGroups({
disabled={applyingChanges}
onClick={resetChanges}
>
- Reset
+ {t('RoomSettings.reset')}
}
onClick={handleApplyChanges}
>
- Apply Changes
+ {t('RoomSettings.apply_changes')}
diff --git a/src/app/features/common-settings/permissions/Powers.tsx b/src/app/features/common-settings/permissions/Powers.tsx
index fe4f5689..72f16ae0 100644
--- a/src/app/features/common-settings/permissions/Powers.tsx
+++ b/src/app/features/common-settings/permissions/Powers.tsx
@@ -1,6 +1,7 @@
/* eslint-disable react/no-array-index-key */
import React, { useState, MouseEventHandler, ReactNode } from 'react';
import FocusTrap from 'focus-trap-react';
+import { useTranslation } from 'react-i18next';
import {
Box,
Button,
@@ -108,6 +109,7 @@ type PowersProps = {
onEdit?: () => void;
};
export function Powers({ powerLevels, permissionGroups, onEdit }: PowersProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const useAuthentication = useMediaAuthentication();
const room = useRoom();
@@ -127,8 +129,8 @@ export function Powers({ powerLevels, permissionGroups, onEdit }: PowersProps) {
gap="400"
>
@@ -155,8 +157,8 @@ export function Powers({ powerLevels, permissionGroups, onEdit }: PowersProps) {
gap="400"
>
@@ -168,7 +170,7 @@ export function Powers({ powerLevels, permissionGroups, onEdit }: PowersProps) {
outlined
onClick={onEdit}
>
- Edit
+ {t('RoomSettings.edit')}
)
diff --git a/src/app/features/common-settings/permissions/PowersEditor.tsx b/src/app/features/common-settings/permissions/PowersEditor.tsx
index 97305946..0ab3e6bc 100644
--- a/src/app/features/common-settings/permissions/PowersEditor.tsx
+++ b/src/app/features/common-settings/permissions/PowersEditor.tsx
@@ -19,6 +19,7 @@ import {
Tooltip,
} from 'folds';
import { HexColorPicker } from 'react-colorful';
+import { useTranslation } from 'react-i18next';
import { useAtomValue } from 'jotai';
import { Page, PageContent, PageHeader } from '../../../components/page';
import { IPowerLevels } from '../../../hooks/usePowerLevels';
@@ -58,6 +59,7 @@ type EditPowerProps = {
onClose: () => void;
};
function EditPower({ maxPower, power, tag, onSave, onClose }: EditPowerProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
const roomToParents = useAtomValue(roomToParentsAtom);
@@ -120,7 +122,7 @@ function EditPower({ maxPower, power, tag, onSave, onClose }: EditPowerProps) {
- Color
+ {t('RoomSettings.color')}
}
@@ -137,18 +139,18 @@ function EditPower({ maxPower, power, tag, onSave, onClose }: EditPowerProps) {
radii="300"
before={}
>
- Pick
+ {t('RoomSettings.pick')}
)}
- Name
+ {t('RoomSettings.name')}
- Power
+ {t('RoomSettings.power')}
- Icon
+ {t('RoomSettings.icon')}
{iconUploadAtom && !tagIconSrc ? (
- Remove
+ {t('RoomSettings.remove')}
>
) : (
@@ -238,7 +240,7 @@ function EditPower({ maxPower, power, tag, onSave, onClose }: EditPowerProps) {
radii="300"
before={}
>
- Pick
+ {t('RoomSettings.pick')}
)}
@@ -251,7 +253,7 @@ function EditPower({ maxPower, power, tag, onSave, onClose }: EditPowerProps) {
fill="None"
radii="300"
>
- Import
+ {t('RoomSettings.import')}
>
)}
@@ -267,7 +269,7 @@ function EditPower({ maxPower, power, tag, onSave, onClose }: EditPowerProps) {
radii="300"
disabled={uploadingIcon}
>
- Save
+ {t('RoomSettings.save')}
@@ -289,6 +291,7 @@ type PowersEditorProps = {
requestClose: () => void;
};
export function PowersEditor({ powerLevels, requestClose }: PowersEditorProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const useAuthentication = useMediaAuthentication();
const room = useRoom();
@@ -365,7 +368,7 @@ export function PowersEditor({ powerLevels, requestClose }: PowersEditorProps) {
onClick={requestClose}
before={}
>
- Permissions
+ {t('RoomSettings.permissions')}
@@ -381,7 +384,7 @@ export function PowersEditor({ powerLevels, requestClose }: PowersEditorProps) {
- Power Levels
+ {t('RoomSettings.power_levels')}
- Create
+ {t('RoomSettings.create')}
)
}
@@ -462,7 +465,7 @@ export function PowersEditor({ powerLevels, requestClose }: PowersEditorProps) {
disabled={applyingChanges}
onClick={() => handleToggleDelete(power)}
>
- Undo
+ {t('RoomSettings.undo')}
) : (
@@ -471,13 +474,13 @@ export function PowersEditor({ powerLevels, requestClose }: PowersEditorProps) {
{usedPowers.has(power) ? (
- Used Power Level
+ {t('RoomSettings.used_power_level')}
- You have to remove its use before you can delete it.
+ {t('RoomSettings.used_power_level_desc')}
) : (
- Delete
+ {t('RoomSettings.delete')}
)}
}
@@ -506,7 +509,7 @@ export function PowersEditor({ powerLevels, requestClose }: PowersEditorProps) {
disabled={applyingChanges}
onClick={() => setEdit(true)}
>
- Edit
+ {t('RoomSettings.edit')}
)
@@ -536,11 +539,11 @@ export function PowersEditor({ powerLevels, requestClose }: PowersEditorProps) {
{applyState.status === AsyncStatus.Error ? (
- Failed to apply changes! Please try again.
+ {t('RoomSettings.failed_to_apply')}
) : (
- Changes saved! Apply when ready.
+ {t('RoomSettings.changes_saved')}
)}
@@ -553,7 +556,7 @@ export function PowersEditor({ powerLevels, requestClose }: PowersEditorProps) {
disabled={applyingChanges}
onClick={resetChanges}
>
- Reset
+ {t('RoomSettings.reset')}
diff --git a/src/app/features/room-settings/RoomSettings.tsx b/src/app/features/room-settings/RoomSettings.tsx
index 8601c365..d210a621 100644
--- a/src/app/features/room-settings/RoomSettings.tsx
+++ b/src/app/features/room-settings/RoomSettings.tsx
@@ -1,6 +1,7 @@
import React, { useMemo, useState } from 'react';
import { useAtomValue } from 'jotai';
import { Avatar, Box, config, Icon, IconButton, Icons, IconSrc, MenuItem, Text } from 'folds';
+import { useTranslation } from 'react-i18next';
import { JoinRule } from 'matrix-js-sdk';
import { PageNav, PageNavContent, PageNavHeader, PageRoot } from '../../components/page';
import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize';
@@ -24,37 +25,39 @@ type RoomSettingsMenuItem = {
icon: IconSrc;
};
-const useRoomSettingsMenuItems = (): RoomSettingsMenuItem[] =>
- useMemo(
+const useRoomSettingsMenuItems = (): RoomSettingsMenuItem[] => {
+ const { t } = useTranslation();
+ return useMemo(
() => [
{
page: RoomSettingsPage.GeneralPage,
- name: 'General',
+ name: t('RoomSettings.general'),
icon: Icons.Setting,
},
{
page: RoomSettingsPage.MembersPage,
- name: 'Members',
+ name: t('RoomSettings.members'),
icon: Icons.User,
},
{
page: RoomSettingsPage.PermissionsPage,
- name: 'Permissions',
+ name: t('RoomSettings.permissions'),
icon: Icons.Lock,
},
{
page: RoomSettingsPage.EmojisStickersPage,
- name: 'Emojis & Stickers',
+ name: t('RoomSettings.emojis_stickers'),
icon: Icons.Smile,
},
{
page: RoomSettingsPage.DeveloperToolsPage,
- name: 'Developer Tools',
+ name: t('RoomSettings.developer_tools'),
icon: Icons.Terminal,
},
],
- []
+ [t]
);
+};
type RoomSettingsProps = {
initialPage?: RoomSettingsPage;
diff --git a/src/app/features/room-settings/general/General.tsx b/src/app/features/room-settings/general/General.tsx
index 15157304..51926191 100644
--- a/src/app/features/room-settings/general/General.tsx
+++ b/src/app/features/room-settings/general/General.tsx
@@ -1,5 +1,6 @@
import React from 'react';
import { Box, Icon, IconButton, Icons, Scroll, Text } from 'folds';
+import { useTranslation } from 'react-i18next';
import { Page, PageContent, PageHeader } from '../../../components/page';
import { usePowerLevels } from '../../../hooks/usePowerLevels';
import { useRoom } from '../../../hooks/useRoom';
@@ -20,6 +21,7 @@ type GeneralProps = {
requestClose: () => void;
};
export function General({ requestClose }: GeneralProps) {
+ const { t } = useTranslation();
const room = useRoom();
const powerLevels = usePowerLevels(room);
const creators = useRoomCreators(room);
@@ -31,7 +33,7 @@ export function General({ requestClose }: GeneralProps) {
- General
+ {t('RoomSettings.general')}
@@ -47,19 +49,19 @@ export function General({ requestClose }: GeneralProps) {
- Options
+ {t('RoomSettings.options')}
- Addresses
+ {t('RoomSettings.addresses')}
- Advanced Options
+ {t('RoomSettings.advanced_options')}
diff --git a/src/app/features/room-settings/permissions/Permissions.tsx b/src/app/features/room-settings/permissions/Permissions.tsx
index fe6b098b..6f23be85 100644
--- a/src/app/features/room-settings/permissions/Permissions.tsx
+++ b/src/app/features/room-settings/permissions/Permissions.tsx
@@ -1,5 +1,6 @@
import React, { useState } from 'react';
import { Box, Icon, IconButton, Icons, Scroll, Text } from 'folds';
+import { useTranslation } from 'react-i18next';
import { Page, PageContent, PageHeader } from '../../../components/page';
import { useRoom } from '../../../hooks/useRoom';
import { usePowerLevels } from '../../../hooks/usePowerLevels';
@@ -14,6 +15,7 @@ type PermissionsProps = {
requestClose: () => void;
};
export function Permissions({ requestClose }: PermissionsProps) {
+ const { t } = useTranslation();
const mx = useMatrixClient();
const room = useRoom();
const powerLevels = usePowerLevels(room);
@@ -41,7 +43,7 @@ export function Permissions({ requestClose }: PermissionsProps) {
- Permissions
+ {t('RoomSettings.permissions')}
diff --git a/src/app/features/room-settings/permissions/usePermissionItems.ts b/src/app/features/room-settings/permissions/usePermissionItems.ts
index d4f5f562..eb46bc7c 100644
--- a/src/app/features/room-settings/permissions/usePermissionItems.ts
+++ b/src/app/features/room-settings/permissions/usePermissionItems.ts
@@ -1,215 +1,217 @@
import { useMemo } from 'react';
+import { useTranslation } from 'react-i18next';
import { MessageEvent, StateEvent } from '../../../../types/matrix/room';
import { PermissionGroup } from '../../common-settings/permissions';
export const usePermissionGroups = (isCallRoom: boolean): PermissionGroup[] => {
+ const { t } = useTranslation();
const groups: PermissionGroup[] = useMemo(() => {
const messagesGroup: PermissionGroup = {
- name: 'Messages',
+ name: t('RoomSettings.perm_messages'),
items: [
{
location: {
key: MessageEvent.RoomMessage,
},
- name: 'Send Messages',
+ name: t('RoomSettings.perm_send_messages'),
},
{
location: {
key: MessageEvent.Sticker,
},
- name: 'Send Stickers',
+ name: t('RoomSettings.perm_send_stickers'),
},
{
location: {
key: MessageEvent.Reaction,
},
- name: 'Send Reactions',
+ name: t('RoomSettings.perm_send_reactions'),
},
{
location: {
notification: true,
key: 'room',
},
- name: 'Ping @room',
+ name: t('RoomSettings.perm_ping_room'),
},
{
location: {
state: true,
key: StateEvent.RoomPinnedEvents,
},
- name: 'Pin Messages',
+ name: t('RoomSettings.perm_pin_messages'),
},
{
location: {},
- name: 'Other Message Events',
+ name: t('RoomSettings.perm_other_message_events'),
},
],
};
const callSettingsGroup: PermissionGroup = {
- name: 'Calls',
+ name: t('RoomSettings.perm_calls'),
items: [
{
location: {
state: true,
key: StateEvent.GroupCallMemberPrefix,
},
- name: 'Join Call',
+ name: t('RoomSettings.perm_join_call'),
},
],
};
const moderationGroup: PermissionGroup = {
- name: 'Moderation',
+ name: t('RoomSettings.perm_moderation'),
items: [
{
location: {
action: true,
key: 'invite',
},
- name: 'Invite',
+ name: t('RoomSettings.perm_invite'),
},
{
location: {
action: true,
key: 'kick',
},
- name: 'Kick',
+ name: t('RoomSettings.perm_kick'),
},
{
location: {
action: true,
key: 'ban',
},
- name: 'Ban',
+ name: t('RoomSettings.perm_ban'),
},
{
location: {
action: true,
key: 'redact',
},
- name: 'Delete Others Messages',
+ name: t('RoomSettings.perm_delete_others_messages'),
},
{
location: {
key: MessageEvent.RoomRedaction,
},
- name: 'Delete Self Messages',
+ name: t('RoomSettings.perm_delete_self_messages'),
},
],
};
const roomOverviewGroup: PermissionGroup = {
- name: 'Room Overview',
+ name: t('RoomSettings.perm_room_overview'),
items: [
{
location: {
state: true,
key: StateEvent.RoomAvatar,
},
- name: 'Room Avatar',
+ name: t('RoomSettings.perm_room_avatar'),
},
{
location: {
state: true,
key: StateEvent.RoomName,
},
- name: 'Room Name',
+ name: t('RoomSettings.perm_room_name'),
},
{
location: {
state: true,
key: StateEvent.RoomTopic,
},
- name: 'Room Topic',
+ name: t('RoomSettings.perm_room_topic'),
},
],
};
const roomSettingsGroup: PermissionGroup = {
- name: 'Settings',
+ name: t('RoomSettings.perm_settings'),
items: [
{
location: {
state: true,
key: StateEvent.RoomJoinRules,
},
- name: 'Change Room Access',
+ name: t('RoomSettings.perm_change_room_access'),
},
{
location: {
state: true,
key: StateEvent.RoomCanonicalAlias,
},
- name: 'Publish Address',
+ name: t('RoomSettings.perm_publish_address'),
},
{
location: {
state: true,
key: StateEvent.RoomPowerLevels,
},
- name: 'Change All Permission',
+ name: t('RoomSettings.perm_change_all_permission'),
},
{
location: {
state: true,
key: StateEvent.PowerLevelTags,
},
- name: 'Edit Power Levels',
+ name: t('RoomSettings.perm_edit_power_levels'),
},
{
location: {
state: true,
key: StateEvent.RoomEncryption,
},
- name: 'Enable Encryption',
+ name: t('RoomSettings.perm_enable_encryption'),
},
{
location: {
state: true,
key: StateEvent.RoomHistoryVisibility,
},
- name: 'History Visibility',
+ name: t('RoomSettings.perm_history_visibility'),
},
{
location: {
state: true,
key: StateEvent.RoomTombstone,
},
- name: 'Upgrade Room',
+ name: t('RoomSettings.perm_upgrade_room'),
},
{
location: {
state: true,
},
- name: 'Other Settings',
+ name: t('RoomSettings.perm_other_settings'),
},
],
};
const otherSettingsGroup: PermissionGroup = {
- name: 'Other',
+ name: t('RoomSettings.perm_other'),
items: [
{
location: {
state: true,
key: StateEvent.PoniesRoomEmotes,
},
- name: 'Manage Emojis & Stickers',
+ name: t('RoomSettings.perm_manage_emojis_stickers'),
},
{
location: {
state: true,
key: StateEvent.RoomServerAcl,
},
- name: 'Change Server ACLs',
+ name: t('RoomSettings.perm_change_server_acls'),
},
{
location: {
state: true,
key: 'im.vector.modular.widgets',
},
- name: 'Modify Widgets',
+ name: t('RoomSettings.perm_modify_widgets'),
},
],
};
@@ -222,7 +224,7 @@ export const usePermissionGroups = (isCallRoom: boolean): PermissionGroup[] => {
roomSettingsGroup,
otherSettingsGroup,
];
- }, [isCallRoom]);
+ }, [isCallRoom, t]);
return groups;
};
diff --git a/src/app/hooks/useMemberFilter.ts b/src/app/hooks/useMemberFilter.ts
index 2c33c7c8..6de995bc 100644
--- a/src/app/hooks/useMemberFilter.ts
+++ b/src/app/hooks/useMemberFilter.ts
@@ -1,4 +1,5 @@
import { useMemo } from 'react';
+import { useTranslation } from 'react-i18next';
import { RoomMember } from 'matrix-js-sdk';
import { Membership } from '../../types/matrix/room';
@@ -21,32 +22,34 @@ export type MembershipFilterItem = {
filterFn: MembershipFilterFn;
};
-export const useMembershipFilterMenu = (): MembershipFilterItem[] =>
- useMemo(
+export const useMembershipFilterMenu = (): MembershipFilterItem[] => {
+ const { t } = useTranslation();
+ return useMemo(
() => [
{
- name: 'Joined',
+ name: t('RoomSettings.filter_joined'),
filterFn: MembershipFilter.filterJoined,
},
{
- name: 'Invited',
+ name: t('RoomSettings.filter_invited'),
filterFn: MembershipFilter.filterInvited,
},
{
- name: 'Left',
+ name: t('RoomSettings.filter_left'),
filterFn: MembershipFilter.filterLeaved,
},
{
- name: 'Kicked',
+ name: t('RoomSettings.filter_kicked'),
filterFn: MembershipFilter.filterKicked,
},
{
- name: 'Banned',
+ name: t('RoomSettings.filter_banned'),
filterFn: MembershipFilter.filterBanned,
},
],
- []
+ [t]
);
+};
export const useMembershipFilter = (
index: number,
diff --git a/src/app/hooks/useMemberSort.ts b/src/app/hooks/useMemberSort.ts
index 48d2f605..2277683a 100644
--- a/src/app/hooks/useMemberSort.ts
+++ b/src/app/hooks/useMemberSort.ts
@@ -1,5 +1,6 @@
import { RoomMember } from 'matrix-js-sdk';
import { useCallback, useMemo } from 'react';
+import { useTranslation } from 'react-i18next';
export const MemberSort = {
Ascending: (a: RoomMember, b: RoomMember) =>
@@ -19,28 +20,30 @@ export type MemberSortItem = {
sortFn: MemberSortFn;
};
-export const useMemberSortMenu = (): MemberSortItem[] =>
- useMemo(
+export const useMemberSortMenu = (): MemberSortItem[] => {
+ const { t } = useTranslation();
+ return useMemo(
() => [
{
- name: 'A to Z',
+ name: t('RoomSettings.sort_a_to_z'),
sortFn: MemberSort.Ascending,
},
{
- name: 'Z to A',
+ name: t('RoomSettings.sort_z_to_a'),
sortFn: MemberSort.Descending,
},
{
- name: 'Newest',
+ name: t('RoomSettings.sort_newest'),
sortFn: MemberSort.NewestFirst,
},
{
- name: 'Oldest',
+ name: t('RoomSettings.sort_oldest'),
sortFn: MemberSort.Oldest,
},
],
- []
+ [t]
);
+};
export const useMemberSort = (index: number, memberSort: MemberSortItem[]): MemberSortItem => {
const item = memberSort[index] ?? memberSort[0];
@@ -61,7 +64,7 @@ export const useMemberPowerSort = (
return getPowerLevel(b.userId) - getPowerLevel(a.userId);
},
- [creators]
+ [creators, getPowerLevel]
);
return sort;
diff --git a/src/app/hooks/usePowerLevelTags.ts b/src/app/hooks/usePowerLevelTags.ts
index 519774e5..8c2e72f7 100644
--- a/src/app/hooks/usePowerLevelTags.ts
+++ b/src/app/hooks/usePowerLevelTags.ts
@@ -1,5 +1,6 @@
import { Room } from 'matrix-js-sdk';
import { useMemo } from 'react';
+import { useTranslation } from 'react-i18next';
import { IPowerLevels } from './usePowerLevels';
import { useStateEvent } from './useStateEvent';
import { MemberPowerTag, StateEvent } from '../../types/matrix/room';
@@ -45,76 +46,91 @@ export const getUsedPowers = (powerLevels: IPowerLevels): Set => {
return powers;
};
-const DEFAULT_TAGS: PowerLevelTags = {
+type TFunction = (key: string) => string;
+
+const getDefaultTags = (t: TFunction): PowerLevelTags => ({
9001: {
- name: 'Goku',
+ name: t('RoomSettings.power_goku'),
color: '#ff6a00',
},
150: {
- name: 'Manager',
+ name: t('RoomSettings.power_manager'),
color: '#ff6a7f',
},
101: {
- name: 'Founder',
+ name: t('RoomSettings.power_founder'),
color: '#0000ff',
},
100: {
- name: 'Admin',
+ name: t('RoomSettings.power_admin'),
color: '#0088ff',
},
50: {
- name: 'Moderator',
+ name: t('RoomSettings.power_moderator'),
color: '#1fd81f',
},
0: {
- name: 'Member',
+ name: t('RoomSettings.power_member'),
color: '#91cfdf',
},
[-1]: {
- name: 'Muted',
+ name: t('RoomSettings.power_muted'),
color: '#888888',
},
-};
+});
-const generateFallbackTag = (powerLevelTags: PowerLevelTags, power: number): MemberPowerTag => {
+const generateFallbackTag = (powerLevelTags: PowerLevelTags, power: number, t: TFunction): MemberPowerTag => {
const highToLow = sortPowers(getPowers(powerLevelTags));
const tagPower = highToLow.find((p) => p < power);
const tag = typeof tagPower === 'number' ? powerLevelTags[tagPower] : undefined;
return {
- name: tag ? `${tag.name} ${power}` : `Team ${power}`,
+ name: tag ? `${tag.name} ${power}` : `${t('RoomSettings.power_team')} ${power}`,
};
};
const LEGACY_CINNY_POWER_LEVEL_TAGS = 'in.cinny.room.power_level_tags' as StateEvent;
export const usePowerLevelTags = (room: Room, powerLevels: IPowerLevels): PowerLevelTags => {
+ const { t } = useTranslation();
const tagsEvent = useStateEvent(room, StateEvent.PowerLevelTags);
const legacyTagsEvent = useStateEvent(room, LEGACY_CINNY_POWER_LEVEL_TAGS);
const activeTagsEvent = tagsEvent ?? legacyTagsEvent;
const powerLevelTags: PowerLevelTags = useMemo(() => {
+ const defaultTags = getDefaultTags(t);
const content = activeTagsEvent?.getContent();
const powerToTags: PowerLevelTags = { ...content };
const powers = getUsedPowers(powerLevels);
Array.from(powers).forEach((power) => {
if (powerToTags[power]?.name === undefined) {
- powerToTags[power] = DEFAULT_TAGS[power] ?? generateFallbackTag(DEFAULT_TAGS, power);
+ powerToTags[power] = defaultTags[power] ?? generateFallbackTag(defaultTags, power, t);
}
});
return powerToTags;
- }, [powerLevels, activeTagsEvent]);
+ }, [powerLevels, activeTagsEvent, t]);
return powerLevelTags;
};
+const generateFallbackTagSimple = (powerLevelTags: PowerLevelTags, power: number): MemberPowerTag => {
+ const highToLow = sortPowers(getPowers(powerLevelTags));
+
+ const tagPower = highToLow.find((p) => p < power);
+ const tag = typeof tagPower === 'number' ? powerLevelTags[tagPower] : undefined;
+
+ return {
+ name: tag ? `${tag.name} ${power}` : `#${power}`,
+ };
+};
+
export const getPowerLevelTag = (
powerLevelTags: PowerLevelTags,
powerLevel: number
): MemberPowerTag => {
const tag: MemberPowerTag | undefined = powerLevelTags[powerLevel];
- return tag ?? generateFallbackTag(powerLevelTags, powerLevel);
+ return tag ?? generateFallbackTagSimple(powerLevelTags, powerLevel);
};
diff --git a/src/app/hooks/useRoomCreatorsTag.ts b/src/app/hooks/useRoomCreatorsTag.ts
index 2d6db0ec..53eaa353 100644
--- a/src/app/hooks/useRoomCreatorsTag.ts
+++ b/src/app/hooks/useRoomCreatorsTag.ts
@@ -1,8 +1,14 @@
+import { useMemo } from 'react';
+import { useTranslation } from 'react-i18next';
import { MemberPowerTag } from '../../types/matrix/room';
-const DEFAULT_TAG: MemberPowerTag = {
- name: 'Founder',
- color: '#0000ff',
+export const useRoomCreatorsTag = (): MemberPowerTag => {
+ const { t } = useTranslation();
+ return useMemo(
+ () => ({
+ name: t('RoomSettings.power_founder'),
+ color: '#0000ff',
+ }),
+ [t]
+ );
};
-
-export const useRoomCreatorsTag = (): MemberPowerTag => DEFAULT_TAG;