feat: Rename to Toju and add translation
Some checks failed
Deploy Web Apps / deploy (push) Successful in 5m52s
Build Android APK / build-android-apk (push) Failing after 23m15s
Queue Release Build / prepare (push) Successful in 1m42s
Queue Release Build / build-linux (push) Failing after 9m33s
Queue Release Build / build-windows (push) Successful in 26m5s
Queue Release Build / finalize (push) Has been skipped

This commit is contained in:
2026-06-05 17:13:03 +02:00
parent 8ecfc9a1fe
commit ee293d7daf
301 changed files with 8247 additions and 2218 deletions

View File

@@ -5,6 +5,7 @@ import {
RoomRoleAssignment
} from '../../../../shared-kernel';
import { SYSTEM_ROLE_IDS } from '../constants/access-control.constants';
import { localizeSystemRoleDisplayName } from './role-display.rules';
import type { MemberIdentity } from '../models/access-control.model';
import {
buildRoleLookup,
@@ -106,13 +107,19 @@ export function getAssignedRoleIds(assignments: readonly RoomRoleAssignment[] |
return uniqueStrings(assignment?.roleIds ?? []);
}
export function getDisplayRoleName(room: Room, member: MemberIdentity | null | undefined): string {
export function getDisplayRoleName(
room: Room,
member: MemberIdentity | null | undefined,
translate?: (key: string) => string
): string {
const translateOr = (key: string, fallback: string) => translate?.(key) ?? fallback;
if (!member) {
return 'Member';
return translateOr('shared.leaveServer.roles.member', 'Member');
}
if (room.hostId === member.id || room.hostId === member.oderId) {
return 'Owner';
return translateOr('shared.leaveServer.roles.owner', 'Owner');
}
const roles = normalizeRoomRoles(room.roles, room.permissions);
@@ -121,8 +128,13 @@ export function getDisplayRoleName(room: Room, member: MemberIdentity | null | u
.map((roleId) => roleLookup.get(roleId))
.filter((role): role is RoomRole => !!role)
.sort(roleSortDescending);
const roleName = assignedRoles[0]?.name;
return assignedRoles[0]?.name || '@everyone';
if (!roleName) {
return translateOr('shared.accessControl.roles.everyone', '@everyone');
}
return translate ? localizeSystemRoleDisplayName(roleName, translate) : roleName;
}
export function getAssignedRoles(room: Room, identity: MemberIdentity | null | undefined): RoomRole[] {

View File

@@ -0,0 +1,37 @@
import {
describe,
expect,
it
} from 'vitest';
import { localizeSystemRoleDisplayName, resolveSystemRoleDisplayI18nKey } from './role-display.rules';
describe('role-display.rules', () => {
describe('resolveSystemRoleDisplayI18nKey', () => {
it('maps built-in role display names to i18n keys', () => {
expect(resolveSystemRoleDisplayI18nKey('Member')).toBe('shared.leaveServer.roles.member');
expect(resolveSystemRoleDisplayI18nKey('Owner')).toBe('shared.leaveServer.roles.owner');
expect(resolveSystemRoleDisplayI18nKey('@everyone')).toBe('shared.accessControl.roles.everyone');
expect(resolveSystemRoleDisplayI18nKey('Moderator')).toBe('shared.leaveServer.roles.moderator');
expect(resolveSystemRoleDisplayI18nKey('Admin')).toBe('shared.leaveServer.roles.admin');
});
it('returns null for custom role names', () => {
expect(resolveSystemRoleDisplayI18nKey('Custom Role')).toBeNull();
});
});
describe('localizeSystemRoleDisplayName', () => {
it('translates known system role names', () => {
const translate = (key: string) => `translated:${key}`;
expect(localizeSystemRoleDisplayName('Admin', translate)).toBe('translated:shared.leaveServer.roles.admin');
});
it('returns custom role names unchanged', () => {
const translate = (key: string) => `translated:${key}`;
expect(localizeSystemRoleDisplayName('Event Host', translate)).toBe('Event Host');
});
});
});

View File

@@ -0,0 +1,20 @@
const SYSTEM_ROLE_DISPLAY_I18N_KEYS: Readonly<Record<string, string>> = {
Member: 'shared.leaveServer.roles.member',
Owner: 'shared.leaveServer.roles.owner',
'@everyone': 'shared.accessControl.roles.everyone',
Moderator: 'shared.leaveServer.roles.moderator',
Admin: 'shared.leaveServer.roles.admin'
};
export function resolveSystemRoleDisplayI18nKey(displayName: string): string | null {
return SYSTEM_ROLE_DISPLAY_I18N_KEYS[displayName] ?? null;
}
export function localizeSystemRoleDisplayName(
displayName: string,
translate: (key: string) => string
): string {
const key = resolveSystemRoleDisplayI18nKey(displayName);
return key ? translate(key) : displayName;
}