The MoonHub learning system uses a modular i18n architecture to support multiple languages.
pkg/learning/
├── i18n/
│ ├── i18n.go # Internationalization manager
│ ├── en.go # English resources
│ └── zh.go # Chinese resources
├── patterns/
│ ├── patterns.go # Pattern manager
│ ├── en_patterns.go # English patterns
│ └── zh_patterns.go # Chinese patterns
└── types.go # Configuration definitions
- Configuration loading →
Config.Language - Initialization →
i18n.New(lang)→patterns.NewManager() - Pattern detection →
detector.DetectSignals() - Language detection →
i18n.DetectLanguage(text) - Pattern matching →
patterns.GetPatterns(lang)
// pkg/learning/i18n/ja.go
package i18n
func initJapanese() TextResources {
return TextResources{
Suggestions: SuggestionsText{
ToolLowSuccess: TitleDesc{
Title: "ツールの使用状況を確認",
Description: "このツール成功率较低。別の方法を検討してください。",
},
// ...
},
Context: ContextText{
Preferences: "## 学習した設定",
// ...
},
}
}// pkg/learning/patterns/ja_patterns.go
package patterns
import "regexp"
func initJapanesePatterns() PatternSet {
return PatternSet{
Positive: []*regexp.Regexp{
regexp.MustCompile(`すごい|完璧|素晴らしい`),
// ...
},
// ...
}
}In i18n/i18n.go, add:
case "ja":
i.texts[LangJa] = initJapanese()In patterns/patterns.go, add:
case "ja":
m.patterns[LangJa] = initJapanesePatterns()
m.semantics[LangJa] = initJapaneseSemantics(){
"learning": {
"language": "auto"
}
}- Patterns are compiled to regex at initialization
- Language detection uses simple character range checks
- Pattern matching uses pre-compiled regex
- Adding a new language requires only two files
- No core logic modification needed
- Text resources are managed independently