forked from yeah/radiant-multilingual-pages-extension
/
multilingual_page_tags.rb
120 lines (101 loc) · 4.19 KB
/
multilingual_page_tags.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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
module MultilingualPageTags
include Radiant::Taggable
desc %{
Renders a string according to the current language.
*Usage:*
<pre><code><r:translate en="Welcome" de="Willkommen" /></code></pre>
}
tag "translate" do |tag|
tag.attr[Thread.current[:requested_language]||MultilingualPagesExtension::DEFAULT_LANGUAGE]
end
desc %{
Expands if the current language matches the lang attribute.
*Usage:*
<pre><code><r:if_language lang="en"><p>This is an english paragraph.</p></r:if_language></code></pre>
<pre><code><r:if_language lang="de"><p>Dies ist ein Absatz auf deutsch.</p></r:if_language></code></pre>
}
tag "if_language" do |tag|
tag.expand if tag.attr['lang'] == (Thread.current[:requested_language]||MultilingualPagesExtension::DEFAULT_LANGUAGE)
end
desc %{
Renders a meta tag with the current language. (Put this in your layout.)
*Usage:*
<pre><code><r:meta:language/></code></pre>
}
tag "meta:language" do |tag|
"<meta name=\"language\" content=\"#{Thread.current[:requested_language]||MultilingualPagesExtension::DEFAULT_LANGUAGE}\"/>"
end
desc %{
Renders a list of links to versions of the page in other available languages. Links can have three states:
* @current@ specifies the state of the link when this language is currently selected
* @available@ specifies the state of the link when this page is translated and available in this language
* @unavailable@ specifies the state of the link when this page is not translated in this language
The @between@ tag specifies what should be inserted in between each of the links.
*Usage (sample with flag icons):*
<pre><code>
<r:language_selection>
<r:current>
<img src="/images/flags/<r:language />.png" />
</r:current>
<r:available>
<a href="<r:url />" title="<r:title />"><img src="/images/flags/<r:language />-inactive.png" /></a>
</r:available>
<r:unavailable>
<img src="/images/flags/<r:language />-strikethrough.png" />
</r:unavailable>
<r:between> </r:between>
</r:language_selection>
</code></pre>
*Usage (sample with select box):*
<pre><code>
<select onchange="location.href=this.value;">
<r:language_selection>
<r:current>
<option selected="selected" value="<r:url />"><r:language_name /></option>
</r:current>
<r:available>
<option value="<r:url />"><r:language_name /></option>
</r:available>
<r:unavailable>
<option disabled="disabled" value="<r:url />"><r:language_name /></option>
</r:unavailable>
</r:language_selection>
</select>
</code></pre>
}
tag 'language_selection' do |tag|
page = tag.locals.page
hash = tag.locals.language_selection = {}
tag.expand
raise TagError.new("`navigation' tag must include an `available' tag") unless hash.has_key? :available
result = []
MultilingualPagesExtension::AVAILABLE_LANGUAGES.split(',').each do |language|
hash[:title] = page.is_a?(MultilingualPage) ? page.multilingual_meta(:title, language) : page.title
hash[:language] = language
hash[:language_name] = MultilingualPagesExtension::LANGUAGE_NAMES[language]||language
url = page.is_a?(MultilingualPage) ? page.url(language) : "#{page.url}#{MultilingualPagesExtension::NON_MULTILINGUAL_ROUTE}#{language}"
hash[:url] = relative_url_for(url, tag.globals.page.request)
if (Thread.current[:requested_language]||MultilingualPagesExtension::DEFAULT_LANGUAGE) == language
result << hash[:current].call
elsif page.is_a?(MultilingualPage) and not page.languages.include?(language)
result << hash[:unavailable].call
else
result << hash[:available].call
end
end
between = hash.has_key?(:between) ? hash[:between].call : ' '
result.reject { |i| i.blank? }.join(between)
end
[:current, :available, :unavailable, :between].each do |symbol|
tag "language_selection:#{symbol}" do |tag|
hash = tag.locals.language_selection
hash[symbol] = tag.block
end
end
[:title, :language, :language_name, :url].each do |symbol|
tag "language_selection:#{symbol}" do |tag|
hash = tag.locals.language_selection
hash[symbol]
end
end
end