Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
9727f5f
Split build to allow alternate languages
joonas-somero Aug 14, 2025
e69c777
Set up for building in $APP_ROOT/src
joonas-somero Aug 15, 2025
55a0ca0
Edit build/deploy config for alternate languages
joonas-somero Aug 15, 2025
a773a77
Define subpath for Finnish alternate
joonas-somero Aug 20, 2025
65441be
MkDocs config for Finnish alternate
joonas-somero Aug 20, 2025
e23cbc4
Update translated nav
joonas-somero Oct 8, 2025
01720cd
Translate footer
joonas-somero Oct 8, 2025
d765bdc
Edit footer according to csc.fi
joonas-somero Oct 9, 2025
bc573c6
Translate pre-header
joonas-somero Oct 9, 2025
3baf424
Add disclaimer for machine-translated content
joonas-somero Oct 15, 2025
544cc1e
Remove empty keys
joonas-somero Oct 22, 2025
b92726b
Enable translations on apps/index.md and apps/by_discipline.md
joonas-somero Oct 22, 2025
524562a
Enable translations on apps/by_availability.md
joonas-somero Oct 23, 2025
fb520fc
Remove empty keys
joonas-somero Oct 22, 2025
59a3a88
Generate app index pages in templates
joonas-somero Oct 29, 2025
d108fb8
Move some tests to MkDocs hooks
joonas-somero Oct 30, 2025
d9bd886
Show asterisk if app is unchecked and is missing description
joonas-somero Oct 30, 2025
90d9d05
Get env before importing everything
joonas-somero Oct 30, 2025
c01a940
Refactor hooks
joonas-somero Oct 31, 2025
42049d5
Show system descriptions
joonas-somero Oct 31, 2025
4438d1d
Merge remote-tracking branch 'origin/master' into apps-index
joonas-somero Nov 5, 2025
3b90366
Merge remote-tracking branch 'origin/master' into apps-index
joonas-somero Nov 5, 2025
b418e71
Merge remote-tracking branch 'upstream/apps-index' into alternate
joonas-somero Nov 5, 2025
8452ddc
Add OpenAI package to requirements
joonas-somero Dec 5, 2025
651698f
Implement automatic translation
joonas-somero Dec 5, 2025
8f057b6
Adjust configuration
joonas-somero Dec 5, 2025
afe2200
Move arg to env
joonas-somero Dec 5, 2025
c0bb96d
Ignore xattrs when restoring snapshot
joonas-somero Dec 11, 2025
58e70d3
Translation for descriptions
joonas-somero Jan 23, 2026
4ec7edb
Pass images with args
joonas-somero Jan 23, 2026
447ed31
Separate translator packages
joonas-somero Jan 23, 2026
e3eeabe
Cache translations in Allas
joonas-somero Jan 23, 2026
64d74f9
Merge remote-tracking branch 'upstream/master' into alternate
joonas-somero Jan 23, 2026
84a9d68
Remove debugging
joonas-somero Jan 23, 2026
998eb35
Disable token estimation
joonas-somero Jan 23, 2026
1e60a4b
Adjust values
joonas-somero Jan 23, 2026
9b81b51
Disable batch translation
joonas-somero Jan 26, 2026
d76091a
Reorganize/refactor
joonas-somero Jan 28, 2026
1a83c74
Add translation dictionary
joonas-somero Jan 28, 2026
8a4d496
Merge remote-tracking branch 'upstream/master' into alternate
joonas-somero Jan 28, 2026
bf6a188
Refactoring
joonas-somero Jan 28, 2026
9a58e1a
Add translation dictionary file
joonas-somero Jan 28, 2026
044273d
Ignore empty dictionary
joonas-somero Jan 28, 2026
e934e77
Fix subscript
joonas-somero Jan 28, 2026
770a36a
Change language selector icon
joonas-somero Feb 5, 2026
6edd275
Remove dictionary entry
joonas-somero Feb 5, 2026
be5fb76
Some cleanup, refactoring
joonas-somero Feb 5, 2026
8a9464b
Add forced translations, refactor, reorganize
joonas-somero Feb 5, 2026
1d37258
Merge remote-tracking branch 'upstream/master' into alternate-languages
joonas-somero Feb 5, 2026
6d01de1
Edit descriptions
joonas-somero Feb 5, 2026
04b9dea
Fix inconsistencies
joonas-somero Feb 5, 2026
c5792c4
Translate 404 page
joonas-somero Feb 12, 2026
a9b41d2
Handle exception
joonas-somero Feb 12, 2026
1867957
Handle another exception
joonas-somero Feb 12, 2026
9960c8d
Re-translate accounts/
joonas-somero Feb 16, 2026
eb2e676
Merge remote-tracking branch 'origin/master' into alternate-languages
joonas-somero Feb 16, 2026
c48d97c
Re-translate cloud/
joonas-somero Feb 16, 2026
5450f00
Re-translate computing/
joonas-somero Feb 17, 2026
a381f9d
Update navigation
joonas-somero Feb 18, 2026
829305f
Restore glossary placeholder
joonas-somero Feb 18, 2026
2e64ef4
Re-translate support/
joonas-somero Feb 18, 2026
8c01227
Handle another exception
joonas-somero Feb 18, 2026
62edb4b
Merge remote-tracking branch 'origin/master' into alternate-languages
joonas-somero Feb 18, 2026
349d6d5
Allow for multiple instances of commit SHA for forced translations
joonas-somero Feb 18, 2026
abe06e9
Merge remote-tracking branch 'origin/master' into alternate-languages
joonas-somero Feb 19, 2026
637f98d
Re-translate index.md and apps/
joonas-somero Feb 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions Containerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
ARG builder_image
FROM ${builder_image} AS builder

