feat: Rename to Toju and add translation
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:17:29 +02:00
parent 8ecfc9a1fe
commit ee293d7daf
301 changed files with 8247 additions and 2218 deletions
@@ -52,6 +52,7 @@ import { VoiceWorkspacePlaybackService } from './voice-workspace-playback.servic
import { VoiceWorkspaceStreamTileComponent } from './voice-workspace-stream-tile/voice-workspace-stream-tile.component';
import { VoiceWorkspaceStreamItem } from './voice-workspace.models';
import { ThemeNodeDirective } from '../../../domains/theme';
import { APP_TRANSLATE_IMPORTS, AppI18nService } from '../../../core/i18n';
@Component({
selector: 'app-voice-workspace',
@@ -62,7 +63,8 @@ import { ThemeNodeDirective } from '../../../domains/theme';
ScreenShareQualityDialogComponent,
VoiceWorkspaceStreamTileComponent,
UserAvatarComponent,
ThemeNodeDirective
ThemeNodeDirective,
...APP_TRANSLATE_IMPORTS
],
viewProviders: [
provideIcons({
@@ -97,6 +99,7 @@ export class VoiceWorkspaceComponent {
private readonly workspacePlayback = inject(VoiceWorkspacePlaybackService);
private readonly voiceSession = inject(VoiceSessionFacade);
private readonly voiceWorkspace = inject(VoiceWorkspaceService);
private readonly appI18n = inject(AppI18nService);
private readonly remoteStreamRevision = signal(0);
@@ -303,14 +306,16 @@ export class VoiceWorkspaceComponent {
const share = this.widescreenShare();
if (!share) {
return 'Focused stream';
return this.appI18n.instant('voice.workspace.focusedStreamFallback');
}
if (!share.isLocal) {
return share.user.displayName;
}
return share.kind === 'camera' ? 'Your camera' : 'Your screen';
return share.kind === 'camera'
? this.appI18n.instant('voice.workspace.yourCamera')
: this.appI18n.instant('voice.workspace.yourScreen');
});
readonly thumbnailShares = computed(() => {
const widescreenShareId = this.widescreenShareId();
@@ -328,14 +333,16 @@ export class VoiceWorkspaceComponent {
const previewShare = this.miniPreviewShare();
if (!previewShare) {
return 'Voice workspace';
return this.appI18n.instant('voice.workspace.voiceWorkspace');
}
if (!previewShare.isLocal) {
return previewShare.user.displayName;
}
return previewShare.kind === 'camera' ? 'Your camera' : 'Your screen';
return previewShare.kind === 'camera'
? this.appI18n.instant('voice.workspace.yourCamera')
: this.appI18n.instant('voice.workspace.yourScreen');
});
readonly liveShareCount = computed(() => this.activeShares().length);
readonly connectedVoiceChannelName = computed(() => {
@@ -352,12 +359,24 @@ export class VoiceWorkspaceComponent {
const sessionRoomName = this.voiceSessionInfo()?.roomName?.replace(/^🔊\s*/, '');
return sessionRoomName || 'Voice Lounge';
return sessionRoomName || this.appI18n.instant('voice.workspace.voiceLounge');
});
readonly serverName = computed(
() => this.currentRoom()?.name || this.voiceSessionInfo()?.serverName || 'Voice server'
() => this.currentRoom()?.name || this.voiceSessionInfo()?.serverName || this.appI18n.instant('voice.workspace.voiceServer')
);
liveStreamCountLabel(count: number): string {
const key = count === 1 ? 'voice.workspace.liveStream' : 'voice.workspace.liveStreams';
return this.appI18n.instant(key, { count });
}
miniWindowStreamHint(count: number): string {
const key = count === 1 ? 'voice.workspace.miniWindowHintSingle' : 'voice.workspace.miniWindowHint';
return this.appI18n.instant(key, { count });
}
constructor() {
this.destroyRef.onDestroy(() => {
this.clearHeaderHideTimeout();