Class: Middleman::CoreExtensions::Internationalization::Localizer

Inherits:
Object
  • Object
show all
Defined in:
lib/middleman-more/core_extensions/i18n.rb

Overview

Central class for managing i18n extension

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, locales_glob, options = {}) ⇒ Localizer

Returns a new instance of Localizer.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/middleman-more/core_extensions/i18n.rb', line 32

def initialize(app, locales_glob, options={})
  @app = app
  @locales_glob = locales_glob
  @maps = {}
  @options = options

  @lang_map      = @options[:lang_map]      || {}
  @path          = @options[:path]          || "/:locale/"
  @templates_dir = @options[:templates_dir] || "localizable"
  @mount_at_root = @options.has_key?(:mount_at_root) ? @options[:mount_at_root] : langs.first

  if !@app.build?
    logger.info "== Locales: #{langs.join(", ")}"
  end

  # Don't output localizable files
  @app.ignore File.join(@templates_dir, "**")

  @app.sitemap. do |url|
    if d = get_localization_data(url)
      lang, page_id = d
      instance_vars = Proc.new {
        ::I18n.locale = lang
        @lang         = lang
        @page_id      = page_id
      }
      { :blocks => [instance_vars] }
    else
      {}
    end
  end

  @app.sitemap.register_resource_list_manipulator(
    :i18n,
    self
  )

  @app.files.changed(&method(:on_file_changed))
  @app.files.deleted(&method(:on_file_changed))
end

Instance Attribute Details

#appObject (readonly)

Returns the value of attribute app.



29
30
31
# File 'lib/middleman-more/core_extensions/i18n.rb', line 29

def app
  @app
end

Instance Method Details

#get_localization_data(path) ⇒ Object



87
88
89
90
# File 'lib/middleman-more/core_extensions/i18n.rb', line 87

def get_localization_data(path)
  @_localization_data ||= {}
  @_localization_data[path]
end

#langsObject



79
80
81
82
83
84
85
# File 'lib/middleman-more/core_extensions/i18n.rb', line 79

def langs
  @options[:langs] || begin
    Dir[File.join(@app.root, @locales_glob)].map { |file|
      File.basename(file).gsub(".yml", "")
    }.sort.map(&:to_sym)
  end
end

#manipulate_resource_list(resources) ⇒ void

This method returns an undefined value.

Update the main sitemap resource list



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/middleman-more/core_extensions/i18n.rb', line 94

def manipulate_resource_list(resources)
  @_localization_data = {}

  new_resources = []

  resources.each do |resource|
    next unless File.fnmatch(File.join(@templates_dir, "**"), resource.path)

    page_id = File.basename(resource.path, File.extname(resource.path))

    langs.map do |lang|
      ::I18n.locale = lang

      localized_page_id = ::I18n.t("paths.#{page_id}", :default => page_id)
      path = resource.path.sub(@templates_dir, "")

      # Build lang path
      if @mount_at_root == lang
        prefix = "/"
      else
        replacement = @lang_map.has_key?(lang) ? @lang_map[lang] : lang
        prefix = @path.sub(":locale", replacement.to_s)
      end

      path = ::Middleman::Util.normalize_path(
        File.join(prefix, path.sub(page_id, localized_page_id))
      )

      @_localization_data[path] = [lang, path, localized_page_id]

      p = ::Middleman::Sitemap::Resource.new(
        @app.sitemap,
        path
      )
      p.proxy_to(resource.path)

      new_resources << p
    end
  end

  resources + new_resources
end

#on_file_changed(file) ⇒ Object



73
74
75
76
77
# File 'lib/middleman-more/core_extensions/i18n.rb', line 73

def on_file_changed(file)
  if File.fnmatch(@locales_glob, file)
    ::I18n.reload!
  end
end