feat(i18n): pick language from ?lang, saved choice or browser language
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
614b331188
commit
28b1b88ace
4 files changed
+72
-37
No files matched your search
@@ -2,31 +2,35 @@ import { Injectable, signal } from '@angular/core';
|
||||
|
||||
import type { LanguageCode } from '../../languages/language.types';
|
||||
|
||||
const isLanguageCode = (value: string | null): value is LanguageCode =>
|
||||
value === 'en' || value === 'de';
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class LanguagePreferenceService {
|
||||
private static readonly storageKey = 'portfolio-language';
|
||||
private readonly currentLanguageCode = signal<LanguageCode>('en');
|
||||
private readonly languageConfirmed = signal(true);
|
||||
|
||||
readonly languageCode = this.currentLanguageCode.asReadonly();
|
||||
readonly isLanguageConfirmed = this.languageConfirmed.asReadonly();
|
||||
|
||||
initializeFromStorage(): LanguageCode {
|
||||
/** Picks the language from `?lang=`, then the stored choice, then the browser language. */
|
||||
initialize(): LanguageCode {
|
||||
if (typeof window === 'undefined') {
|
||||
return this.currentLanguageCode();
|
||||
}
|
||||
|
||||
const storedLanguage = window.localStorage.getItem(LanguagePreferenceService.storageKey);
|
||||
if (storedLanguage === 'de' || storedLanguage === 'en') {
|
||||
this.currentLanguageCode.set(storedLanguage);
|
||||
}
|
||||
const candidates = [
|
||||
new URLSearchParams(window.location.search).get('lang'),
|
||||
window.localStorage.getItem(LanguagePreferenceService.storageKey),
|
||||
window.navigator.language.slice(0, 2).toLowerCase(),
|
||||
];
|
||||
const language = candidates.find(isLanguageCode) ?? 'en';
|
||||
this.currentLanguageCode.set(language);
|
||||
|
||||
return this.currentLanguageCode();
|
||||
return language;
|
||||
}
|
||||
|
||||
confirmLanguage(code: LanguageCode): void {
|
||||
this.currentLanguageCode.set(code);
|
||||
this.languageConfirmed.set(true);
|
||||
|
||||
if (typeof window !== 'undefined') {
|
||||
window.localStorage.setItem(LanguagePreferenceService.storageKey, code);
|
||||
|
||||
Reference in new issue
Block a user