Class: R18n::Loader::YAML

Inherits:
Object
  • Object
show all
Includes:
YamlMethods
Defined in:
lib/r18n-core/yaml_loader.rb

Overview

Loader for translations in YAML format. Them should have name like en.yml (English) or en-US.yml (USA English dialect) with language/country code (RFC 3066).

R18n::I18n.new('en', R18n::Loader::YAML.new('dir/with/translations'))

YAML loader is default loader, so you can just set constructor parameter to R18n::I18n.new:

R18n::I18n.new('en', 'dir/with/translations')

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from YamlMethods

#detect_yaml_private_type, #initialize_types

Constructor Details

#initialize(dir) ⇒ YAML

Create new loader for dir with YAML translations.



39
40
41
42
# File 'lib/r18n-core/yaml_loader.rb', line 39

def initialize(dir)
  @dir = File.expand_path(dir)
  detect_yaml_private_type
end

Instance Attribute Details

#dirObject (readonly)

Dir with translations.



36
37
38
# File 'lib/r18n-core/yaml_loader.rb', line 36

def dir
  @dir
end

Instance Method Details

#==(other) ⇒ Object

Is another loader load YAML translations from same dir.



68
69
70
# File 'lib/r18n-core/yaml_loader.rb', line 68

def ==(other)
  self.class == other.class && dir == other.dir
end

#availableObject

Array of locales, which has translations in dir.



45
46
47
48
49
# File 'lib/r18n-core/yaml_loader.rb', line 45

def available
  Dir.glob(File.join(@dir, '**/*.yml'))
    .map { |i| File.basename(i, '.yml') }.uniq
    .map { |i| R18n.locale(i) }
end

#hashObject

YAML loader with same dir will be have same hash.



63
64
65
# File 'lib/r18n-core/yaml_loader.rb', line 63

def hash
  self.class.hash + @dir.hash
end

#load(locale) ⇒ Object

Return Hash with translations for locale.



52
53
54
55
56
57
58
59
60
# File 'lib/r18n-core/yaml_loader.rb', line 52

def load(locale)
  initialize_types

  translations = {}
  Dir.glob(File.join(@dir, "**/#{locale.code.downcase}.yml")).each do |i|
    Utils.deep_merge!(translations, ::YAML.load_file(i) || {})
  end
  transform(translations)
end

#transform(a_hash) ⇒ Object

Wrap YAML private types to Typed.



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/r18n-core/yaml_loader.rb', line 73

def transform(a_hash)
  R18n::Utils.hash_map(a_hash) do |key, value|
    if value.is_a? Hash
      value = transform(value)
    elsif defined?(@private_type_class) &&
          value.is_a?(@private_type_class)
      v = value.value
      if v.respond_to?(:force_encoding) && v.encoding != __ENCODING__
        v = v.force_encoding(__ENCODING__)
      end
      value = Typed.new(value.type_id, v)
    end
    [key, value]
  end
end