**Changes:**
- Remove all comments from custom template (align with Claude/Gemini)
- Remove base_url field from template (user fills in form instead)
- Simplify getCodexCustomTemplate() - no locale parameter needed
- Keep preset configurations unchanged with their baseUrl values
**Template now contains only:**
- model_provider, model, model_reasoning_effort
- disable_response_storage
- [model_providers.custom] section with minimal fields
**Benefits:**
- ✅ Cleaner, more focused template
- ✅ Consistent with other apps (no comments)
- ✅ Forces users to fill base_url via form field
- ✅ Reduced template size from 35+ lines to 12 lines
Net change: -74 lines (codexTemplates.ts)
**Changes:**
- Create src/config/codexTemplates.ts with getCodexCustomTemplate factory
- Support both Chinese and English templates based on i18n.language
- Remove 70 lines of duplicated template strings from ProviderForm.tsx
- Update both useEffect and handlePresetChange to use template factory
- Clean up unused "Custom (Blank Template)" preset entry
**Benefits:**
- ✅ Eliminates code duplication (35-line template repeated twice)
- ✅ Adds internationalization support for English users
- ✅ Follows project architecture (templates in config/ directory)
- ✅ Improves maintainability (single source of truth)
- ✅ Net reduction: 34 lines (81 additions, 115 deletions)
**Technical Details:**
- Template selection logic: (i18n.language || "zh").startsWith("zh") ? "zh" : "en"
- Templates are identical except for comments language
- Both auth and config are returned as a single CodexTemplate object
Addresses DRY principle violation and architectural concerns identified
in code review.