ΠΠΎΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½Π°
ΠΡΠ΄ΠΈΡ ΡΠΈΡΠΈ pokemon-tamagotchi. ΠΠ°ΠΉΠ΄Π΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ i18n/Transloco: ΠΎΡΠΈΡΠΎΡΠ΅Π²ΡΠΈΠ΅ ΠΈ ΠΌΡΡΡΠ²ΠΎ-Π΄ΡΠ±Π»ΠΈΡΡΡΡΠΈΠ΅ ΠΊΠ»ΡΡΠΈ, ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ translate() ΠΏΠΎ Π»Π΅Π½ΠΈΠ²ΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΠΎΠΌΡ scope (Π³ΠΎΠ½ΠΊΠ°) ΠΈ Ρ
ΡΡΠΏΠΊΠ°Ρ ΡΠ²ΡΠΈΡΡΠΈΠΊΠ° Β«ΡΡΡΠΎΠΊΠ° Ρ ΡΠΎΡΠΊΠΎΠΉ = ΠΊΠ»ΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π°Β», ΠΏΡΠΎΠ΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π² Π΄Π²ΡΡ
ΠΌΠ΅ΡΡΠ°Ρ
. ΠΡΠ΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½Ρ Π΄Π²ΡΠΌΡ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°ΠΌΠΈ.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΠΊΠ°
π‘ 1. Π‘ΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ translate() ΠΏΠΎ Π»Π΅Π½ΠΈΠ²ΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΠΎΠΌΡ scope Π² root-ΡΠ΅ΡΠ²ΠΈΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
TamagotchiNotificationService (@Injectable({ providedIn:'root' })) ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ ΠΊΠ»ΡΡΠΈ ΡΠΎΡΡΠΎΠ² ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ: this.transloco.translate(\${NOTIFICATION_SCOPE}.${key}`)(notification.service.ts:83-85). ScopepokemonTamagotchi β **Π»Π΅Π½ΠΈΠ²ΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΡΠΉ** (provideTranslocoScopeΠ² routes.ts:17 + HTTP-ΡΠ΅ΡΡ JSON ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ*transloco). ΠΠΎ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΡΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠ°ΡΠ°Π΄Π° Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ scope: ΡΡΡΠ΅ΠΊΡ Β«evolution readyΒ» (facade.ts:136-146) ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ bootstrapFromProfile, Π΅ΡΠ»ΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΆΠ΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ΅Ρ ΠΊΡΠΈΡΠ΅ΡΠΈΡΠΌ; ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΊ ΡΠ°ΠΉΠΌΠ΅ΡΠ° (facade.ts:284) ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½Π΅ΡΡΠΈ alerts ΠΏΠΎΡΠ»Π΅ ΠΎΡΠ»Π°ΠΉΠ½-decay. ΠΡΠ»ΠΈ JSON scope Π΅ΡΡ Π½Π΅ Π΄ΠΎΠ΅Ρ
Π°Π», translate()Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ **ΡΠ°ΠΌ ΠΊΠ»ΡΡ** β Taiga-ΡΠΎΡΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΡpokemonTamagotchi.notifications.evolution.readyTitle` Π²ΠΌΠ΅ΡΡΠΎ ΡΠ΅ΠΊΡΡΠ°. Π’ΠΎ ΠΆΠ΅ ΠΎΠΊΠ½ΠΎ β ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠ·ΡΠΊΠ°.
ΠΡΠ°Π½Ρ: ΡΠ°ΠΌΠΎ ΠΎΡΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΎΡ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° Β«Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° Π² ΡΠ°Π±Π»ΠΎΠ½Π΅Β» Π·Π΄Π΅ΡΡ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΎ β ΡΠΎΡΡΠ°ΠΌ ΡΠ΅ΡΠ΅Π· AppNotificationService Π½ΡΠΆΠ½Π° Π³ΠΎΡΠΎΠ²Π°Ρ ΡΡΡΠΎΠΊΠ°, Π° ΠΈΡΡΠΎΡΠΈΡ Π² ΡΠ°Π±Π»ΠΎΠ½Π΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ΅-ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅ΡΠ΅Π· t(). ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎΡΡΠΈ Π΄ΠΎ Π·Π°Π³ΡΡΠ·ΠΊΠΈ scope.
π«₯ 2. ΠΡΠΈΡΠΎΡΠ΅Π²ΡΠΈΠ΅ i18n-ΠΊΠ»ΡΡΠΈ: disabledSleeping ΠΈ ΠΌΡΡΡΠ²Π°Ρ Π²Π΅ΡΠΊΠ° alerts.evolutionReady
actions.disabledSleeping (Β«PokΓ©mon is sleepingΒ») Π΅ΡΡΡ Π² ΠΎΠ±ΠΎΠΈΡ
JSON, Π½ΠΎ Π½Π΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π΅ΡΡΡ Π½ΠΈΠ³Π΄Π΅ Π² src: ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠΊΠ΅ΠΌΠΎΠ½ ΡΠΏΠΈΡ, awake-ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π΅ ΡΠ΅Π½Π΄Π΅ΡΡΡΡΡ, Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ sleep/wakeUp Π½Π°Π·Π½Π°ΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ disabledTraining.
notifications.alerts.evolutionReady.title/message (en/ru.json:89-92) Π΄ΠΎΡΡΠΈΠΆΠΈΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· ALERT_TEMPLATES.evolutionReady, Π½ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΠ΄-ΠΏΡΡΡ Π½Π΅ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ StatusAlertType 'evolutionReady': STAT_ALERT_CONFIG ΠΏΠΎΠΊΡΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ hunger/mood/energy/hydration, Π° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, ΡΠΏΠΎΡΠΎΠ±Π½ΡΠΉ Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ alert (notifyStatusAlerts), Π·ΠΎΠ²ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· ΡΠΏΠ΅ΠΊΠ°. ΠΠΈΠ²ΠΎΠΉ ΠΏΡΡΡ Β«Π³ΠΎΡΠΎΠ² ΠΊ ΡΠ²ΠΎΠ»ΡΡΠΈΠΈΒ» ΠΈΠ΄ΡΡ ΡΠ΅ΡΠ΅Π· notifyEvolutionReady β ΠΊΠ»ΡΡ notifications.evolution.readyTitle. ΠΡΠΎΠ³: Π΄Π²Π΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ, ΠΎΠ΄Π½Π° ΠΌΡΡΡΠ²Π°Ρ β ΠΌΡΡΠΎΡ Π² ΠΎΠ±Π΅ΠΈΡ
Π»ΠΎΠΊΠ°Π»ΡΡ
ΠΈ Π»ΠΎΠ²ΡΡΠΊΠ° Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ°.
π«₯ 3. Π₯ΡΡΠΏΠΊΠ°Ρ ΡΠ²ΡΠΈΡΡΠΈΠΊΠ° Β«ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΡΠΊΡ = ΠΊΠ»ΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π°Β», ΠΏΡΠΎΠ΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π² Π΄Π²ΡΡ
ΠΌΠ΅ΡΡΠ°Ρ
NotificationModel.title/message Π½Π΅ΡΡΡ Π»ΠΈΠ±ΠΎ i18n-ΠΊΠ»ΡΡ, Π»ΠΈΠ±ΠΎ ΡΡΡΠΎΠΉ ΡΠ΅ΠΊΡΡ (ΠΈΠΌΡ ΠΏΠΎΠΊΠ΅ΠΌΠΎΠ½Π° Π² notificationFromEvolutionReady), Π° ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ ΡΠ²ΡΠΈΡΡΠΈΠΊΠΎΠΉ value.includes('.'), ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² Π΄Π²Π° Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ
ΠΌΠ΅ΡΡΠ°: resolveText (notification.service.ts:75-81) ΠΈ isTranslationKey (notification.component.ts:24-26). ΠΠΎΠ½ΡΡΠ°ΠΊΡ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½ ΡΠΈΠΏΠΎΠΌ: Π»ΡΠ±ΠΎΠ΅ Π±ΡΠ΄ΡΡΠ΅Π΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Ρ ΡΡΡΡΠΌ ΡΠ΅ΠΊΡΡΠΎΠΌ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΌ ΡΠΎΡΠΊΡ (Β«Progress saved.Β», ΠΈΠΌΡ Β«Mr. MimeΒ»), ΠΌΠΎΠ»ΡΠ° ΡΠΉΠ΄ΡΡ Π² transloco.translate β Π² ΠΈΡΡΠΎΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ²ΠΈΠ΄ΠΈΡ pokemonTamagotchi.notifications.Progress saved.. ΠΡΠΈΠ±ΠΊΠ° Π½Π΅ Π»ΠΎΠ²ΠΈΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ/Π»ΠΈΠ½ΡΠΎΠΌ, ΡΠΈΠ½ΠΈΡΡ ΠΏΡΠΈΠ΄ΡΡΡΡ Π² Π΄Π²ΡΡ
ΡΠ°ΠΉΠ»Π°Ρ
.
ΠΠ΄Π΅
ΠΠ°ΡΠΈΠ°Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ
- ΠΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΠΎΡΡΠΎΠ² (Π±Π°Π³ 1). ΠΠ°ΠΌΠ΅Π½ΠΈΡΡ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ
translate Π½Π° selectTranslate(key, params, 'pokemonTamagotchi') (ΠΆΠ΄ΡΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ scope; ΠΏΠ΅ΡΠ²ΡΡ ΡΠΌΠΈΡΡΠΈΡ ΡΠ΅ΡΠ΅Π· firstValueFrom/take(1)) ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠΎΡΡ Ρ Π³ΠΎΡΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ. ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° β ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΡΠΎΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ transloco.events$ (scope loaded).
- Π£Π±ΡΠ°ΡΡ ΠΎΡΠΈΡΠΎΡΠ΅Π²ΡΠΈΠ΅ ΠΊΠ»ΡΡΠΈ (Π±Π°Π³ 2). Π£Π΄Π°Π»ΠΈΡΡ
actions.disabledSleeping, Π±Π»ΠΎΠΊ alerts.evolutionReady ΠΈΠ· en/ru.json, Π·Π°ΠΏΠΈΡΡ evolutionReady ΠΈΠ· ALERT_TEMPLATES, ΡΠ»Π΅Π½ 'evolutionReady' ΠΈΠ· StatusAlertType ΠΈ ΠΌΠ΅ΡΠΎΠ΄ notifyStatusAlerts. ΠΠΈΠ±ΠΎ ΡΠ΅Π°Π»ΡΠ½ΠΎ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ (ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ disabledSleeping ΠΊΠ°ΠΊ hint Ρ wakeUp, ΡΠ»Π°ΡΡ evolutionReady ΡΠ΅ΡΠ΅Π· processStatusAlerts) β Π½ΠΎ ΡΠΎΠ³Π΄Π° ΡΠ±ΡΠ°ΡΡ Π΄ΡΠ±Π»Ρ notifications.evolution.readyTitle.
- ΠΠ°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ (Π±Π°Π³ 3). Π Π°Π·Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎΠ»Ρ (
titleKey: string | null + titleText: string | null, Π»ΠΈΠ±ΠΎ Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°ΡΠΎΡ isTranslated: boolean Π² NotificationModel) ΠΈ ΡΠ±ΡΠ°ΡΡ ΠΎΠ±Π΅ ΡΠ²ΡΠΈΡΡΠΈΠΊΠΈ β ΡΠ΅ΡΠ²ΠΈΡ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠΈΡΠ°ΡΡ ΡΠ²Π½ΡΠΉ ΠΏΡΠΈΠ·Π½Π°ΠΊ.
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ
ΠΠ°Π³ 1 β ΡΠ°ΠΌΡΠΉ Π²Π°ΠΆΠ½ΡΠΉ (user-facing: ΡΡΡΠΎΠΉ ΠΊΠ»ΡΡ Π² ΡΠΎΡΡΠ΅ ΠΏΡΠΈ ΠΎΡΠ»Π°ΠΉΠ½-Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅ ΠΈ ΡΠΌΠ΅Π½Π΅ ΡΠ·ΡΠΊΠ°), Π²Π°ΡΠΈΠ°Π½Ρ 1 (selectTranslate). ΠΠ°Π³ 3 β ΡΡΡΡΠ°Π½ΡΠ΅Ρ ΠΊΠΎΡΠ΅Π½Ρ (ΡΠ³Π°Π΄ΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΎΡΠΊΠ΅) ΠΈ Π·Π°ΠΎΠ΄Π½ΠΎ ΡΠ½ΠΈΠΌΠ°Π΅Ρ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β Π²Π°ΡΠΈΠ°Π½Ρ 3, Π΄Π΅Π»Π°ΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π±Π°Π³ΠΎΠΌ 2 (ΠΎΠ±Π° ΠΏΡΠΎ ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ). ΠΠ°Π³ 2 β Π²ΡΡΠΈΡΡΠΈΡΡ ΠΌΡΡΠΎΡ ΠΈΠ· Π»ΠΎΠΊΠ°Π»Π΅ΠΉ (Π²Π°ΡΠΈΠ°Π½Ρ Β«ΡΠ΄Π°Π»ΠΈΡΡΒ», Ρ.ΠΊ. ΠΆΠΈΠ²ΠΎΠΉ ΠΏΡΡΡ ΡΠ²ΠΎΠ»ΡΡΠΈΠΈ ΡΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ). ΠΡΠ΅ ΠΏΡΠ°Π²ΠΊΠΈ Π² data/ui-ΡΠ»ΠΎΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ + JSON.
ΠΡΠ°Π²ΠΈΠ»Π°: CLAUDE.md (i18n β Transloco), ΡΠΊΠΈΠ»Π» angular-best-practices-transloco (Π»Π΅Π½ΠΈΠ²ΡΠ΅ scope, selectTranslate); Π±Π°Π³ΠΈ 2-3 β ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡ/ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ.
ΠΠΎΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½Π°
ΠΡΠ΄ΠΈΡ ΡΠΈΡΠΈ
pokemon-tamagotchi. ΠΠ°ΠΉΠ΄Π΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ i18n/Transloco: ΠΎΡΠΈΡΠΎΡΠ΅Π²ΡΠΈΠ΅ ΠΈ ΠΌΡΡΡΠ²ΠΎ-Π΄ΡΠ±Π»ΠΈΡΡΡΡΠΈΠ΅ ΠΊΠ»ΡΡΠΈ, ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉtranslate()ΠΏΠΎ Π»Π΅Π½ΠΈΠ²ΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΠΎΠΌΡ scope (Π³ΠΎΠ½ΠΊΠ°) ΠΈ Ρ ΡΡΠΏΠΊΠ°Ρ ΡΠ²ΡΠΈΡΡΠΈΠΊΠ° Β«ΡΡΡΠΎΠΊΠ° Ρ ΡΠΎΡΠΊΠΎΠΉ = ΠΊΠ»ΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π°Β», ΠΏΡΠΎΠ΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π² Π΄Π²ΡΡ ΠΌΠ΅ΡΡΠ°Ρ . ΠΡΠ΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½Ρ Π΄Π²ΡΠΌΡ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°ΠΌΠΈ.ΠΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΠΊΠ°
π‘ 1. Π‘ΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ
translate()ΠΏΠΎ Π»Π΅Π½ΠΈΠ²ΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΠΎΠΌΡ scope Π² root-ΡΠ΅ΡΠ²ΠΈΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉTamagotchiNotificationService(@Injectable({ providedIn:'root' })) ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ ΠΊΠ»ΡΡΠΈ ΡΠΎΡΡΠΎΠ² ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ:this.transloco.translate(\${NOTIFICATION_SCOPE}.${key}`)(notification.service.ts:83-85). ScopepokemonTamagotchiβ **Π»Π΅Π½ΠΈΠ²ΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΡΠΉ** (provideTranslocoScopeΠ² routes.ts:17 + HTTP-ΡΠ΅ΡΡ JSON ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ*transloco). ΠΠΎ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΡΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠ°ΡΠ°Π΄Π° Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ scope: ΡΡΡΠ΅ΠΊΡ Β«evolution readyΒ» (facade.ts:136-146) ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅bootstrapFromProfile, Π΅ΡΠ»ΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΆΠ΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ΅Ρ ΠΊΡΠΈΡΠ΅ΡΠΈΡΠΌ; ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΊ ΡΠ°ΠΉΠΌΠ΅ΡΠ° (facade.ts:284) ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½Π΅ΡΡΠΈ alerts ΠΏΠΎΡΠ»Π΅ ΠΎΡΠ»Π°ΠΉΠ½-decay. ΠΡΠ»ΠΈ JSON scope Π΅ΡΡ Π½Π΅ Π΄ΠΎΠ΅Ρ Π°Π»,translate()Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ **ΡΠ°ΠΌ ΠΊΠ»ΡΡ** β Taiga-ΡΠΎΡΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΡpokemonTamagotchi.notifications.evolution.readyTitle` Π²ΠΌΠ΅ΡΡΠΎ ΡΠ΅ΠΊΡΡΠ°. Π’ΠΎ ΠΆΠ΅ ΠΎΠΊΠ½ΠΎ β ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠ·ΡΠΊΠ°.ΠΡΠ°Π½Ρ: ΡΠ°ΠΌΠΎ ΠΎΡΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΎΡ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° Β«Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° Π² ΡΠ°Π±Π»ΠΎΠ½Π΅Β» Π·Π΄Π΅ΡΡ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΎ β ΡΠΎΡΡΠ°ΠΌ ΡΠ΅ΡΠ΅Π·
AppNotificationServiceΠ½ΡΠΆΠ½Π° Π³ΠΎΡΠΎΠ²Π°Ρ ΡΡΡΠΎΠΊΠ°, Π° ΠΈΡΡΠΎΡΠΈΡ Π² ΡΠ°Π±Π»ΠΎΠ½Π΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ΅-ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅ΡΠ΅Π·t(). ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΡΡΠΈ Π΄ΠΎ Π·Π°Π³ΡΡΠ·ΠΊΠΈ scope.π«₯ 2. ΠΡΠΈΡΠΎΡΠ΅Π²ΡΠΈΠ΅ i18n-ΠΊΠ»ΡΡΠΈ:
disabledSleepingΠΈ ΠΌΡΡΡΠ²Π°Ρ Π²Π΅ΡΠΊΠ°alerts.evolutionReadyactions.disabledSleeping(Β«PokΓ©mon is sleepingΒ») Π΅ΡΡΡ Π² ΠΎΠ±ΠΎΠΈΡ JSON, Π½ΠΎ Π½Π΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π΅ΡΡΡ Π½ΠΈΠ³Π΄Π΅ Π² src: ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠΊΠ΅ΠΌΠΎΠ½ ΡΠΏΠΈΡ, awake-ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π΅ ΡΠ΅Π½Π΄Π΅ΡΡΡΡΡ, Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ sleep/wakeUp Π½Π°Π·Π½Π°ΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎdisabledTraining.notifications.alerts.evolutionReady.title/message(en/ru.json:89-92) Π΄ΠΎΡΡΠΈΠΆΠΈΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π·ALERT_TEMPLATES.evolutionReady, Π½ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΠ΄-ΠΏΡΡΡ Π½Π΅ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΡStatusAlertType 'evolutionReady':STAT_ALERT_CONFIGΠΏΠΎΠΊΡΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ hunger/mood/energy/hydration, Π° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, ΡΠΏΠΎΡΠΎΠ±Π½ΡΠΉ Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ alert (notifyStatusAlerts), Π·ΠΎΠ²ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· ΡΠΏΠ΅ΠΊΠ°. ΠΠΈΠ²ΠΎΠΉ ΠΏΡΡΡ Β«Π³ΠΎΡΠΎΠ² ΠΊ ΡΠ²ΠΎΠ»ΡΡΠΈΠΈΒ» ΠΈΠ΄ΡΡ ΡΠ΅ΡΠ΅Π·notifyEvolutionReadyβ ΠΊΠ»ΡΡnotifications.evolution.readyTitle. ΠΡΠΎΠ³: Π΄Π²Π΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ, ΠΎΠ΄Π½Π° ΠΌΡΡΡΠ²Π°Ρ β ΠΌΡΡΠΎΡ Π² ΠΎΠ±Π΅ΠΈΡ Π»ΠΎΠΊΠ°Π»ΡΡ ΠΈ Π»ΠΎΠ²ΡΡΠΊΠ° Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ°.π«₯ 3. Π₯ΡΡΠΏΠΊΠ°Ρ ΡΠ²ΡΠΈΡΡΠΈΠΊΠ° Β«ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΡΠΊΡ = ΠΊΠ»ΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π°Β», ΠΏΡΠΎΠ΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π² Π΄Π²ΡΡ ΠΌΠ΅ΡΡΠ°Ρ
NotificationModel.title/messageΠ½Π΅ΡΡΡ Π»ΠΈΠ±ΠΎ i18n-ΠΊΠ»ΡΡ, Π»ΠΈΠ±ΠΎ ΡΡΡΠΎΠΉ ΡΠ΅ΠΊΡΡ (ΠΈΠΌΡ ΠΏΠΎΠΊΠ΅ΠΌΠΎΠ½Π° Π²notificationFromEvolutionReady), Π° ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ ΡΠ²ΡΠΈΡΡΠΈΠΊΠΎΠΉvalue.includes('.'), ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² Π΄Π²Π° Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΌΠ΅ΡΡΠ°:resolveText(notification.service.ts:75-81) ΠΈisTranslationKey(notification.component.ts:24-26). ΠΠΎΠ½ΡΡΠ°ΠΊΡ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½ ΡΠΈΠΏΠΎΠΌ: Π»ΡΠ±ΠΎΠ΅ Π±ΡΠ΄ΡΡΠ΅Π΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Ρ ΡΡΡΡΠΌ ΡΠ΅ΠΊΡΡΠΎΠΌ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΌ ΡΠΎΡΠΊΡ (Β«Progress saved.Β», ΠΈΠΌΡ Β«Mr. MimeΒ»), ΠΌΠΎΠ»ΡΠ° ΡΠΉΠ΄ΡΡ Π²transloco.translateβ Π² ΠΈΡΡΠΎΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ²ΠΈΠ΄ΠΈΡpokemonTamagotchi.notifications.Progress saved.. ΠΡΠΈΠ±ΠΊΠ° Π½Π΅ Π»ΠΎΠ²ΠΈΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ/Π»ΠΈΠ½ΡΠΎΠΌ, ΡΠΈΠ½ΠΈΡΡ ΠΏΡΠΈΠ΄ΡΡΡΡ Π² Π΄Π²ΡΡ ΡΠ°ΠΉΠ»Π°Ρ .ΠΠ΄Π΅
translate()actions.disabledSleepingalerts.evolutionReadyALERT_TEMPLATES.evolutionReady.includes('.')(ΠΊΠΎΠΏΠΈΡ 1).includes('.')(ΠΊΠΎΠΏΠΈΡ 2)ΠΠ°ΡΠΈΠ°Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ
translateΠ½Π°selectTranslate(key, params, 'pokemonTamagotchi')(ΠΆΠ΄ΡΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ scope; ΠΏΠ΅ΡΠ²ΡΡ ΡΠΌΠΈΡΡΠΈΡ ΡΠ΅ΡΠ΅Π·firstValueFrom/take(1)) ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠΎΡΡ Ρ Π³ΠΎΡΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ. ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° β ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΡΠΎΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅transloco.events$(scope loaded).actions.disabledSleeping, Π±Π»ΠΎΠΊalerts.evolutionReadyΠΈΠ· en/ru.json, Π·Π°ΠΏΠΈΡΡevolutionReadyΠΈΠ·ALERT_TEMPLATES, ΡΠ»Π΅Π½'evolutionReady'ΠΈΠ·StatusAlertTypeΠΈ ΠΌΠ΅ΡΠΎΠ΄notifyStatusAlerts. ΠΠΈΠ±ΠΎ ΡΠ΅Π°Π»ΡΠ½ΠΎ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ (ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡdisabledSleepingΠΊΠ°ΠΊ hint Ρ wakeUp, ΡΠ»Π°ΡΡ evolutionReady ΡΠ΅ΡΠ΅Π·processStatusAlerts) β Π½ΠΎ ΡΠΎΠ³Π΄Π° ΡΠ±ΡΠ°ΡΡ Π΄ΡΠ±Π»Ρnotifications.evolution.readyTitle.titleKey: string | null+titleText: string | null, Π»ΠΈΠ±ΠΎ Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°ΡΠΎΡisTranslated: booleanΠ²NotificationModel) ΠΈ ΡΠ±ΡΠ°ΡΡ ΠΎΠ±Π΅ ΡΠ²ΡΠΈΡΡΠΈΠΊΠΈ β ΡΠ΅ΡΠ²ΠΈΡ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠΈΡΠ°ΡΡ ΡΠ²Π½ΡΠΉ ΠΏΡΠΈΠ·Π½Π°ΠΊ.Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ
ΠΠ°Π³ 1 β ΡΠ°ΠΌΡΠΉ Π²Π°ΠΆΠ½ΡΠΉ (user-facing: ΡΡΡΠΎΠΉ ΠΊΠ»ΡΡ Π² ΡΠΎΡΡΠ΅ ΠΏΡΠΈ ΠΎΡΠ»Π°ΠΉΠ½-Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅ ΠΈ ΡΠΌΠ΅Π½Π΅ ΡΠ·ΡΠΊΠ°), Π²Π°ΡΠΈΠ°Π½Ρ 1 (
selectTranslate). ΠΠ°Π³ 3 β ΡΡΡΡΠ°Π½ΡΠ΅Ρ ΠΊΠΎΡΠ΅Π½Ρ (ΡΠ³Π°Π΄ΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΎΡΠΊΠ΅) ΠΈ Π·Π°ΠΎΠ΄Π½ΠΎ ΡΠ½ΠΈΠΌΠ°Π΅Ρ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β Π²Π°ΡΠΈΠ°Π½Ρ 3, Π΄Π΅Π»Π°ΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π±Π°Π³ΠΎΠΌ 2 (ΠΎΠ±Π° ΠΏΡΠΎ ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ). ΠΠ°Π³ 2 β Π²ΡΡΠΈΡΡΠΈΡΡ ΠΌΡΡΠΎΡ ΠΈΠ· Π»ΠΎΠΊΠ°Π»Π΅ΠΉ (Π²Π°ΡΠΈΠ°Π½Ρ Β«ΡΠ΄Π°Π»ΠΈΡΡΒ», Ρ.ΠΊ. ΠΆΠΈΠ²ΠΎΠΉ ΠΏΡΡΡ ΡΠ²ΠΎΠ»ΡΡΠΈΠΈ ΡΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ). ΠΡΠ΅ ΠΏΡΠ°Π²ΠΊΠΈ Π² data/ui-ΡΠ»ΠΎΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ + JSON.ΠΡΠ°Π²ΠΈΠ»Π°: CLAUDE.md (i18n β Transloco), ΡΠΊΠΈΠ»Π»
angular-best-practices-transloco(Π»Π΅Π½ΠΈΠ²ΡΠ΅ scope,selectTranslate); Π±Π°Π³ΠΈ 2-3 β ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡ/ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ.