阅读时间 2 分钟最后更新: 2025-12-31 12:12

语言和币种修改指南

本文档说明如何在系统中添加或修改支持的语言和币种。

语言配置

修改语言设置文件

文件位置: src/i18n/settings.ts

// 1. 修改默认语言(可选)
export const fallbackLng = 'en' // 默认语言代码

// 2. 添加新语言到支持列表
export const languages = [fallbackLng, 'zh-CN', 'ja', 'ko'] // 添加韩语示例

// 3. 更新语言选择映射
export const languagesSelectMap = {
  'en': { name: 'English', short: 'EN' },
  'zh-CN': { name: '中文', short: '中' },
  'ja': { name: '日本語', short: '日' },
  'ko': { name: '한국어', short: '한' } // 添加韩语示例
}

更新工具函数

文件位置: src/lib/utils.ts

更新币种-语言映射

getCurrencyLang() 函数中添加新的映射关系:

export function getCurrencyLang(currency: string): string {
  const currencyLangMap: Record<string, string> = {
    'usd': 'en',
    'cny': 'zh-CN',
    'jpy': 'ja',
    'krw': 'ko', // 添加韩元对应韩语
  }
  return currencyLangMap[currency.toLowerCase()] || 'en'
}

更新价格格式化函数

formatPrice() 函数中添加新语言的 locale 映射:

export function formatPrice(price: number, currency: string, lang: string = 'en'): string {
  // 添加新语言的 locale 映射
  const locale = lang === 'zh-CN' ? 'zh-CN'
    : lang === 'ja' ? 'ja-JP'
    : lang === 'ko' ? 'ko-KR' // 添加韩语
    : 'en-US'
  
  const formatter = new Intl.NumberFormat(locale, {
    style: 'currency',
    currency: currency.toUpperCase(),
    minimumFractionDigits: 0,
    maximumFractionDigits: 2,
    currencyDisplay: 'narrowSymbol',
  })
  return formatter.format(price / 100)
}

币种配置

更新系统设置页面

文件位置: src/app/[lang]/admin/system/settings/page.tsx

更新默认币种设置

defaultSettings 中修改默认币种:

const defaultSettings: SystemSettings = {
  // ... 其他设置
  defaultCurrency: 'usd', // 修改默认币种
}

添加币种选项

在语言设置部分添加新的币种选项:

<div>
  <Label htmlFor="defaultCurrency">{t('system.defaultCurrency')}</Label>
  <Select value={settings.defaultCurrency} onValueChange={(value) => handleChange('defaultCurrency', value)}>
    <SelectTrigger>
      <SelectValue />
    </SelectTrigger>
    <SelectContent>
      <SelectItem value="usd">{t('system.currencyUSD')}</SelectItem>
      <SelectItem value="cny">{t('system.currencyCNY')}</SelectItem>
      <SelectItem value="jpy">{t('system.currencyJPY')}</SelectItem>
      <SelectItem value="krw">{t('system.currencyKRW')}</SelectItem>
    </SelectContent>
  </Select>
</div>

更新 SEO 默认设置

defaultSEOSettings 中为新语言添加 SEO 默认值:

const defaultSEOSettings: SEOSettings = {
  // ...
  localized: {
    'en': { /* ... */ },
    'zh-CN': { /* ... */ },
    'ja': { /* ... */ },
    'ko': {
      siteName: 'Hex2077 Starter',
      siteDescription: '최고의 SaaS 템플릿.',
      siteKeywords: 'hex2077,starter,saas,템플릿'
    } // 添加新语言的 SEO 默认配置
  }
}

多语言文件

创建新语言的翻译文件

为每个新语言创建完整的翻译文件目录:

public/locales/ko/
├── admin.json
├── auth.json
├── common.json
├── credits.json
├── email.json
├── home.json
├── privacy.json
├── profile.json
├── refund.json
├── subscription.json
├── terms.json
└── user.json

