jekyll-language-plugin 1.0.2 → 1.1.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 +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
|