jekyll-locale 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +31 -0
- data/lib/jekyll/locale/date_time_handler.rb +61 -0
- data/lib/jekyll/locale/filters.rb +29 -0
- data/lib/jekyll/locale/generator.rb +2 -2
- data/lib/jekyll/locale/handler.rb +36 -21
- data/lib/jekyll/locale/version.rb +1 -1
- data/lib/jekyll/patches/utils.rb +9 -0
- data/lib/jekyll-locale.rb +5 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6aa5bfa8934b5488a01509fcc5edc532e218b7a
|
4
|
+
data.tar.gz: 896e029d6388b5c7c71f7864f5dce874916dad10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd03beca23149b7a9d5518c8213185faa8c6b89361133a24bf4add596211fd2628797096fb99b30a7b235679eaa61d5469c2f8ceef8be7ff459d1a6ddea248fd
|
7
|
+
data.tar.gz: 80ef5c1b31991f96a3a6b8d26130039badeb93390285e80efff436920af1b9da086c7b4da123cc6525c569d4ab811e1492351da3717f3a20156be7872230cb97
|
data/README.md
CHANGED
@@ -236,3 +236,34 @@ Instead filter out the canonical url from the for-loop, and render the canonical
|
|
236
236
|
{% endfor %}
|
237
237
|
<link rel="alternate" hreflang="x-default" href="{{ page.url | absolute_url }}" />
|
238
238
|
```
|
239
|
+
|
240
|
+
## Liquid Filters
|
241
|
+
|
242
|
+
### `localize_date`
|
243
|
+
|
244
|
+
This plugin provides a `localize_date` filter to aid in localizing valid date strings. It takes an optional parameter to specify the format
|
245
|
+
of the output string.
|
246
|
+
|
247
|
+
The filter technically delegates to the `I18n` module and therefore requires the translation data to follow a certain convention to pass through without errors.
|
248
|
+
|
249
|
+
```yaml
|
250
|
+
date:
|
251
|
+
day_names : # Array of Day names in full. e.g. "Sunday", "Monday", ...
|
252
|
+
month_names : # Array of Month names in full. e.g. "January", "February", ...
|
253
|
+
abbr_day_names : # Array of abbreviations of above Day names. e.g. "Sun", "Mon", ...
|
254
|
+
abbr_month_names : # Array of abbreviations of above Month names. e.g. "Jan", "Feb", ...
|
255
|
+
time:
|
256
|
+
am: "am" # Placeholder for Ante-Meridian
|
257
|
+
pm: "pm" # Placeholder for Post-Meridian
|
258
|
+
formats: # A set of predefined strftime formats
|
259
|
+
default: "%B %d, %Y %l:%M:%S %p %z" # Used by default if no other `format` has been specified.
|
260
|
+
# my_format: # A valid strftime format of your choice.
|
261
|
+
```
|
262
|
+
|
263
|
+
#### Requirements
|
264
|
+
|
265
|
+
The plugin also places a few conventions to streamline usage:
|
266
|
+
* All datetime data should be encompassed under a `locale_date` key for each locale except the default locale, for which, the datetime data has been set by default. But you're free to *redefine* it when necessary.
|
267
|
+
* The array of names are filled in by default using values defined in Ruby's `Date` class.
|
268
|
+
* The array of full day names and full month names have `nil` as the first entry. So locales for non-English languages should have `nil` as the first entry. (In YAML, null list item can be written as simply `~`)
|
269
|
+
* The optional parameter for the filter, `format` should either be a string that corresponds to the symbol of the `formats` subkey (e.g. `":default"`) or a valid `strftime` format.
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
module Locale::DateTimeHandler
|
5
|
+
DATETIME_DEFAULTS = {
|
6
|
+
:date => {
|
7
|
+
:day_names => Date::DAYNAMES,
|
8
|
+
:month_names => Date::MONTHNAMES,
|
9
|
+
:abbr_day_names => Date::ABBR_DAYNAMES,
|
10
|
+
:abbr_month_names => Date::ABBR_MONTHNAMES,
|
11
|
+
},
|
12
|
+
:time => {
|
13
|
+
:am => "am",
|
14
|
+
:pm => "pm",
|
15
|
+
:formats => {
|
16
|
+
:default => "%B %d, %Y %l:%M:%S %p %z",
|
17
|
+
},
|
18
|
+
},
|
19
|
+
}.freeze
|
20
|
+
|
21
|
+
class << self
|
22
|
+
extend Forwardable
|
23
|
+
[:config, :backend].each do |method|
|
24
|
+
private def_delegator I18n, method
|
25
|
+
end
|
26
|
+
|
27
|
+
def bootstrap(handler)
|
28
|
+
@handler = handler
|
29
|
+
config.available_locales = @handler.available_locales
|
30
|
+
end
|
31
|
+
|
32
|
+
def localize(input, format)
|
33
|
+
object = date_cache(input)
|
34
|
+
locale = @handler.current_locale.to_sym
|
35
|
+
data = @handler.locale_dates[locale.to_s] || {}
|
36
|
+
store_translations(locale, data) unless translations.key?(locale)
|
37
|
+
backend.localize(locale, object, format)
|
38
|
+
end
|
39
|
+
|
40
|
+
def store_translations(locale, data)
|
41
|
+
backend.store_translations(
|
42
|
+
locale,
|
43
|
+
Utils.deep_merge_hashes(
|
44
|
+
DATETIME_DEFAULTS, Utils.recursive_symbolize_hash_keys(data)
|
45
|
+
)
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def translations
|
52
|
+
backend.send(:translations)
|
53
|
+
end
|
54
|
+
|
55
|
+
def date_cache(input)
|
56
|
+
@date_cache ||= {}
|
57
|
+
@date_cache[input] ||= Liquid::Utils.to_date(input)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
module Locale
|
5
|
+
module Filters
|
6
|
+
def localize_date(input, format = :default)
|
7
|
+
format = symbol_or_strftime(format)
|
8
|
+
DateTimeHandler.localize(time(input), format)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def symbol_or_strftime(format)
|
14
|
+
return format if format.is_a?(Symbol)
|
15
|
+
|
16
|
+
format = format.to_s
|
17
|
+
if format.start_with?(":")
|
18
|
+
format.sub(":", "").to_sym
|
19
|
+
elsif format.start_with?("%")
|
20
|
+
format
|
21
|
+
else
|
22
|
+
:default
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
Liquid::Template.register_filter(Jekyll::Locale::Filters)
|
@@ -8,9 +8,9 @@ module Jekyll
|
|
8
8
|
def generate(site)
|
9
9
|
@site = site
|
10
10
|
handler = site.locale_handler
|
11
|
-
return if handler.
|
11
|
+
return if handler.user_locales.empty?
|
12
12
|
|
13
|
-
handler.
|
13
|
+
handler.user_locales.each do |locale|
|
14
14
|
handler.filtered_portfolio.each do |canon_doc|
|
15
15
|
handler.append_document(Locale::AutoPage, canon_doc, locale, site.pages)
|
16
16
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Jekyll
|
4
4
|
class Locale::Handler
|
5
|
+
attr_reader :locale_dates
|
5
6
|
attr_writer :current_locale
|
6
7
|
|
7
8
|
DEFAULT_CONFIG = {
|
@@ -25,8 +26,9 @@ module Jekyll
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def reset
|
28
|
-
@
|
29
|
-
@
|
29
|
+
@portfolio = nil
|
30
|
+
@locale_data = {}
|
31
|
+
@locale_dates = {}
|
30
32
|
end
|
31
33
|
|
32
34
|
def data
|
@@ -50,7 +52,7 @@ module Jekyll
|
|
50
52
|
end
|
51
53
|
|
52
54
|
def read
|
53
|
-
|
55
|
+
user_locales.each do |locale|
|
54
56
|
portfolio.each do |canon_doc|
|
55
57
|
# consider only instances of class that include `Jekyll::Locale::Support` mixin
|
56
58
|
next unless canon_doc.is_a?(Jekyll::Locale::Support)
|
@@ -75,14 +77,18 @@ module Jekyll
|
|
75
77
|
base_array << locale_page
|
76
78
|
end
|
77
79
|
|
78
|
-
def
|
79
|
-
@
|
80
|
+
def user_locales
|
81
|
+
@user_locales ||= begin
|
80
82
|
locales = Array(config["locales_set"]) - [default_locale]
|
81
83
|
locales.compact!
|
82
84
|
locales
|
83
85
|
end
|
84
86
|
end
|
85
87
|
|
88
|
+
def available_locales
|
89
|
+
@available_locales ||= user_locales + [default_locale]
|
90
|
+
end
|
91
|
+
|
86
92
|
def current_locale
|
87
93
|
@current_locale ||= default_locale
|
88
94
|
end
|
@@ -106,13 +112,20 @@ module Jekyll
|
|
106
112
|
end
|
107
113
|
end
|
108
114
|
|
115
|
+
def setup
|
116
|
+
@date_handler = Locale::DateTimeHandler
|
117
|
+
@date_handler.bootstrap(self)
|
118
|
+
@locale_data = setup_data if @locale_data.empty?
|
119
|
+
nil
|
120
|
+
end
|
121
|
+
|
109
122
|
def inspect
|
110
123
|
"#<#{self.class} @site=#{site}>"
|
111
124
|
end
|
112
125
|
|
113
126
|
private
|
114
127
|
|
115
|
-
attr_reader :site, :config
|
128
|
+
attr_reader :site, :config, :locale_data
|
116
129
|
|
117
130
|
def html_pages
|
118
131
|
@html_pages ||= begin
|
@@ -125,26 +138,28 @@ module Jekyll
|
|
125
138
|
@locales_dir ||= fetch("data_dir")
|
126
139
|
end
|
127
140
|
|
128
|
-
def
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
return result unless ldata.is_a?(Hash)
|
133
|
-
|
134
|
-
ldata.each do |loc, loc_data|
|
135
|
-
locale = Utils.snakeify(loc)
|
136
|
-
result[locale] = {}
|
137
|
-
next unless loc_data.is_a?(Hash)
|
141
|
+
def setup_data
|
142
|
+
ldata = site.site_data[locales_dir]
|
143
|
+
result = {}
|
144
|
+
return result unless ldata.is_a?(Hash)
|
138
145
|
|
139
|
-
|
140
|
-
|
146
|
+
ldata.each do |loc, loc_data|
|
147
|
+
locale = Utils.snakeify(loc)
|
148
|
+
result[locale] = {}
|
149
|
+
next unless loc_data.is_a?(Hash)
|
141
150
|
|
142
|
-
|
151
|
+
date_data = @date_handler::DATETIME_DEFAULTS
|
152
|
+
loc_data.each do |key, value|
|
153
|
+
if key == "locale_date"
|
154
|
+
date_data = Utils.recursive_symbolize_hash_keys(value) if value.is_a?(Hash)
|
155
|
+
elsif value.is_a?(String)
|
156
|
+
result[locale][Utils.snakeify(key)] = value
|
143
157
|
end
|
144
158
|
end
|
145
|
-
|
146
|
-
result
|
159
|
+
@locale_dates[loc] = date_data
|
147
160
|
end
|
161
|
+
|
162
|
+
result
|
148
163
|
end
|
149
164
|
|
150
165
|
def fetch(key)
|
data/lib/jekyll/patches/utils.rb
CHANGED
@@ -26,6 +26,15 @@ module Jekyll
|
|
26
26
|
slugify(input.to_s, :mode => "latin", :replacement => "_")
|
27
27
|
end
|
28
28
|
|
29
|
+
def recursive_symbolize_hash_keys(hash)
|
30
|
+
result = {}
|
31
|
+
hash.each do |key, value|
|
32
|
+
new_key = key.to_s.to_sym
|
33
|
+
result[new_key] = value.is_a?(Hash) ? recursive_symbolize_hash_keys(value) : value
|
34
|
+
end
|
35
|
+
result
|
36
|
+
end
|
37
|
+
|
29
38
|
def slugify(string, mode: nil, cased: false, replacement: "-")
|
30
39
|
mode ||= "default"
|
31
40
|
return nil if string.nil?
|
data/lib/jekyll-locale.rb
CHANGED
@@ -13,6 +13,9 @@ end
|
|
13
13
|
require_relative "jekyll/patches/site"
|
14
14
|
require_relative "jekyll/patches/utils"
|
15
15
|
|
16
|
+
require_relative "jekyll/locale/date_time_handler"
|
17
|
+
require_relative "jekyll/locale/filters"
|
18
|
+
|
16
19
|
require_relative "jekyll/locale/mixins/support"
|
17
20
|
require_relative "jekyll/locale/mixins/helper"
|
18
21
|
|
@@ -25,11 +28,13 @@ end
|
|
25
28
|
Jekyll::Hooks.register :site, :after_reset do |site|
|
26
29
|
handler = site.locale_handler
|
27
30
|
handler.reset
|
31
|
+
I18n.config.enforce_available_locales = false
|
28
32
|
require_relative "jekyll/locale/generator" if handler.mode == "auto"
|
29
33
|
end
|
30
34
|
|
31
35
|
Jekyll::Hooks.register :site, :post_read do |site|
|
32
36
|
handler = site.locale_handler
|
37
|
+
handler.setup
|
33
38
|
handler.read unless handler.mode == "auto"
|
34
39
|
end
|
35
40
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-locale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ashwin Maroli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -35,8 +35,10 @@ files:
|
|
35
35
|
- README.md
|
36
36
|
- lib/jekyll-locale.rb
|
37
37
|
- lib/jekyll/locale/auto_page.rb
|
38
|
+
- lib/jekyll/locale/date_time_handler.rb
|
38
39
|
- lib/jekyll/locale/document.rb
|
39
40
|
- lib/jekyll/locale/drop.rb
|
41
|
+
- lib/jekyll/locale/filters.rb
|
40
42
|
- lib/jekyll/locale/generator.rb
|
41
43
|
- lib/jekyll/locale/handler.rb
|
42
44
|
- lib/jekyll/locale/mixins/helper.rb
|