ARG repo_org=CSCfi
ARG repo_name=csc-user-guide
ARG repo_branch=master

ADD .git-revision-date-ignore-revs mkdocs.yml .

RUN \
git clone --no-checkout \
--single-branch \
--branch=${repo_branch} \
https://github.com/${repo_org}/${repo_name} \
/tmp/src \
&& \
git -C /tmp/src sparse-checkout init --no-cone \
&& \
git -C /tmp/src sparse-checkout set docs \
&& \
git -C /tmp/src checkout \
&& \
mv /tmp/src/{.git,docs} ./ \
&& \
for feat in new glossary; do \
bash scripts/generate_${feat}.sh; \
done \
&& \
mkdocs build --site-dir=/tmp/site


FROM registry.access.redhat.com/ubi8/nginx-124

LABEL maintainer="CSC Service Desk <servicedesk@csc.fi>"

COPY --from=builder /tmp/site "${NGINX_APP_ROOT}/src"
ADD nginx.conf "${NGINX_CONF_PATH}"

EXPOSE 8000/tcp

CMD nginx
91 changes: 91 additions & 0 deletions Containerfile.alternate
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
ARG restic_image=ghcr.io/restic/restic
ARG translator_image
ARG builder_image
ARG nginx_image=ubi8/nginx-124

FROM ${restic_image} AS restic_snapshots

RUN \
restic --json snapshots --path /tmp/docs/${LANG_CODE} \
> /tmp/snapshots.json \
&& \
restic restore --exclude-xattr '*' \
--path /tmp/docs/${LANG_CODE} \
--target /tmp/stale_translation \
latest


FROM ${translator_image} AS translator

ARG repo_org=CSCfi
ARG repo_name=csc-user-guide
ARG repo_branch=master
ENV REPO_ORG=${repo_org}
ENV REPO_NAME=${repo_name}
ENV REPO_BRANCH=${repo_branch}

COPY --from=restic_snapshots /tmp/snapshots.json .
COPY --from=restic_snapshots /tmp/stale_translation /tmp/fresh_translation
ADD translation/exclude.txt translation/force.yml translation/dictionary.yml .

USER 0
RUN chown -R 1001:0 /tmp/fresh_translation snapshots.json
USER 1001

RUN python3 refresh_translation.py /tmp/fresh_translation \
/tmp/commit_sha.txt


FROM restic_snapshots AS restic_backup

COPY --from=translator /tmp/fresh_translation /tmp/docs/${LANG_CODE}
COPY --from=translator /tmp/commit_sha.txt /tmp

RUN \
cd /tmp/docs/${LANG_CODE} \
&& \
restic backup --tag "$(cat /tmp/commit_sha.txt)" \
--exclude '.*' \
--iexclude '* !*.md' \
--skip-if-unchanged \
./


