feat: backend i18n - #2842
Conversation
…management across multiple languages
…ference - Add go-i18n library for internationalization - Create i18n package with translation keys and YAML locale files (zh/en) - Implement i18n middleware for language detection from user settings and Accept-Language header - Add Language field to UserSetting DTO - Update API response helpers with i18n support (ApiErrorI18n, ApiSuccessI18n) - Migrate hardcoded messages in token, redemption, and user controllers - Add frontend language preference settings component - Sync language preference across header selector and user settings - Auto-restore user language preference on login
- Change default language fallback to English instead of Chinese - Add ErrRedeemFailed typed error for model layer translation - Migrate remaining hardcoded messages in controller/user.go - Add translation keys: redeem.failed, user.create_default_token_error, common.uuid_duplicate, common.invalid_input
The i18n middleware runs before UserAuth, so user settings weren't available when language was detected. Now GetLangFromContext checks user settings first (set by UserAuth) before falling back to the language set by middleware or Accept-Language header.
|
Caution Review failedThe pull request is closed. WalkthroughImplements comprehensive internationalization (i18n) support with go-i18n backend integration, context-aware language detection, API response helpers for localized messages, controller refactoring to use i18n, and frontend language preference settings with synchronization to user profile. Changes
Sequence DiagramsequenceDiagram
participant Client as Client<br/>(Browser)
participant Server as Server<br/>(Gin)
participant i18n as i18n<br/>Module
participant DB as Database
participant Loader as UserLangLoader<br/>(Cache)
Client->>Server: Request (Accept-Language header)
Server->>i18n: I18n Middleware: DetectLanguage()
alt User Setting Available
i18n->>DB: Retrieve from UserContext.Setting
DB-->>i18n: Language (zh/en)
else Check User Cache
i18n->>Loader: GetUserLanguage(userId)
Loader->>DB: Query user cache
DB-->>Loader: Cached language
Loader-->>i18n: Language string
else Parse Accept-Language
i18n->>i18n: ParseAcceptLanguage(header)
i18n-->>i18n: Normalized lang (zh/en)
else Default
i18n-->>i18n: DefaultLang (en)
end
i18n->>Server: Store lang in context (ContextKeyLanguage)
Server-->>Client: Process request with language
Server->>i18n: T(context, "token.name_too_long", args)
i18n->>i18n: GetLocalizer(detectedLang)
i18n-->>Server: Translated message
Server-->>Client: JSON response with localized message
Client->>Server: PUT /api/user/self {language: "zh"}
Server->>DB: Update user.setting.language
DB-->>Server: Confirmed
Server-->>Client: Success response
Estimated Code Review Effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly Related PRs
Suggested Labels
Suggested Reviewers
Poem
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
feat: backend i18n
Summary by CodeRabbit
Release Notes