Skip to content

Commit f1dcee8

Browse files
committed
Migrate the translated manual pages to the Hugo world
This imitates the commit that did the same for the English (i.e. untranslated) manual pages. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent 840cc25 commit f1dcee8

File tree

7 files changed

+151
-148
lines changed

7 files changed

+151
-148
lines changed

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,13 @@ Or you can populate the man pages from GitHub (much slower) like this:
8686

8787
Similarly, you can also populate the localized man pages. From a local clone of https://github.com/jnavila/git-html-l10n :
8888

89-
$ GIT_REPO=../git-html-l10n/.git rake local_index_l10n # all versions
90-
$ GIT_REPO=../git-html-l10n/.git REBUILD_DOC=$version rake local_index_l10n # specific version
89+
$ ruby ./script/update-docs.rb /path/to/git-html-l10n/.git l10n # all versions
90+
$ REBUILD_DOC=$version ruby ./script/update-docs.rb /path/to/git-html-l10n/.git l10n # specific version
9191

9292
Or you can do it from GitHub (much slower) like this:
9393

9494
$ export GITHUB_API_TOKEN=github_personal_auth_token
95-
$ rake preindex_l10n # all versions
96-
$ REBUILD_DOC=$version rake preindex_l10n # specific version
95+
$ REBUILD_DOC=$version ruby ./script/update-docs.rb remote l10n # specific version
9796

9897
## Update the `Downloads` pages
9998

data/lang_names.yml

Lines changed: 22 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,22 @@
1-
# frozen_string_literal: true
2-
3-
# t.string :name
4-
# t.timestamps
5-
class DocFile < ApplicationRecord
6-
has_many :doc_versions, dependent: :delete_all
7-
has_many :versions, through: :doc_versions
8-
9-
scope :with_includes, -> { includes(doc_versions: %i[doc version]) }
10-
11-
@@true_lang = {
12-
"de" => "Deutsch",
13-
"en" => "English",
14-
"es" => "Español",
15-
"es_MX" => "Español (Mexico)",
16-
"fr" => "Français",
17-
"hu" => "magyar",
18-
"id" => "Bahasa Indonesia",
19-
"is" => "Íslenska",
20-
"it" => "Italiano",
21-
"ja" => "日本語",
22-
"mr" => "मराठी",
23-
"nb_NO" => "Norsk bokmål",
24-
"nl" => "Nederlands",
25-
"pl" => "Polski",
26-
"pt_BR" => "Português (Brasil)",
27-
"pt_PT" => "Português (Portugal)",
28-
"ro" => "Română",
29-
"ru" => "Русский",
30-
"tr" => "Türkçe",
31-
"uk" => "українська мова",
32-
"zh_HANS-CN" => "简体中文",
33-
"zh_HANT" => "繁體中文"
34-
}
35-
36-
def true_lang
37-
@@true_lang
38-
end
39-
40-
def languages
41-
doc_versions.select(:language).distinct.collect do |v|
42-
[v[:language], @@true_lang[v[:language]] || v[:language]]
43-
end
44-
end
45-
46-
def version_changes(limit_size = 100)
47-
unchanged_versions = []
48-
changes = []
49-
doc_versions = self.doc_versions.includes(:version).version_changes.limit(limit_size).to_a
50-
doc_versions.each_with_index do |doc_version, i|
51-
previous_doc_version = doc_versions[i + 1]
52-
next unless previous_doc_version
53-
54-
sha2 = doc_version.doc.blob_sha
55-
sha1 = previous_doc_version.doc.blob_sha
56-
if sha1 == sha2
57-
unchanged_versions << doc_version.name
58-
else
59-
if !unchanged_versions.empty?
60-
if unchanged_versions.size == 1
61-
changes << { name: "#{unchanged_versions.first} no changes", changed: false }
62-
else
63-
changes << { name: "#{unchanged_versions.last} &rarr; #{unchanged_versions.first} no changes",
64-
changed: false }
65-
end
66-
unchanged_versions = []
67-
end
68-
changes << { name: doc_version.name, time: doc_version.committed, diff: previous_doc_version.diff(doc_version),
69-
changed: true }
70-
end
71-
end
72-
changes
73-
end
74-
75-
# TODO: parse file for description
76-
def description
77-
""
78-
end
79-
end
1+
de: "Deutsch"
2+
en: "English"
3+
es: "Español"
4+
es_MX: "Español (Mexico)"
5+
fr: "Français"
6+
hu: "magyar"
7+
id: "Bahasa Indonesia"
8+
is: "Íslenska"
9+
it: "Italiano"
10+
ja: "日本語"
11+
mr: "मराठी"
12+
nb_NO: "Norsk bokmål"
13+
nl: "Nederlands"
14+
pl: "Polski"
15+
pt_BR: "Português (Brasil)"
16+
pt_PT: "Português (Portugal)"
17+
ro: "Română"
18+
ru: "Русский"
19+
tr: "Türkçe"
20+
uk: "українська мова"
21+
zh_HANS-CN: "简体中文"
22+
zh_HANT: "繁體中文"