添加系统设置相关翻译

admin.json 中添加语言和币种相关的翻译键:

{
  "system": {
    "language": "语言",
    "languageChinese": "中文",
    "languageEnglish": "English",
    "languageJapanese": "日本語",
    "languageKorean": "한국어",
    "defaultCurrency": "默认币种",
    "currencyUSD": "美元 (USD)",
    "currencyCNY": "人民币 (CNY)",
    "currencyJPY": "日元 (JPY)",
    "currencyKRW": "韩元 (KRW)"
  }
}

完整示例:添加韩语和韩元支持

步骤 1: 修改 src/i18n/settings.ts

export const fallbackLng = 'en'
export const languages = [fallbackLng, 'zh-CN', 'ja', 'ko']
export const defaultNS = 'common'

export const languagesSelectMap = {
  'en': { name: 'English', short: 'EN' },
  'zh-CN': { name: '中文', short: '中' },
  'ja': { name: '日本語', short: '日' },
  'ko': { name: '한국어', short: '한' }
}

步骤 2: 修改 src/lib/utils.ts

// 更新币种-语言映射
export function getCurrencyLang(currency: string): string {
  const currencyLangMap: Record<string, string> = {
    'usd': 'en',
    'cny': 'zh-CN',
    'jpy': 'ja',
    'krw': 'ko',
  }
  return currencyLangMap[currency.toLowerCase()] || 'en'
}

// 更新价格格式化
export function formatPrice(price: number, currency: string, lang: string = 'en'): string {
  const locale = lang === 'zh-CN' ? 'zh-CN' 
    : lang === 'ja' ? 'ja-JP' 
    : lang === 'ko' ? 'ko-KR'
    : 'en-US'
  
  const formatter = new Intl.NumberFormat(locale, {
    style: 'currency',
    currency: currency.toUpperCase(),
    minimumFractionDigits: 0,
    maximumFractionDigits: 2,
    currencyDisplay: 'narrowSymbol',
  })
  return formatter.format(price / 100)
}

步骤 3: 创建翻译文件

创建 public/locales/ko/ 目录及所有必需的 JSON 文件,并添加相应的韩语翻译。

步骤 4: 更新所有语言的 admin.json

在各语言的 admin.json 中添加:

{
  "system": {
    "languageKorean": "한국어",
    "currencyKRW": "韩元 (KRW)"
  }
}

注意事项

语言代码规范

  • 使用标准的 BCP 47 语言标签
  • 示例:en(英语)、zh-CN(简体中文)、ja(日语)、ko(韩语)

币种代码规范

  • 使用 ISO 4217 标准的三字母币种代码
  • 示例:USD(美元)、CNY(人民币)、JPY(日元)、KRW(韩元)

价格格式化

  • 价格以分为单位存储(整数)
  • 使用 Intl.NumberFormat 进行本地化格式化
  • 不同币种可能有不同的小数位数要求

翻译文件完整性

  • 确保所有语言的翻译文件结构一致
  • 新增翻译键时,需要在所有语言文件中添加
  • 缺失的翻译键会回退到默认语言

测试建议

  • 测试语言切换功能
  • 测试币种显示格式
  • 测试价格计算和显示
  • 测试多语言内容的正确性

常见问题

Q: 如何修改默认语言?

A: 在 src/i18n/settings.ts 中修改 fallbackLng 的值。

Q: 如何添加不支持的币种?

A: 只要是 ISO 4217 标准的币种代码,Intl.NumberFormat 都能自动处理。只需在系统设置页面添加选项即可。

Q: 价格格式化不正确怎么办?

A: 检查 formatPrice() 函数中的 locale 映射是否正确,确保使用了正确的 locale 代码。

Q: 如何批量更新所有翻译文件?

A: 建议使用脚本或工具来管理翻译文件,确保所有语言文件的键值对保持一致。

语言和货币配置 - Hex2077 启动器