FROM ${builder_image} AS builder

ADD docs /tmp/src/docs
ADD .git-revision-date-ignore-revs mkdocs_${LANG_CODE}.yml .
COPY --from=translator /tmp/fresh_translation /tmp/fresh_translation
COPY --from=translator /tmp/.git /tmp/src/.git

USER 0
RUN \
mv /tmp/src/{.git,docs} . \
&& \
cp --recursive \
--no-dereference \
--remove-destination \
/tmp/fresh_translation/* docs \
&& \
chown -R 1001:0 ./
USER 1001

RUN \
for feat in new glossary; do \
bash scripts/generate_${feat}.sh; \
done \
&& \
mkdocs build --site-dir=/tmp/site \
--config-file="mkdocs_${LANG_CODE}.yml"


FROM ${nginx_image}

LABEL maintainer="CSC Service Desk <servicedesk@csc.fi>"

COPY --from=builder /tmp/site "${NGINX_APP_ROOT}/src"
ADD nginx.conf "${NGINX_CONF_PATH}"

EXPOSE 8000/tcp

CMD nginx
21 changes: 21 additions & 0 deletions Containerfile.builder
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
ARG python_image=ubi8/python-311
FROM ${python_image}

LABEL maintainer="CSC Service Desk <servicedesk@csc.fi>"

ADD requirements.txt mkdocs.yml .
ADD csc-overrides ./csc-overrides
ADD hooks ./hooks
ADD scripts ./scripts

USER 0
RUN \
mkdir /tmp/src \
&& \
chown -R 1001:0 /tmp/src ./
USER 1001

RUN \
pip install --upgrade pip \
&& \
pip install --requirement=requirements.txt
12 changes: 12 additions & 0 deletions Containerfile.translator
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
ARG python_image=ubi8/python-311
FROM ${python_image}

LABEL maintainer="CSC Service Desk <servicedesk@csc.fi>"

ADD translation/requirements.txt translation/refresh_translation.py .
ADD translation/translator ./translator

RUN \
pip install --upgrade pip \
&& \
pip install --requirement requirements.txt
43 changes: 0 additions & 43 deletions Dockerfile

This file was deleted.

14 changes: 14 additions & 0 deletions csc-overrides/404.html
Original file line number Diff line number Diff line change
@@ -1,15 +1,29 @@
{% extends "main.html" %}
{% block htmltitle %}
{% if config.theme.language == 'fi' %}
<title>Sivua ei löydy - Docs CSC</title>
{% else %}
<title>Page not found - Docs CSC</title>
{% endif %}
{% endblock htmltitle %}
{% block content %}
{% block breadcrumbs %}
<nav class="csc-breadcrumbs">
<a class="csc-breadcrumbs__link" href="{{ base_url }}">Docs CSC</a>
{% if config.theme.language == 'fi' %}
Virhe 404: Sivua ei löydy
{% else %}
Error 404: Page not found
{% endif %}
</nav>
{% endblock breadcrumbs %}
{% if config.theme.language == 'fi' %}
<h1>Virhe 404: Sivua ei löydy</h1>
<h2>Pahoittelumme, mutta etsimääsi sisältöä ei löytynyt</h2>
<p>Kokeile etsiä sisältöä hakutoiminnon avulla tai palata takaisin <a href="{{ base_url }}">etusivulle</a>.</p>
{% else %}
<h1>Error 404: Page not found</h1>
<h2>Sorry, we couldn't find what you're looking for</h2>
<p>Please retry looking for the content using the search function, or return to <a href="{{ base_url }}">the Home page</a>.</p>
{% endif %}
{% endblock content %}
1 change: 0 additions & 1 deletion csc-overrides/assets/stylesheets/catalog.css
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@
}

.md-typeset .catalog-toc ul li a[href^="#lumi"] .md-tag:is(:active, :hover) {
/* background-color: hsl(from black h s calc(l + 96)); */
background-color: var(--c-black);
color: var(--c-white);
}
15 changes: 15 additions & 0 deletions csc-overrides/assets/stylesheets/disclaimer.css
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
max-width: calc(100vw / 3);
}

