jekyll-language-plugin 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +24 -1
- data/lib/jekyll-language-plugin.rb +5 -0
- data/lib/jekyll-language-plugin/date_localizer.rb +39 -0
- data/lib/jekyll-language-plugin/liquid_context.rb +46 -0
- data/lib/jekyll/filters/language_date.rb +30 -0
- data/lib/jekyll/readers/language_post_reader.rb +1 -1
- data/lib/jekyll/tags/language.rb +3 -29
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 09d08bc0bd9ace9e9ed14474e8f57ce0298e6779
|
4
|
+
data.tar.gz: a6ab1ecd54e36a03a986af23d5ee9b0f16f35af5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91724843ebb69d1ad67e45b3ca8937f50b2cbb2bf5f8c2f1c1caf0803c8d86ddf6d959656b293bfa755f57354b58678ed3010a9baf340270fc8cf0b657e9d26e
|
7
|
+
data.tar.gz: 97201c70f08003ea0426e0009202d1153660a651f5a87535dc0a1c7fc18ed7c88ec157018d6a980bd6e308f2791b7b96aa68b35f53468abe257af57988bfc7ef
|
data/README.md
CHANGED
@@ -11,6 +11,7 @@ This plugin has been developed with user-simplicity in mind. It does not require
|
|
11
11
|
* Translates pages and posts into multiple languages
|
12
12
|
* Supports all template languages that your Liquid pipeline supports.
|
13
13
|
* Uses liquid tags in your HTML for including translated strings and language-specific includes.
|
14
|
+
* Supports localized dates via liquid filter
|
14
15
|
* Works with `jekyll serve --watch`
|
15
16
|
* Supports includes translated into multiple languages
|
16
17
|
|
@@ -134,12 +135,34 @@ Currently, there are two liquid tags provided by this plugin.
|
|
134
135
|
|
135
136
|
The `t` liquid tag provides a convenient way of accessing language-specific translations from the language data referred to in the configuration file.
|
136
137
|
|
137
|
-
If an alias is given by the page's or post's front-matter, `t` will look into the language-specific alias first. Only if the key cannot be found there, it will perform another lookup without the alias. This can be useful for common translations like a copyright notice.
|
138
|
+
If an alias is given by the page's or post's front-matter, `t` will look into the language-specific alias first. Only if the key cannot be found there, it will perform another lookup without the alias. This can be useful for common translations like a copyright notice. The key can also be a dot-notation of multiple keys which are traversed upon lookup.
|
139
|
+
|
140
|
+
*Example*: `{% t homepage_welcome %}`
|
138
141
|
|
139
142
|
### Language-Specific Include Tag
|
140
143
|
|
141
144
|
The `tinclude` liquid tag works just like the Jekyll-standard `include` tag. But unlike `include`, `tinclude` will not look into the `_includes` directory. Instead it will look into the directory specified by the `language_includes_dir` configuration setting, here `_i18n`. Then it travels one subdirectory down for the language name. If you `{% tinclude lorem.txt %}`, `tinclude` will look for the file in `_i18n/en/lorem.txt` if the language is English.
|
142
145
|
|
146
|
+
*Example*: `{% tinclude imprint.html %}`
|
147
|
+
|
148
|
+
### Language-Specific Date Filter
|
149
|
+
|
150
|
+
The `tdate` liquid filter provides localized date-formatting using the day and month names specified in the language data for each language. Note that if you are using this filter, a `date` key must be present for every supported language.
|
151
|
+
|
152
|
+
The `tdate` filter takes one argument, the date format language key. A lookup is performed just like the `t` tag does.
|
153
|
+
|
154
|
+
The following excerpt shows the english date translation:
|
155
|
+
|
156
|
+
```
|
157
|
+
date:
|
158
|
+
abbr_daynames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
|
159
|
+
daynames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
|
160
|
+
abbr_monthnames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
161
|
+
monthnames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
|
162
|
+
```
|
163
|
+
|
164
|
+
*Example*: `{{ post.date | tdate: 'post_date_format' }}`
|
165
|
+
|
143
166
|
# Example Site
|
144
167
|
|
145
168
|
This repository contains a ready-to-use example site using this plugin in the `example` subdirectory. Check it out and run `bundle install` followed by `bundle exec jekyll build` to build the site.
|
@@ -1,9 +1,14 @@
|
|
1
|
+
# require all files in jekyll-language-plugin subdirectory
|
2
|
+
require 'jekyll-language-plugin/liquid_context.rb'
|
3
|
+
require 'jekyll-language-plugin/date_localizer.rb'
|
4
|
+
|
1
5
|
# require all files in jekyll subdirectory
|
2
6
|
require 'jekyll/language_reader.rb'
|
3
7
|
require 'jekyll/language_page.rb'
|
4
8
|
require 'jekyll/language_document.rb'
|
5
9
|
require 'jekyll/readers/language_page_reader.rb'
|
6
10
|
require 'jekyll/readers/language_post_reader.rb'
|
11
|
+
require 'jekyll/filters/language_date.rb'
|
7
12
|
require 'jekyll/tags/language.rb'
|
8
13
|
require 'jekyll/tags/language_include.rb'
|
9
14
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module JekyllLanguagePlugin
|
2
|
+
module DateLocalizer
|
3
|
+
def self.localize_date(date, format, context)
|
4
|
+
translation = JekyllLanguagePlugin::LiquidContext.get_language_data(context, 'date')
|
5
|
+
|
6
|
+
# validate language translation
|
7
|
+
return nil if translation.nil? ||
|
8
|
+
!['abbr_daynames', 'daynames', 'abbr_monthnames', 'monthnames'].all? {|s| translation.key?(s) && translation[s].is_a?(Array) } ||
|
9
|
+
translation['abbr_daynames'].size < 7 || translation['daynames'].size < 7 ||
|
10
|
+
translation['abbr_monthnames'].size < 12 || translation['monthnames'].size < 12
|
11
|
+
|
12
|
+
#convert to extended Time class
|
13
|
+
date2 = JLPTime.at(date.to_i)
|
14
|
+
date2.strftime_translate(format, translation)
|
15
|
+
end
|
16
|
+
|
17
|
+
class JLPTime < Time
|
18
|
+
def strftime_translate(format = '%F', translation)
|
19
|
+
result = self.strftime(
|
20
|
+
#...you replaced the language dependent parts.
|
21
|
+
format.gsub(/%([aAbB])/){ |m|
|
22
|
+
case $1
|
23
|
+
when 'a'; translation['abbr_daynames'][self.wday]
|
24
|
+
when 'A'; translation['daynames'][self.wday]
|
25
|
+
when 'b'; translation['abbr_monthnames'][self.mon-1]
|
26
|
+
when 'B'; translation['monthnames'][self.mon-1]
|
27
|
+
else
|
28
|
+
raise "Date#strftime: InputError"
|
29
|
+
end
|
30
|
+
})
|
31
|
+
if defined? @@encoding_converter
|
32
|
+
@@encoding_converter.iconv(result)
|
33
|
+
else
|
34
|
+
result
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module JekyllLanguagePlugin
|
2
|
+
module LiquidContext
|
3
|
+
def self.get_language_data(context, keys = nil)
|
4
|
+
site = context.registers[:site]
|
5
|
+
language_data = site.config['language_data']
|
6
|
+
page_language = context.registers[:page]['language']
|
7
|
+
return nil if language_data.to_s.empty? || page_language.to_s.empty?
|
8
|
+
|
9
|
+
keys2 = language_data.gsub("%%", page_language).split('.')
|
10
|
+
language_data = site.send(keys2.shift)
|
11
|
+
language_data = self.traverse_hash(language_data, keys2)
|
12
|
+
|
13
|
+
return language_data if keys.to_s.empty? # can also return nil
|
14
|
+
self.traverse_hash(language_data, keys)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.get_language_string(context, key)
|
18
|
+
data = self.get_language_data(context)
|
19
|
+
return "" if data.nil?
|
20
|
+
|
21
|
+
page_alias = context.registers[:page]['alias']
|
22
|
+
if (!page_alias.to_s.empty? &&
|
23
|
+
!(str = traverse_hash(traverse_hash(data, page_alias), key)).to_s.empty?) ||
|
24
|
+
!(str = traverse_hash(data, key)).to_s.empty?
|
25
|
+
return str
|
26
|
+
end
|
27
|
+
|
28
|
+
""
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.traverse_hash(hash, keys)
|
32
|
+
return nil if hash.nil? || keys.to_s.empty?
|
33
|
+
keys = keys.split('.') if keys.is_a?(String)
|
34
|
+
|
35
|
+
for key in keys
|
36
|
+
if !hash.is_a?(Hash)
|
37
|
+
return hash
|
38
|
+
elsif !hash.key?(key)
|
39
|
+
return nil
|
40
|
+
end
|
41
|
+
hash = hash[key]
|
42
|
+
end
|
43
|
+
hash
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module Filters
|
3
|
+
module LanguageDate
|
4
|
+
def tdate(input, fkey)
|
5
|
+
if ((input.is_a?(String) && !/^\d+$/.match(input).nil?) || input.is_a?(Integer)) && input.to_i > 0
|
6
|
+
date = Time.at(input.to_i)
|
7
|
+
elsif input.is_a?(String)
|
8
|
+
case input.downcase
|
9
|
+
when 'now', 'today'
|
10
|
+
date = Time.now
|
11
|
+
else
|
12
|
+
date = Time.parse(input)
|
13
|
+
end
|
14
|
+
elsif input.is_a?(Time)
|
15
|
+
date = input
|
16
|
+
else
|
17
|
+
date = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
return "" if !date.is_a?(Time)
|
21
|
+
format = JekyllLanguagePlugin::LiquidContext.get_language_string(@context, fkey)
|
22
|
+
return "" if format.nil?
|
23
|
+
|
24
|
+
JekyllLanguagePlugin::DateLocalizer.localize_date(date, format, @context).to_s
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Liquid::Template.register_filter(Jekyll::Filters::LanguageDate)
|
@@ -8,7 +8,7 @@ module Jekyll
|
|
8
8
|
ldocument.read
|
9
9
|
|
10
10
|
languages = ldocument.languages.is_a?(Enumerable) ? ldocument.languages : []
|
11
|
-
if ldocument.language
|
11
|
+
if ldocument.language && !languages.include?(ldocument.language)
|
12
12
|
languages.push(ldocument.language)
|
13
13
|
end
|
14
14
|
|
data/lib/jekyll/tags/language.rb
CHANGED
@@ -7,36 +7,10 @@ module Jekyll
|
|
7
7
|
@lkey = @params.shift
|
8
8
|
end
|
9
9
|
|
10
|
-
def get_language_data(context, language)
|
11
|
-
language_data = context['site']['language_data'].strip
|
12
|
-
traverse = language_data.gsub("%%", language).split('.')
|
13
|
-
|
14
|
-
data = context['site']
|
15
|
-
traverse.each { |t| data = data[t] }
|
16
|
-
data
|
17
|
-
end
|
18
|
-
|
19
|
-
def get_language_string(context, key)
|
20
|
-
page_language = context['page']['language']
|
21
|
-
|
22
|
-
if not page_language
|
23
|
-
return ""
|
24
|
-
end
|
25
|
-
|
26
|
-
page_alias = context['page']['alias']
|
27
|
-
|
28
|
-
data = get_language_data(context, page_language)
|
29
|
-
if page_alias and data.include?(page_alias) and data[page_alias].include?(key)
|
30
|
-
"#{data[page_alias][key]}"
|
31
|
-
elsif data.include?(key)
|
32
|
-
"#{data[key]}"
|
33
|
-
else
|
34
|
-
""
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
10
|
def render(context)
|
39
|
-
str = get_language_string(context, @lkey)
|
11
|
+
str = JekyllLanguagePlugin::LiquidContext.get_language_string(context, @lkey)
|
12
|
+
return "" if str.nil?
|
13
|
+
|
40
14
|
@params.each { |p| str.sub!("%%", p) }
|
41
15
|
str
|
42
16
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-language-plugin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vincent Wochnik
|
@@ -74,6 +74,7 @@ extensions: []
|
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
76
|
- lib/jekyll-language-plugin.rb
|
77
|
+
- lib/jekyll/filters/language_date.rb
|
77
78
|
- lib/jekyll/language_document.rb
|
78
79
|
- lib/jekyll/language_page.rb
|
79
80
|
- lib/jekyll/language_reader.rb
|
@@ -81,6 +82,8 @@ files:
|
|
81
82
|
- lib/jekyll/readers/language_post_reader.rb
|
82
83
|
- lib/jekyll/tags/language.rb
|
83
84
|
- lib/jekyll/tags/language_include.rb
|
85
|
+
- lib/jekyll-language-plugin/date_localizer.rb
|
86
|
+
- lib/jekyll-language-plugin/liquid_context.rb
|
84
87
|
- README.md
|
85
88
|
- LICENSE.md
|
86
89
|
homepage: https://github.com/vwochnik/jekyll-language-plugin
|