Skip to content

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 - #89

Closed
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base
Closed

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译#89
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base

Conversation

@gy212

Copy link
Copy Markdown
Contributor

概述

为 CodePilot 添加国际化(i18n)基础设施,包含英文(en)和简体中文(zh)两种语言支持。

改动内容

  • 新增 i18n 核心模块(src/i18n/index.ts):翻译函数、类型定义、参数插值
  • 新增英文翻译文件(src/i18n/en.ts)作为基准语言
  • 新增简体中文翻译文件(src/i18n/zh.ts
  • 新增 I18nProvider 上下文组件和 useTranslation Hook
  • 改造所有 UI 组件,将硬编码文本替换为翻译键
  • 设置页面新增语言切换功能,locale 持久化到 app settings

说明

其他语言(zh-TW、ja、es、pt-BR、de、fr、ru)将在独立 PR 中逐一添加。

gy212and others added 3 commits February 23, 2026 22:01
Add internationalization support with useTranslation hook, I18nProvider,
and language files for: zh, en, zh-TW, ja, es, pt-BR, de, fr, ru
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove extra language files (zh-TW, ja, es, pt-BR, de, fr, ru) from
the base i18n PR. Each language will be added in a separate PR.
op7418 pushed a commit that referenced this pull request Feb 24, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR #89)
and comprehensive translation files (PR #90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
@op7418

Copy link
Copy Markdown
Owner

Closed — i18n infrastructure and Chinese/English translations have been implemented in v0.13.0 (commit c7c3ba5). Thank you @gy212 for the excellent i18n framework design and comprehensive translation files that inspired this implementation! 🙏 The remaining language translations (zh-TW, ja, es, pt-BR, de, fr, ru) from PRs #90-96 will be integrated in a follow-up release.

@op7418op7418 closed this Feb 24, 2026
@gy212
gy212 deleted the feat/i18n-base branch March 5, 2026 01:31
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR op7418#89)
and comprehensive translation files (PR op7418#90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@gy212@op7418
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 by gy212 · Pull Request #89 · op7418/CodePilot · GitHub
Skip to content

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 - #89

Closed
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base
Closed

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译#89
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base

Conversation

@gy212

Copy link
Copy Markdown
Contributor

概述

为 CodePilot 添加国际化(i18n)基础设施,包含英文(en)和简体中文(zh)两种语言支持。

改动内容

  • 新增 i18n 核心模块(src/i18n/index.ts):翻译函数、类型定义、参数插值
  • 新增英文翻译文件(src/i18n/en.ts)作为基准语言
  • 新增简体中文翻译文件(src/i18n/zh.ts
  • 新增 I18nProvider 上下文组件和 useTranslation Hook
  • 改造所有 UI 组件,将硬编码文本替换为翻译键
  • 设置页面新增语言切换功能,locale 持久化到 app settings

说明

其他语言(zh-TW、ja、es、pt-BR、de、fr、ru)将在独立 PR 中逐一添加。

gy212and others added 3 commits February 23, 2026 22:01
Add internationalization support with useTranslation hook, I18nProvider,
and language files for: zh, en, zh-TW, ja, es, pt-BR, de, fr, ru
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove extra language files (zh-TW, ja, es, pt-BR, de, fr, ru) from
the base i18n PR. Each language will be added in a separate PR.
op7418 pushed a commit that referenced this pull request Feb 24, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR #89)
and comprehensive translation files (PR #90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
@op7418

Copy link
Copy Markdown
Owner

Closed — i18n infrastructure and Chinese/English translations have been implemented in v0.13.0 (commit c7c3ba5). Thank you @gy212 for the excellent i18n framework design and comprehensive translation files that inspired this implementation! 🙏 The remaining language translations (zh-TW, ja, es, pt-BR, de, fr, ru) from PRs #90-96 will be integrated in a follow-up release.

@op7418op7418 closed this Feb 24, 2026
@gy212
gy212 deleted the feat/i18n-base branch March 5, 2026 01:31
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR op7418#89)
and comprehensive translation files (PR op7418#90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@gy212@op7418
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 by gy212 · Pull Request #89 · op7418/CodePilot · GitHub
Skip to content

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 - #89

Closed
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base
Closed

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译#89
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base

Conversation

@gy212

Copy link
Copy Markdown
Contributor

概述

为 CodePilot 添加国际化(i18n)基础设施,包含英文(en)和简体中文(zh)两种语言支持。

改动内容

  • 新增 i18n 核心模块(src/i18n/index.ts):翻译函数、类型定义、参数插值
  • 新增英文翻译文件(src/i18n/en.ts)作为基准语言
  • 新增简体中文翻译文件(src/i18n/zh.ts
  • 新增 I18nProvider 上下文组件和 useTranslation Hook
  • 改造所有 UI 组件,将硬编码文本替换为翻译键
  • 设置页面新增语言切换功能,locale 持久化到 app settings

说明

其他语言(zh-TW、ja、es、pt-BR、de、fr、ru)将在独立 PR 中逐一添加。

gy212and others added 3 commits February 23, 2026 22:01
Add internationalization support with useTranslation hook, I18nProvider,
and language files for: zh, en, zh-TW, ja, es, pt-BR, de, fr, ru
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove extra language files (zh-TW, ja, es, pt-BR, de, fr, ru) from
the base i18n PR. Each language will be added in a separate PR.
op7418 pushed a commit that referenced this pull request Feb 24, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR #89)
and comprehensive translation files (PR #90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
@op7418

Copy link
Copy Markdown
Owner

Closed — i18n infrastructure and Chinese/English translations have been implemented in v0.13.0 (commit c7c3ba5). Thank you @gy212 for the excellent i18n framework design and comprehensive translation files that inspired this implementation! 🙏 The remaining language translations (zh-TW, ja, es, pt-BR, de, fr, ru) from PRs #90-96 will be integrated in a follow-up release.

@op7418op7418 closed this Feb 24, 2026
@gy212
gy212 deleted the feat/i18n-base branch March 5, 2026 01:31
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR op7418#89)
and comprehensive translation files (PR op7418#90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@gy212@op7418
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 by gy212 · Pull Request #89 · op7418/CodePilot · GitHub
Skip to content

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 - #89

Closed
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base
Closed

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译#89
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base

Conversation

@gy212

Copy link
Copy Markdown
Contributor

概述

为 CodePilot 添加国际化(i18n)基础设施,包含英文(en)和简体中文(zh)两种语言支持。

改动内容

  • 新增 i18n 核心模块(src/i18n/index.ts):翻译函数、类型定义、参数插值
  • 新增英文翻译文件(src/i18n/en.ts)作为基准语言
  • 新增简体中文翻译文件(src/i18n/zh.ts
  • 新增 I18nProvider 上下文组件和 useTranslation Hook
  • 改造所有 UI 组件,将硬编码文本替换为翻译键
  • 设置页面新增语言切换功能,locale 持久化到 app settings

说明

其他语言(zh-TW、ja、es、pt-BR、de、fr、ru)将在独立 PR 中逐一添加。

gy212and others added 3 commits February 23, 2026 22:01
Add internationalization support with useTranslation hook, I18nProvider,
and language files for: zh, en, zh-TW, ja, es, pt-BR, de, fr, ru
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove extra language files (zh-TW, ja, es, pt-BR, de, fr, ru) from
the base i18n PR. Each language will be added in a separate PR.
op7418 pushed a commit that referenced this pull request Feb 24, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR #89)
and comprehensive translation files (PR #90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
@op7418

Copy link
Copy Markdown
Owner

Closed — i18n infrastructure and Chinese/English translations have been implemented in v0.13.0 (commit c7c3ba5). Thank you @gy212 for the excellent i18n framework design and comprehensive translation files that inspired this implementation! 🙏 The remaining language translations (zh-TW, ja, es, pt-BR, de, fr, ru) from PRs #90-96 will be integrated in a follow-up release.

@op7418op7418 closed this Feb 24, 2026
@gy212
gy212 deleted the feat/i18n-base branch March 5, 2026 01:31
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR op7418#89)
and comprehensive translation files (PR op7418#90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@gy212@op7418
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 by gy212 · Pull Request #89 · op7418/CodePilot · GitHub
Skip to content

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 - #89

Closed
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base
Closed

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译#89
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base

Conversation

@gy212

Copy link
Copy Markdown
Contributor

概述

为 CodePilot 添加国际化(i18n)基础设施,包含英文(en)和简体中文(zh)两种语言支持。

改动内容

  • 新增 i18n 核心模块(src/i18n/index.ts):翻译函数、类型定义、参数插值
  • 新增英文翻译文件(src/i18n/en.ts)作为基准语言
  • 新增简体中文翻译文件(src/i18n/zh.ts
  • 新增 I18nProvider 上下文组件和 useTranslation Hook
  • 改造所有 UI 组件,将硬编码文本替换为翻译键
  • 设置页面新增语言切换功能,locale 持久化到 app settings

说明

其他语言(zh-TW、ja、es、pt-BR、de、fr、ru)将在独立 PR 中逐一添加。

gy212and others added 3 commits February 23, 2026 22:01
Add internationalization support with useTranslation hook, I18nProvider,
and language files for: zh, en, zh-TW, ja, es, pt-BR, de, fr, ru
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove extra language files (zh-TW, ja, es, pt-BR, de, fr, ru) from
the base i18n PR. Each language will be added in a separate PR.
op7418 pushed a commit that referenced this pull request Feb 24, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR #89)
and comprehensive translation files (PR #90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
@op7418

Copy link
Copy Markdown
Owner

Closed — i18n infrastructure and Chinese/English translations have been implemented in v0.13.0 (commit c7c3ba5). Thank you @gy212 for the excellent i18n framework design and comprehensive translation files that inspired this implementation! 🙏 The remaining language translations (zh-TW, ja, es, pt-BR, de, fr, ru) from PRs #90-96 will be integrated in a follow-up release.

@op7418op7418 closed this Feb 24, 2026
@gy212
gy212 deleted the feat/i18n-base branch March 5, 2026 01:31
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR op7418#89)
and comprehensive translation files (PR op7418#90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@gy212@op7418
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 by gy212 · Pull Request #89 · op7418/CodePilot · GitHub
Skip to content

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 - #89

Closed
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base
Closed

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译#89
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base

Conversation

@gy212

Copy link
Copy Markdown
Contributor

概述

为 CodePilot 添加国际化(i18n)基础设施,包含英文(en)和简体中文(zh)两种语言支持。

改动内容

  • 新增 i18n 核心模块(src/i18n/index.ts):翻译函数、类型定义、参数插值
  • 新增英文翻译文件(src/i18n/en.ts)作为基准语言
  • 新增简体中文翻译文件(src/i18n/zh.ts
  • 新增 I18nProvider 上下文组件和 useTranslation Hook
  • 改造所有 UI 组件,将硬编码文本替换为翻译键
  • 设置页面新增语言切换功能,locale 持久化到 app settings

说明

其他语言(zh-TW、ja、es、pt-BR、de、fr、ru)将在独立 PR 中逐一添加。

gy212and others added 3 commits February 23, 2026 22:01
Add internationalization support with useTranslation hook, I18nProvider,
and language files for: zh, en, zh-TW, ja, es, pt-BR, de, fr, ru
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove extra language files (zh-TW, ja, es, pt-BR, de, fr, ru) from
the base i18n PR. Each language will be added in a separate PR.
op7418 pushed a commit that referenced this pull request Feb 24, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR #89)
and comprehensive translation files (PR #90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
@op7418

Copy link
Copy Markdown
Owner

Closed — i18n infrastructure and Chinese/English translations have been implemented in v0.13.0 (commit c7c3ba5). Thank you @gy212 for the excellent i18n framework design and comprehensive translation files that inspired this implementation! 🙏 The remaining language translations (zh-TW, ja, es, pt-BR, de, fr, ru) from PRs #90-96 will be integrated in a follow-up release.

@op7418op7418 closed this Feb 24, 2026
@gy212
gy212 deleted the feat/i18n-base branch March 5, 2026 01:31
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR op7418#89)
and comprehensive translation files (PR op7418#90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@gy212@op7418
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 by gy212 · Pull Request #89 · op7418/CodePilot · GitHub
Skip to content

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 - #89

Closed
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base
Closed

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译#89
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base

Conversation

@gy212

Copy link
Copy Markdown
Contributor

概述

为 CodePilot 添加国际化(i18n)基础设施,包含英文(en)和简体中文(zh)两种语言支持。

改动内容

  • 新增 i18n 核心模块(src/i18n/index.ts):翻译函数、类型定义、参数插值
  • 新增英文翻译文件(src/i18n/en.ts)作为基准语言
  • 新增简体中文翻译文件(src/i18n/zh.ts
  • 新增 I18nProvider 上下文组件和 useTranslation Hook
  • 改造所有 UI 组件,将硬编码文本替换为翻译键
  • 设置页面新增语言切换功能,locale 持久化到 app settings

说明

其他语言(zh-TW、ja、es、pt-BR、de、fr、ru)将在独立 PR 中逐一添加。

gy212and others added 3 commits February 23, 2026 22:01
Add internationalization support with useTranslation hook, I18nProvider,
and language files for: zh, en, zh-TW, ja, es, pt-BR, de, fr, ru
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove extra language files (zh-TW, ja, es, pt-BR, de, fr, ru) from
the base i18n PR. Each language will be added in a separate PR.
op7418 pushed a commit that referenced this pull request Feb 24, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR #89)
and comprehensive translation files (PR #90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
@op7418

Copy link
Copy Markdown
Owner

Closed — i18n infrastructure and Chinese/English translations have been implemented in v0.13.0 (commit c7c3ba5). Thank you @gy212 for the excellent i18n framework design and comprehensive translation files that inspired this implementation! 🙏 The remaining language translations (zh-TW, ja, es, pt-BR, de, fr, ru) from PRs #90-96 will be integrated in a follow-up release.

@op7418op7418 closed this Feb 24, 2026
@gy212
gy212 deleted the feat/i18n-base branch March 5, 2026 01:31
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR op7418#89)
and comprehensive translation files (PR op7418#90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@gy212@op7418
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 by gy212 · Pull Request #89 · op7418/CodePilot · GitHub
Skip to content

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译 - #89

Closed
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base
Closed

feat(i18n): 添加 i18n 基础设施 + 英文/中文翻译#89
gy212 wants to merge 4 commits into
op7418:mainfrom
gy212:feat/i18n-base

Conversation

@gy212

Copy link
Copy Markdown
Contributor

概述

为 CodePilot 添加国际化(i18n)基础设施,包含英文(en)和简体中文(zh)两种语言支持。

改动内容

  • 新增 i18n 核心模块(src/i18n/index.ts):翻译函数、类型定义、参数插值
  • 新增英文翻译文件(src/i18n/en.ts)作为基准语言
  • 新增简体中文翻译文件(src/i18n/zh.ts
  • 新增 I18nProvider 上下文组件和 useTranslation Hook
  • 改造所有 UI 组件,将硬编码文本替换为翻译键
  • 设置页面新增语言切换功能,locale 持久化到 app settings

说明

其他语言(zh-TW、ja、es、pt-BR、de、fr、ru)将在独立 PR 中逐一添加。

gy212and others added 3 commits February 23, 2026 22:01
Add internationalization support with useTranslation hook, I18nProvider,
and language files for: zh, en, zh-TW, ja, es, pt-BR, de, fr, ru
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove extra language files (zh-TW, ja, es, pt-BR, de, fr, ru) from
the base i18n PR. Each language will be added in a separate PR.
op7418 pushed a commit that referenced this pull request Feb 24, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR #89)
and comprehensive translation files (PR #90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
@op7418

Copy link
Copy Markdown
Owner

Closed — i18n infrastructure and Chinese/English translations have been implemented in v0.13.0 (commit c7c3ba5). Thank you @gy212 for the excellent i18n framework design and comprehensive translation files that inspired this implementation! 🙏 The remaining language translations (zh-TW, ja, es, pt-BR, de, fr, ru) from PRs #90-96 will be integrated in a follow-up release.

@op7418op7418 closed this Feb 24, 2026
@gy212
gy212 deleted the feat/i18n-base branch March 5, 2026 01:31
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Implements a zero-dependency i18n framework with TypeScript type safety.
Thanks to @gy212 for the original i18n infrastructure design (PR op7418#89)
and comprehensive translation files (PR op7418#90-96) that inspired this implementation.
## New files (5)
- src/i18n/en.ts: English translations (source of truth, ~270 keys),
exports TranslationKey type for compile-time key completeness
- src/i18n/zh.ts: Chinese translations, typed as Record<TranslationKey, string>
- src/i18n/index.ts: translate() function with {param} interpolation,
Locale type, SUPPORTED_LOCALES array
- src/components/layout/I18nProvider.tsx: React Context provider,
loads/persists locale preference via /api/settings/app
- src/hooks/useTranslation.ts: useTranslation() hook returning
{ locale, setLocale, t }
## Infrastructure wiring
- src/app/layout.tsx: I18nProvider wrapped inside ThemeProvider
- src/app/api/settings/app/route.ts: added "locale" to ALLOWED_KEYS
for persistence
## Language picker
- src/components/settings/GeneralSection.tsx: added language selection
dropdown (Select component) in Settings > General, using
SUPPORTED_LOCALES and setLocale()
## String replacements (33 component files)
All hardcoded user-facing strings replaced with t() calls:
High priority (chat):
- ChatListPanel.tsx: session list, search, empty state, relative time
- NavRail.tsx: nav labels, theme toggle, auto-approve indicator
- MessageInput.tsx: command descriptions, mode labels, attach tooltip
- MessageList.tsx: empty state, load earlier, loading indicator
- StreamingMessage.tsx: thinking, permission actions
- chat/[id]/page.tsx: session title fallback
Settings:
- GeneralSection.tsx: update card, auto-approve section, warning dialog
- SettingsLayout.tsx: title, description, sidebar labels
- CliSettingsSection.tsx: form/json tabs, buttons, dynamic field labels
(skipDangerousModePermissionPrompt etc.), Enabled/Disabled states
- ProviderForm.tsx: dialog title, form labels, buttons
- ProviderManager.tsx: status badges, delete dialog, section headers
Extensions:
- extensions/page.tsx: title, tab labels
- SkillsManager.tsx: empty state, loading, search
- SkillEditor.tsx: toolbar buttons, placeholder
- SkillListItem.tsx: delete confirmation
- CreateSkillDialog.tsx: form labels, scope, templates, validation
Plugins:
- McpManager.tsx: header, tabs, loading state
- McpServerList.tsx: empty state, badges, field labels
- McpServerEditor.tsx: dialog title, form labels, buttons
- ConfigEditor.tsx: save/format buttons
Layout:
- RightPanel.tsx: panel header, open/close tooltips
- FileTree.tsx: search placeholder, empty states
- FilePreview.tsx: back button, line count, copy path
- DocPreview.tsx: iframe title
- ConnectionStatus.tsx: install prompts, version display
- InstallWizard.tsx: phase descriptions, button labels
- ImportSessionDialog.tsx: search, relative time, import buttons
- FolderPicker.tsx: dialog title, loading, buttons
- TaskList.tsx: filter tabs, input placeholder, empty states
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@gy212@op7418