i18n: extract Authorization screens into a new auth namespace (Part of #145) - #208
Merged
Merged
Conversation
Every user-facing string under src/views/Authorization/ moves to i18next.
English only — no translations in this PR, so it is language-agnostic and
reviewable as a pure refactor.
Covered:
- LoginView — primary/sub-account tabs, credential form, social and
Authentik buttons, welcome-back state, every auth error toast
- Signup — account creation form and each field-validation message
- ForgotPasswordView / UpdatePasswordView — reset flow and its toasts
- Authenticating — the OAuth landing screen, including its MFA branches
- MFAVerificationModal — code entry, backup codes, error states
- AuthFields / LoginSettings — shared field labels and server settings
`auth` is registered in src/i18n/config.js; public/locales/en/auth.json
holds the 103 keys. The Crowdin config picks up /public/locales/en/*.json
by glob, so the namespace flows into the pipeline with no change to
crowdin.yml.
No behaviour change: every t() value is the string that rendered before,
character for character — checked mechanically against this branch's base.
The e2e suite selects auth controls by visible text ('Create account',
'Username must be at least 4 characters'), so a green run is the proof.
Two fixes fell out of the extraction:
- AuthPasswordField had label='Password' as a prop default, so neither
LoginView nor Signup passed one. A default cannot be translated at module
scope, so the label moves to the call sites and both now pass it.
- AuthDivider defaulted children to 'or' for the same reason; it now falls
back to t('or').
This was referenced Aug 12, 2026
meauxt
approved these changes
Aug 13, 2026
meauxt
left a comment
Contributor
There was a problem hiding this comment.
@everysingletear Thank you <3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #145. Replaces #168, which was extracted against the pre-revamp screens and could not be rebased — the zone had been reshaped enough that the old hunks had nothing left to apply to. This is a fresh extraction against current
develop.Every user-facing string under
src/views/Authorization/moves into a newauthnamespace. English only — no translations here, so it is language-agnostic and reviewable as a pure refactor.What moves
LoginViewSignupForgotPasswordViewUpdatePasswordViewAuthenticatingMFAVerificationModalAuthFields/LoginSettingsauthis registered insrc/i18n/config.js;public/locales/en/auth.jsonholds the 103 keys. Your Crowdin config picks up/public/locales/en/*.jsonby glob, so the namespace flows into the pipeline with no change tocrowdin.yml.On "no behaviour change"
Every
t()value is the string that rendered before, character for character — checked mechanically against this branch's base rather than by eye, across all 130 call sites.The e2e suite is a second, independent check: it selects auth controls by visible text (
getByRole('button', { name: 'Create account' }),getByText('Username must be at least 4 characters')), so a greenauth.spec.jsmeans nothing rendered differently.The one place the diff isn't purely mechanical
AuthPasswordFieldhadlabel = 'Password'as a prop default, and neitherLoginViewnorSignuppassed a label. A prop default is evaluated at module scope, wheretisn't available, so the label moves to the call sites and both now pass it explicitly. Same rendered output; flagging it because it is the only structural change in the diff.AuthDividerhadchildren = 'or'for the same reason — it now falls back tot('or')when no children are given.Scope notes
MFAVerificationModalis included this time. I left it out of #168 because it looked entangled with the MFA flow; on a second read it isn't — the diff there is string replacement only.Authenticating.jsxis included for a similar reason: it sits in the same zone, and leaving it hardcoded would only have meant a follow-up round.Rebased on current
develop; build is green.