Class: Kotoshu::Language::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/kotoshu/language/registry.rb

Overview

Central registry for language registration and retrieval.

Uses Registry pattern for dynamic language discovery and management. Languages register themselves on load, making the system extensible.

Examples:

Register a language

Kotoshu::Language::Registry.register("en-US", English::American)

Retrieve a language

lang = Kotoshu::Language::Registry.get("en-US")

List supported languages

codes = Kotoshu::Language::Registry.supported_codes

Class Method Summary collapse

Class Method Details

.allHash

Get all registered language classes.

Returns:

  • (Hash)

    Hash mapping codes to classes



94
95
96
# File 'lib/kotoshu/language/registry.rb', line 94

def all
  @languages.dup
end

.clearvoid

This method returns an undefined value.

Clear all registrations (mainly for testing).



118
119
120
121
# File 'lib/kotoshu/language/registry.rb', line 118

def clear
  @languages.clear
  @detectors.clear
end

.detect(text) ⇒ String?

Detect language from text.

Tries registered detectors in order.

Parameters:

  • text (String)

    Text to analyze

Returns:

  • (String, nil)

    Detected language code or nil



104
105
106
107
108
109
110
111
112
113
# File 'lib/kotoshu/language/registry.rb', line 104

def detect(text)
  return nil if text.nil? || text.empty?

  @detectors.each do |detector|
    result = detector.detect(text)
    return result if result
  end

  nil
end

.get(code) ⇒ Class?

Get language class by code.

Supports fallback to base language if variant not found. Also supports finding variants when asking for base language. For example:

  • “en-GB” falls back to “en” if “en-GB” not registered

  • “en” returns “en-US” if only “en-US” is registered

Parameters:

  • code (String)

    Language code

Returns:

  • (Class, nil)

    Language class or nil if not found



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/kotoshu/language/registry.rb', line 55

def get(code)
  return nil unless code

  # Try exact match first
  return @languages[code] if @languages.key?(code)

  base = code.split('-').first

  # If code has a hyphen (e.g., "en-GB"), try base language
  if code.include?('-')
    return @languages[base]
  end

  # If code is base language (e.g., "en"), find any variant
  @languages.each do |registered_code, klass|
    return klass if registered_code.split('-').first == base
  end

  nil
end

.info(code) ⇒ Hash?

Get language info by code.

Parameters:

  • code (String)

    Language code

Returns:

  • (Hash, nil)

    Language info or nil



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/kotoshu/language/registry.rb', line 127

def info(code)
  klass = get(code)
  return nil unless klass

  instance = klass.instance if klass.respond_to?(:instance)
  instance ||= klass.new

  {
    code: code,
    name: instance.name,
    variant: instance.variant,
    region: instance.region,
    encoding: instance.encoding,
    rtl?: instance.rtl?,
    script_type: instance.script_type
  }
end

.register(code, language_class) ⇒ void

This method returns an undefined value.

Register a language class with its code.

Examples:

Registry.register("en-US", English::American)

Parameters:

  • code (String)

    Language code (e.g., “en-US”, “de-DE”)

  • language_class (Class)

    Class implementing Kotoshu::Language::Base



31
32
33
# File 'lib/kotoshu/language/registry.rb', line 31

def register(code, language_class)
  @languages[code] = language_class
end

.register_detector(detector) ⇒ void

This method returns an undefined value.

Register a detector for auto-detection.

Detectors are tried in order of registration.

Parameters:

  • detector (#detect)

    Object with detect method



41
42
43
# File 'lib/kotoshu/language/registry.rb', line 41

def register_detector(detector)
  @detectors << detector
end

.registered?(code) ⇒ Boolean

Check if a language is registered.

Parameters:

  • code (String)

    Language code

Returns:

  • (Boolean)

    True if registered



80
81
82
# File 'lib/kotoshu/language/registry.rb', line 80

def registered?(code)
  !get(code).nil?
end

.supported_codesArray<String>

Get all supported language codes.

Returns:

  • (Array<String>)

    Sorted list of language codes



87
88
89
# File 'lib/kotoshu/language/registry.rb', line 87

def supported_codes
  @languages.keys.sort
end