Module: Ibex::Messages

Defined in:
lib/ibex/messages.rb

Overview

Immutable built-in diagnostic translations, separate from user E00xx sentence-keyed parser error catalogs.

Constant Summary collapse

ROOT =

: String

File.expand_path("messages", __dir__ || raise("message catalog directory is unavailable"))
LANGUAGES =

: Array

%w[en ja].freeze

Class Method Summary collapse

Class Method Details

.catalog(language) ⇒ Object



39
40
41
42
# File 'lib/ibex/messages.rb', line 39

def catalog(language)
  @catalogs ||= {} #: Hash[String, Hash[String, String]]
  @catalogs[language] ||= load_catalog(language)
end

.known?(id) ⇒ Boolean

Returns:

  • (Boolean)


33
34
35
# File 'lib/ibex/messages.rb', line 33

def known?(id)
  catalog("en").key?(id)
end

.language(requested) ⇒ Object



14
15
16
17
# File 'lib/ibex/messages.rb', line 14

def language(requested)
  candidate = requested.to_s.downcase.tr("_", "-").split("-").first
  LANGUAGES.include?(candidate) ? candidate : "en"
end

.translate(id, language: "en", **values) ⇒ Object



21
22
23
24
25
26
27
28
29
# File 'lib/ibex/messages.rb', line 21

def translate(id, language: "en", **values)
  selected = catalog(self.language(language))
  template = selected[id] || catalog("en").fetch(id) do
    raise Ibex::Error, "(messages):1:1: unknown built-in message id #{id.inspect}"
  end
  template % values.transform_keys(&:to_sym)
rescue KeyError => e
  raise Ibex::Error, "(messages):1:1: missing interpolation for #{id.inspect}: #{e.message}"
end