Skip to content

Latest commit

 

History

History
104 lines (87 loc) · 2.43 KB

File metadata and controls

104 lines (87 loc) · 2.43 KB

MoonHub i18n Architecture

The MoonHub learning system uses a modular i18n architecture to support multiple languages.

Architecture

Core Components

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

Data Flow

  1. Configuration loading → Config.Language
  2. Initialization → i18n.New(lang)patterns.NewManager()
  3. Pattern detection → detector.DetectSignals()
  4. Language detection → i18n.DetectLanguage(text)
  5. Pattern matching → patterns.GetPatterns(lang)

Adding a New Language

1. Create Text Resources

// pkg/learning/i18n/ja.go
package i18n

func initJapanese() TextResources {
    return TextResources{
        Suggestions: SuggestionsText{
            ToolLowSuccess: TitleDesc{
                Title:       "ツールの使用状況を確認",
                Description: "このツール成功率较低。別の方法を検討してください。",
            },
            // ...
        },
        Context: ContextText{
            Preferences: "## 学習した設定",
            // ...
        },
    }
}

2. Create Pattern Definitions

// pkg/learning/patterns/ja_patterns.go
package patterns

import "regexp"

func initJapanesePatterns() PatternSet {
    return PatternSet{
        Positive: []*regexp.Regexp{
            regexp.MustCompile(`すごい|完璧|素晴らしい`),
            // ...
        },
        // ...
    }
}

3. Register the Language

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()

Best Practices

Configuration

{
  "learning": {
    "language": "auto"
  }
}

Performance

  • Patterns are compiled to regex at initialization
  • Language detection uses simple character range checks
  • Pattern matching uses pre-compiled regex

Extensibility

  • Adding a new language requires only two files
  • No core logic modification needed
  • Text resources are managed independently