#disclaimer-container > :not(:first-child) {
margin-top: .5rem;
}

.disclaimer {
display: none;
border-style: solid;
Expand All @@ -23,6 +27,10 @@
border-color: var(--csc-admonition-info-border-color);
}

.disclaimer.translation {
border-color: var(--csc-admonition-warning-border-color);
}

.disclaimer > .disclaimer-title {
margin: unset;
padding: .4rem .6rem .4rem 2rem;
Expand Down Expand Up @@ -51,6 +59,12 @@
background-color: var(--csc-admonition-info-border-color);
}

.disclaimer.translation > .disclaimer-title:before {
-webkit-mask-image: var(--md-admonition-icon--warning);
mask-image: var(--md-admonition-icon--warning);
background-color: var(--csc-admonition-warning-border-color);
}

.disclaimer > .disclaimer-content {
margin-top: 0;
font-style: italic;
Expand All @@ -72,6 +86,7 @@
.disclaimer .button-row {
margin: .6em;
display: flex;
flex-direction: row-reverse;
justify-content: space-between;
}

Expand Down
3 changes: 2 additions & 1 deletion csc-overrides/main.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
{% endblock content %}
{% block footer %}
{{ super() }}
{% if config.extra.environment == "preview" %}
{% if config.extra.environment == "preview" or
config.theme.language != "en" %}
{% include "partials/disclaimer.html" %}
{% endif %}
{% endblock footer %}
5 changes: 3 additions & 2 deletions csc-overrides/partials/apps-list-item.html
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@
{%- endmacro -%}

{%- macro description(app) -%}
{%- if app.description -%}
&nbsp;&mdash;&nbsp;{{ app.description }}
{%- set app_desc = app["description_" ~ config.theme.language] or app.description %}
{%- if app_desc -%}
&nbsp;&mdash;&nbsp;{{ app_desc }}
{%- elif app.unchecked -%}
*
{%- endif -%}
Expand Down
22 changes: 22 additions & 0 deletions csc-overrides/partials/apps-list-phrases.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{%- macro translate(phrase_string, lang_code) -%}
{% set lookup = {
"Applications available on": {
"fi": "Sovellukset saatavilla järjestelmässä"
},
"Interactive web applications available on": {
"fi": "Interaktiiviset web-sovellukset saatavilla järjestelmässä"
},
"web interface": {
"fi": "web-käyttöliittymä"
}
}%}
{{ lookup[phrase_string][lang_code] }}
{%- endmacro -%}

{%- macro phrase(phrase_string) -%}
{%- if config.theme.language != "en" -%}
{{ translate(phrase_string, lang_code=config.theme.language) }}
{%- else -%}
{{ phrase_string }}
{%- endif -%}
{%- endmacro -%}
9 changes: 5 additions & 4 deletions csc-overrides/partials/apps-list.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{% from "partials/apps-list-item.html" import app_item with context %}
{% from "partials/apps-list-phrases.html" import phrase with context %}

{% macro as_heading(item, alpha=false) %}
{% set level = 2 if not alpha else 3 %}
Expand Down Expand Up @@ -59,16 +60,16 @@
{% elif "by_discipline" in catalog %}
{{ as_groups(catalog.by_discipline) }}
{% elif "by_availability" in catalog %}
<p>Applications available on</p>
<p>{{ phrase("Applications available on") }}</p>
{{ as_toc(catalog.by_availability.on_systems) }}
<p>Interactive web applications available on</p>
{{ as_toc(catalog.by_availability.on_web, suffix="web interface") }}
<p>{{ phrase("Interactive web applications available on") }}</p>
{{ as_toc(catalog.by_availability.on_web, suffix=phrase("web interface")) }}
{%- for system in catalog.by_availability.on_systems %}
{{ as_heading(system) }}
{{ as_list(system.apps) }}
{% endfor -%}
{%- for system in catalog.by_availability.on_web %}
{% set web_system = {"name": system.name ~ " " ~ "web interface", "id": system.id} %}
{% set web_system = {"name": system.name ~ " " ~ phrase("web interface"), "id": system.id} %}
{{ as_heading(web_system) }}
{{ as_list(system.apps) }}
{% endfor -%}
Expand Down
Loading