layouts/_default/baseof.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ <h1>{{ .Params.book.section.cs_number }} {{ .Params.book.chapter.title }} - {{ .
109109
{{ partial "sidebar.html" . }}
110110
<div id="content">
111111
<div id='reference-version'>
112+
{{ partial "ref/languages.html" . }}
113+
{{ partial "ref/topics.html" . }}
112114
{{ partial "ref/versions.html" . }}
113115
</div>
114116

layouts/partials/ref/languages.html

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
1-
<a class="dropdown-trigger" id="reference-languages-trigger" data-panel-id="l10n-versions-dropdown" href="#"><%if @language%>
2-
<%= @doc_file.true_lang[@language]||@language %> <% else %> Language <% end %></a>
1+
{{ $page_data := index $.Site.Data.docs.pages .Params.docname }}
2+
<a class="dropdown-trigger" id="reference-languages-trigger" data-panel-id="l10n-versions-dropdown" href="#">{{ if isset .Params "lang" }}
3+
{{ if isset $.Site.Data.lang_names .Params.lang }}{{ index $.Site.Data.lang_names .Params.lang }}{{ else }}{{ .Params.lang }}{{ end }} {{ else }} {{ $.Site.Data.lang_names.en }} {{ end }}▾</a>
34
<div class='dropdown-panel right' id='l10n-versions-dropdown'>
4-
<header>Localized versions of <strong><%= @doc_file.name %></strong> manual</header>
5+
<header>Localized versions of <strong>{{ .Params.docname }}</strong> manual</header>
56
<ol class='reference-previous-versions'>
6-
<% @doc_file.languages.each do |code, language| %>
7-
<li>
8-
<a href="/docs/<%= @doc_file.name %>/<%= code %>"><span class="version"><%= language %></span>
7+
{{ if isset $page_data "latest-changes" }}
8+
<li>
9+
<a href="{{ relURL (print "docs/" .Params.docname) }}"><span class="version">{{ .Site.Data.lang_names.en }}</span>
10+
</a>
11+
</li>
12+
{{ end }}
13+
{{ range $code, $value := $page_data.languages }}
14+
<li>
15+
<a href="{{ relURL (print "docs/" $.Params.docname "/" $code) }}"><span class="version">{{ index $.Site.Data.lang_names $code }}</span>
916
</a>
1017
</li>
11-
<% end %>
18+
{{ end }}
1219
</ol>
1320
<footer>
1421
Want to read in your language or fix typos?<br/> <a href="https://github.com/jnavila/git-manpages-l10n">You can help translate this page</a>.

layouts/partials/ref/topics.html

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{{ $context := . }}
2+
<a class="dropdown-trigger" id="reference-topics-trigger" data-panel-id="topics-dropdown" href="#">Topics ▾</a>
3+
<div class='dropdown-panel right' id='topics-dropdown'>
4+
<div class='three-column'>
5+
<div class='column-left'>
6+
{{ range slice "setup" "projects" "snapshotting" "branching" "sharing" }}
7+
{{ $context.Scratch.Set "category_id" . }}
8+
{{ partial "ref/category.html" $context }}
9+
{{ end }}
10+
</div>
11+
<div class='column-middle'>
12+
{{ range slice "inspection" "patching" "debugging" "email" "external" "server-admin" }}
13+
{{ $context.Scratch.Set "category_id" . }}
14+
{{ partial "ref/category.html" $context }}
15+
{{ end }}
16+
</div>
17+
<div class='column-right'>
18+
{{ range slice "guides" "admin" "plumbing" }}
19+
{{ $context.Scratch.Set "category_id" . }}
20+
{{ partial "ref/category.html" $context }}
21+
{{ end }}
22+
</div>
23+
</div>
24+
</div>

layouts/partials/ref/versions.html

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,36 @@
1-
{% assign versions = site.data.docs.pages[page.docname] %}
1+
{{ $versions := index .Site.Data.docs.pages .Params.docname }}
22
<a class="dropdown-trigger" id="reference-versions-trigger" data-panel-id="previous-versions-dropdown" href="#">
3-
{% if page['version'] and page['version'] != versions['latest-changes'] %}
4-
Version {{ page['version'] }}
5-
{% else %}
3+
{{ if (and (isset .Params "version") (ne .Params.version (index $versions "latest-changes"))) }}
4+
Version {{ .Params.version }}
5+
{{ else }}
66
Latest version
7-
{% endif %} ▾ </a>
8-
<span class="light d-flex">{{ page.docname }} last updated in {{ versions['latest-changes'] }}</span>
7+
{{ end }} ▾ </a>
8+
<span class="light d-flex">{{ .Params.docname }} last updated in {{ index $versions "latest-changes" }}</span>
99
<div class='dropdown-panel left' id='previous-versions-dropdown'>
10-
<header>Changes in the <strong>{{ page.docname }}</strong> manual</header>
10+
<header>Changes in the <strong>{{ .Params.docname }}</strong> manual</header>
1111
<ol class='reference-previous-versions'>
12-
{% for v in versions['page-versions'] %}
13-
{% if v.added %}
12+
{{ range $v := index $versions "page-versions" }}
13+
{{ if $v.added }}
1414
<li>
15-
<a href="{{ "/docs/" | append: page.docname | append: "/" | append: v.name | relative_url }}"><span class="version">{{ v.name }}</span>
15+
<a href="{{ relURL (print "docs/" $.Params.docname "/" $v.name) }}"><span class="version">{{ $v.name }}</span>
1616
<span class="diff">
17-
{% assign range = (1..v.added) %}
18-
{% for i in range %}
19-
<img src="{{ "/images/icons/green-dot.png" | relative_url }}" />
20-
{% endfor %}
21-
{% assign range = (1..v.removed) %}
22-
{% for i in range %}
23-
<img src="{{ "/images/icons/red-dot.png" | relative_url }}" />
24-
{% endfor %}
25-
{% assign padding = 8 | minus: v.added | minus: v.removed %}
26-
{% assign range = (1..padding) %}
27-
{% for i in range %}
28-
<img src="{{ "/images/icons/grey-dot.png" | relative_url }}" />
29-
{% endfor %}
17+
{{ range $i := seq 1 $v.added }}
18+
<img src="{{ relURL "images/icons/green-dot.png" }}" />
19+
{{ end }}
20+
{{ range $i := seq 1 $v.removed }}
21+
<img src="{{ relURL "images/icons/red-dot.png" }}" />
22+
{{ end }}
23+
{{ range $i := seq 1 (sub 8 $v.added $v.removed) }}
24+
<img src="{{ relURL "images/icons/grey-dot.png" }}" />
25+
{{ end }}
3026
</span>
31-
<em class="date">{{ site.data.docs.versions[v.name].date }}</em>
27+
<em class="date">{{ index (index $.Site.Data.docs.versions $v.name) "date" }}</em>
3228
</a>
3329
</li>
34-
{% else %}
35-
<li class="no-change"><span>{{ v.name }} no changes</span></li>
36-
{% endif %}
37-
{% endfor %}
30+
{{ else }}
31+
<li class="no-change"><span>{{ safeHTML $v.name }} no changes</span></li>
32+
{{ end }}
33+
{{ end }}
3834
<li>&nbsp;</li>
3935
<!-- <li><a class="more" href="#">See more previous releases →</a></li> -->
4036
</ol>

script/update-docs.rb

Lines changed: 62 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,19 @@ def index_l10n_doc(filter_tags, doc_list, get_content)
6868
rebuild = ENV.fetch("REBUILD_DOC", nil)
6969
rerun = ENV["RERUN"] || rebuild || false
7070

71+
data = read_data
72+
data["l10n"] = {} unless data["l10n"]
73+
l10n = data["l10n"]
74+
7175
filter_tags.call(rebuild, false).sort_by { |tag| Version.version_to_num(tag.first[1..]) }.each do |tag|
7276
name, commit_sha, tree_sha, ts = tag
7377
puts "#{name}: #{ts}, #{commit_sha[0, 8]}, #{tree_sha[0, 8]}"
7478

75-
stag = Version.where(name: name.gsub("v", "l10n")).first_or_create
76-
77-
next if (stag.commit_sha == commit_sha) && !rerun
79+
next if !rerun && l10n["committed"] and l10n["committed"] >= ts
7880

79-
stag.commit_sha = commit_sha
80-
stag.tree_sha = tree_sha
81-
stag.committed = ts
82-
stag.save
81+
l10n["commit_sha"] = commit_sha
82+
l10n["tree_sha"] = tree_sha
83+
l10n["committed"] = ts
8384

8485
tag_files = doc_list.call(tree_sha)
8586
doc_files = tag_files.select do |ent|
@@ -110,43 +111,74 @@ def index_l10n_doc(filter_tags, doc_list, get_content)
110111
lang = File.dirname(full_path)
111112
path = File.basename(full_path, ".txt")
112113

113-
file = DocFile.where(name: path).first_or_create
114+
doc_path = "#{SITE_ROOT}external/docs/content/docs/#{path}"
114115

115116
puts " build: #{path} for #{lang}"
116117

118+
data["pages"][path] = {
119+
"version-map" => {}
120+
} unless data["pages"][path]
121+
page_data = data["pages"][path]
122+
page_data["languages"] = {} unless page_data["languages"]
123+
lang_data = page_data["languages"]
124+
117125
content = get_content.call sha
118126
categories = {}
119127
expand_l10n(full_path, content, get_content_f, categories)
120128
content.gsub!(/link:(?:technical\/)?(\S*?)\.html(\#\S*?)?\[(.*?)\]/m, "link:/docs/\\1/#{lang}\\2[\\3]")
121129
asciidoc = make_asciidoc(content)
122130
asciidoc_sha = Digest::SHA1.hexdigest(asciidoc.source)
123-
doc = Doc.where(blob_sha: asciidoc_sha).first_or_create
124-
if rerun || !doc.plain || !doc.html
125-
html = asciidoc.render
126-
html.gsub!(/linkgit:(\S+?)\[(\d+)\]/) do |line|
127-
x = /^linkgit:(\S+?)\[(\d+)\]/.match(line)
128-
"<a href='/docs/#{x[1].gsub(/&#x2d;/, '-')}/#{lang}'>#{x[1]}[#{x[2]}]</a>"
131+
if !File.exists?("#{SITE_ROOT}external/docs/asciidoc/#{asciidoc_sha}")
132+
FileUtils.mkdir_p("#{SITE_ROOT}external/docs/asciidoc")
133+
File.open("#{SITE_ROOT}external/docs/asciidoc/#{asciidoc_sha}", "w") do |out|
134+
out.write(content)
129135
end
130-
# HTML anchor on hdlist1 (i.e. command options)
131-
html.gsub!(/<dt class="hdlist1">(.*?)<\/dt>/) do |_m|
132-
text = $1.tr("^A-Za-z0-9-", "")
133-
anchor = "#{path}-#{text}"
134-
# handle anchor collisions by appending -1
135-
anchor += "-1" while ids.include?(anchor)
136-
ids.add(anchor)
136+
end
137137

138-
"<dt class=\"hdlist1\" id=\"#{anchor}\"> <a class=\"anchor\" href=\"##{anchor}\"></a>#{$1} </dt>"
139-
end
140-
doc.plain = asciidoc.source
141-
doc.html = html
142-
doc.save
138+
next if !rerun && lang_data[lang] == asciidoc_sha
139+
140+
html = asciidoc.render
141+
html.gsub!(/linkgit:(\S+?)\[(\d+)\]/) do |line|
142+
x = /^linkgit:(\S+?)\[(\d+)\]/.match(line)
143+
relurl = "docs/#{x[1].gsub(/&#x2d;/, '-')}/#{lang}"
144+
"<a href='{{< relurl \"#{relurl}\" >}}'>#{x[1]}[#{x[2]}]</a>"
145+
end
146+
# HTML anchor on hdlist1 (i.e. command options)
147+
html.gsub!(/<dt class="hdlist1">(.*?)<\/dt>/) do |_m|
148+
text = $1.tr("^A-Za-z0-9-", "")
149+
anchor = "#{path}-#{text}"
150+
# handle anchor collisions by appending -1
151+
anchor += "-1" while ids.include?(anchor)
152+
ids.add(anchor)
153+
154+
"<dt class=\"hdlist1\" id=\"#{anchor}\"> <a class=\"anchor\" href=\"##{anchor}\"></a>#{$1} </dt>"
143155
end
144-
dv = DocVersion.where(version_id: stag.id, doc_file_id: file.id, language: lang).first_or_create
145-
dv.doc_id = doc.id
146-
dv.language = lang
147-
dv.save
156+
# Make links relative
157+
html.gsub!(/(<a href=['"])\/([^'"]*)/, '\1{{< relurl "\2" >}}')
158+
159+
# Write <docname>/<lang>.html
160+
front_matter = {
161+
"category" => "manual",
162+
"section" => "documentation",
163+
"subsection" => "manual",
164+
"title" => "Git - #{path} Documentation",
165+
"docname" => path,
166+
"lang" => lang,
167+
"aliases" => ["/docs/#{path}/#{lang}/index.html"]
168+
}
169+
170+
FileUtils.mkdir_p(doc_path)
171+
File.open("#{doc_path}/#{lang}.html", "w") do |out|
172+
out.write(wrap_front_matter(front_matter))
173+
out.write(html)
174+
end
175+
176+
lang_data[lang] = asciidoc_sha
148177
end
149178
end
179+
File.open(DATA_FILE, "w") do |out|
180+
YAML.dump(data, out)
181+
end
150182
end
151183

152184
def drop_uninteresting_tags(tags)

0 commit comments

Comments
 (0)