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
@@ -1,6 +1,6 @@
<app-modal-backdrop
[zIndex]="112"
ariaLabel="Close profile image editor"
ariaLabel="{{ 'profile.avatarEditor.closeAria' | translate }}"
(dismissed)="cancelled.emit(undefined)"
/>
@@ -12,7 +12,7 @@
tabindex="-1"
>
<div class="border-b border-border p-5">
<h3 class="text-lg font-semibold text-foreground">Adjust profile picture</h3>
<h3 class="text-lg font-semibold text-foreground">{{ 'profile.avatarEditor.title' | translate }}</h3>
<p class="mt-1 text-sm text-muted-foreground">
@if (preservesAnimation()) {
Animated GIF and WebP avatars keep their original animation and framing.
@@ -133,7 +133,7 @@
(click)="cancelled.emit(undefined)"
[disabled]="processing()"
>
Cancel
{{ 'shared.dialog.cancel' | translate }}
</button>
<button
type="button"
@@ -141,7 +141,7 @@
(click)="confirm()"
[disabled]="processing()"
>
{{ processing() ? 'Saving...' : 'Apply picture' }}
{{ processing() ? ('profile.avatarEditor.saving' | translate) : ('profile.avatarEditor.apply' | translate) }}
</button>
</div>
</div>
@@ -10,6 +10,7 @@ import {
import { CommonModule } from '@angular/common';
import { ProfileAvatarFacade } from '../../application/services/profile-avatar.facade';
import { ModalBackdropComponent } from '../../../../shared';
import { APP_TRANSLATE_IMPORTS, AppI18nService } from '../../../../core/i18n';
import {
EditableProfileAvatarSource,
ProcessedProfileAvatar,
@@ -22,12 +23,14 @@ import {
@Component({
selector: 'app-profile-avatar-editor',
standalone: true,
imports: [CommonModule, ModalBackdropComponent],
imports: [CommonModule, ModalBackdropComponent, ...APP_TRANSLATE_IMPORTS],
templateUrl: './profile-avatar-editor.component.html'
})
export class ProfileAvatarEditorComponent {
readonly source = input.required<EditableProfileAvatarSource>();
private readonly appI18n = inject(AppI18nService);
private readonly avatar = inject(ProfileAvatarFacade);
readonly source = input.required<EditableProfileAvatarSource>();
readonly cancelled = output<undefined>();
readonly confirmed = output<ProcessedProfileAvatar>();
@@ -47,7 +50,6 @@ export class ProfileAvatarEditorComponent {
return `translate(-50%, -50%) translate(${transform.offsetX}px, ${transform.offsetY}px) scale(${scale})`;
});
private readonly avatar = inject(ProfileAvatarFacade);
private dragPointerId: number | null = null;
private dragOrigin: { x: number; y: number; offsetX: number; offsetY: number } | null = null;
@@ -150,7 +152,7 @@ export class ProfileAvatarEditorComponent {
this.confirmed.emit(avatar);
} catch {
this.errorMessage.set('Failed to process profile image.');
this.errorMessage.set(this.appI18n.instant('profile.avatarEditor.processFailed'));
} finally {
this.processing.set(false);
}