From ef9790662436df8b240bdb2e5cd4b877cd81d032 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych Date: Fri, 25 Jul 2025 13:18:22 +0200 Subject: [PATCH 01/26] init --- .github/workflows/update.yml | 2 +- generate.py | 11 +-- generate_metadata.py | 2 +- index.html.jinja | 61 +++++++++++++++ logo.png | Bin 0 -> 13171 bytes style.css | 140 ++++++++++++++++------------------- 6 files changed, 132 insertions(+), 84 deletions(-) create mode 100644 index.html.jinja create mode 100644 logo.png diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index dbe47d6f2..ce293fd88 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -21,7 +21,7 @@ jobs: - run: sudo apt-get install -y gettext - run: pip install -r requirements.txt - run: uv run generate.py # generates index.html and index.json - - run: mkdir -p build && cp index.* style.css build + # - run: mkdir -p build && cp index.* style.css build - name: Deploy 🚀 if: github.event_name != 'pull_request' uses: JamesIves/github-pages-deploy-action@v4 diff --git a/generate.py b/generate.py index 5df32e98a..4aecc3214 100644 --- a/generate.py +++ b/generate.py @@ -93,16 +93,17 @@ class LanguageProjectData: if __name__ == '__main__': logging.basicConfig(level=logging.INFO) logging.info(f'starting at {generation_time}') - template = Template(Path('template.html.jinja').read_text()) - + Path('build').mkdir(parents=True, exist_ok=True) + template = Template(Path('index.html.jinja').read_text()) output = template.render( completion_progress=(completion_progress := list(get_completion_progress())), generation_time=generation_time, duration=(datetime.now(timezone.utc) - generation_time).seconds, counts=get_counts(Path('clones', 'cpython', 'Doc', 'build', 'gettext')), ) - - Path('index.html').write_text(output) - Path('index.json').write_text( + Path('build/style.css').write_bytes(Path('style.css').read_bytes()) + Path('build/logo.png').write_bytes(Path('logo.png').read_bytes()) + Path('build/index.html').write_text(output) + Path('build/index.json').write_text( json.dumps(completion_progress, indent=2, default=asdict) ) diff --git a/generate_metadata.py b/generate_metadata.py index 1c0f534a8..310d1a960 100644 --- a/generate_metadata.py +++ b/generate_metadata.py @@ -71,4 +71,4 @@ def get_language_repo_and_completion( duration=(datetime.now(timezone.utc) - generation_time).seconds, ) - Path('metadata.html').write_text(output) + Path('build/metadata.html').write_text(output) diff --git a/index.html.jinja b/index.html.jinja new file mode 100644 index 000000000..1a1f76b67 --- /dev/null +++ b/index.html.jinja @@ -0,0 +1,61 @@ + + + + + + + + + + Python Docs Translation Dashboard + + + + + + + + +
+ +
+ +
+
+
+
+ {% for project in completion_progress | sort(attribute='completion,translators.number') | reverse %} + +
+
{{ project.language.name }} ({{ project.language.code }})
+ +
Completion: {{ '{:.2f}%'.format(project.completion) }}
+
Translators: {{ project.translators.number }}
+
+
+ {% endfor %} +
+
+
+ + +
+
+
+ + + diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cc41114789a6e6a37116f2b4ffe22c7920bdf7a7 GIT binary patch literal 13171 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 Date: Fri, 25 Jul 2025 14:24:15 +0200 Subject: [PATCH 02/26] Round 2 --- generate.py | 42 ++++- generate_metadata.py | 2 +- index.html.jinja | 61 ------ logo.png => src/logo.png | Bin src/style.css | 174 ++++++++++++++++++ style.css | 80 -------- templates/base.html.jinja | 51 +++++ .../chart.html.jinja | 41 +---- templates/index.html.jinja | 19 ++ templates/language.html.jinja | 5 + .../metadata.html.jinja | 4 +- 11 files changed, 292 insertions(+), 187 deletions(-) delete mode 100644 index.html.jinja rename logo.png => src/logo.png (100%) create mode 100644 src/style.css delete mode 100644 style.css create mode 100644 templates/base.html.jinja rename template.html.jinja => templates/chart.html.jinja (61%) create mode 100644 templates/index.html.jinja create mode 100644 templates/language.html.jinja rename metadata.html.jinja => templates/metadata.html.jinja (92%) diff --git a/generate.py b/generate.py index 4aecc3214..bddf9b209 100644 --- a/generate.py +++ b/generate.py @@ -9,7 +9,7 @@ from pathlib import Path from git import Repo -from jinja2 import Template +from jinja2 import Environment, FileSystemLoader, Template from urllib3 import PoolManager import build_status @@ -94,16 +94,42 @@ class LanguageProjectData: logging.basicConfig(level=logging.INFO) logging.info(f'starting at {generation_time}') Path('build').mkdir(parents=True, exist_ok=True) - template = Template(Path('index.html.jinja').read_text()) - output = template.render( - completion_progress=(completion_progress := list(get_completion_progress())), + + #completion_progress = list(get_completion_progress()) + completion_progress = [LanguageProjectData(language=Language(code='ar', name='Arabic'), repository='Abdur-rahmaanJ/python-docs-ar', branch='master', completion=0.013630393298803004, change=0.0, translators=TranslatorsData(number=3, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/Abdur-rahmaanJ/python-docs-ar'), LanguageProjectData(language=Language(code='bn-in', name='Bengali'), repository='python/python-docs-bn-in', branch='3.14', completion=0.10904314639042403, change=0.0, translators=TranslatorsData(number=1, link=False), built=True, in_switcher=False, uses_platform=False, contribution_link='https://github.com/python/python-docs-bn-in'), LanguageProjectData(language=Language(code='fr', name='French'), repository='python/python-docs-fr', branch='3.13', completion=32.880226016703425, change=0.0, translators=TranslatorsData(number=241, link='https://github.com/python/python-docs-fr/blob/3.13/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://git.afpy.org/AFPy/python-docs-fr/src/branch/3.13/CONTRIBUTING.rst'), LanguageProjectData(language=Language(code='el', name='Greek'), repository='python/python-docs-el', branch='3.14', completion=7.6354985006567375, change=0.29367301925602884, translators=TranslatorsData(number=15, link='https://github.com/python/python-docs-el/blob/3.14/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://github.com/python/python-docs-el'), LanguageProjectData(language=Language(code='hi-in', name='Hindi'), repository='CuriousLearner/python-docs-hi-in', branch='master', completion=0.004956506654110183, change=0.0, translators=TranslatorsData(number=1, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/CuriousLearner/python-docs-hi-in'), LanguageProjectData(language=Language(code='hu', name='Hungarian'), repository='python/python-docs-hu', branch='master', completion=0.0, change=0.0, translators=TranslatorsData(number=1, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/python/python-docs-hu'), LanguageProjectData(language=Language(code='id', name='Indonesian'), repository='python/python-docs-id', branch='3.14', completion=0.0, change=0.0, translators=TranslatorsData(number=25, link='https://github.com/python/python-docs-id/blob/3.14/TRANSLATORS'), built=True, in_switcher=False, uses_platform=False, contribution_link='https://github.com/python/python-docs-id/blob/master/README.md#berkontribusi-untuk-menerjemahkan'), LanguageProjectData(language=Language(code='it', name='Italian'), repository='python/python-docs-it', branch='3.13', completion=3.351837624842011, change=0.0, translators=TranslatorsData(number=3, link='https://github.com/python/python-docs-it/blob/3.13/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://github.com/python/python-docs-it'), LanguageProjectData(language=Language(code='ja', name='Japanese'), repository='python/python-docs-ja', branch='3.14', completion=49.79430497385443, change=0.04336943322346798, translators=TranslatorsData(number=13, link=False), built=True, in_switcher=True, uses_platform=True, contribution_link='https://explore.transifex.com/python-doc/python-newest/'), LanguageProjectData(language=Language(code='ko', name='Korean'), repository='python/python-docs-ko', branch='3.13', completion=45.986468736834276, change=0.2478253327055029, translators=TranslatorsData(number=23, link='https://github.com/python/python-docs-ko/blob/3.13/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://www.flowdas.com/pages/python-docs-ko.html'), LanguageProjectData(language=Language(code='mr', name='Marathi'), repository='sanketgarade/python-doc-mr', branch='3.9', completion=0.0, change=0.0, translators=TranslatorsData(number=1, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/sanketgarade/python-doc-mr'), LanguageProjectData(language=Language(code='lt', name='Lithuanian'), repository=None, branch='', completion=0.0, change=0.0, translators=TranslatorsData(number=0, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link=None), LanguageProjectData(language=Language(code='fa', name='Persian'), repository='revisto/python-docs-fa', branch='3.13', completion=0.0, change=0.0, translators=TranslatorsData(number=9, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/revisto/python-docs-fa'), LanguageProjectData(language=Language(code='pl', name='Polish'), repository='python/python-docs-pl', branch='3.14', completion=40.93083194964189, change=29.423062625461576, translators=TranslatorsData(number=9, link=False), built=True, in_switcher=True, uses_platform=True, contribution_link='https://explore.transifex.com/python-doc/python-newest/'), LanguageProjectData(language=Language(code='pt', name='Portuguese'), repository=None, branch='', completion=0.0, change=0.0, translators=TranslatorsData(number=0, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link=None), LanguageProjectData(language=Language(code='pt-br', name='Brazilian Portuguese'), repository='python/python-docs-pt-br', branch='3.14', completion=62.121137022626456, change=1.494386756214226, translators=TranslatorsData(number=3, link=False), built=True, in_switcher=True, uses_platform=True, contribution_link='https://explore.transifex.com/python-doc/python-newest/'), LanguageProjectData(language=Language(code='ro', name='Romanian'), repository='python/python-docs-ro', branch='main', completion=1.192039850313499, change=0.49317241208396323, translators=TranslatorsData(number=1, link='https://github.com/python/python-docs-ro/blob/main/TRANSLATORS'), built=True, in_switcher=False, uses_platform=False, contribution_link='https://github.com/python/python-docs-ro'), LanguageProjectData(language=Language(code='ru', name='Russian'), repository='MLGRussianXP/python-docs-ru', branch='3.14', completion=0.19578201283735222, change=0.008673886644692819, translators=TranslatorsData(number=3, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/MLGRussianXP/python-docs-ru'), LanguageProjectData(language=Language(code='zh-cn', name='Simplified Chinese'), repository='python/python-docs-zh-cn', branch='3.14', completion=96.77950980149191, change=20.155634308939057, translators=TranslatorsData(number=224, link=False), built=True, in_switcher=True, uses_platform=True, contribution_link='https://explore.transifex.com/python-doc/python-newest/'), LanguageProjectData(language=Language(code='es', name='Spanish'), repository='python/python-docs-es', branch='3.13', completion=57.77551981363535, change=0.026021659934073682, translators=TranslatorsData(number=314, link='https://github.com/python/python-docs-es/blob/3.13/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://python-docs-es.readthedocs.io/page/CONTRIBUTING.html'), LanguageProjectData(language=Language(code='zh-tw', name='Traditional Chinese'), repository='python/python-docs-zh-tw', branch='3.13', completion=37.15273475254641, change=1.7174295556491828, translators=TranslatorsData(number=124, link='https://github.com/python/python-docs-zh-tw/blob/3.13/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://github.com/python/python-docs-zh-tw/blob/3.13/README.rst#%E5%8F%83%E8%88%87%E7%BF%BB%E8%AD%AF'), LanguageProjectData(language=Language(code='tr', name='Turkish'), repository='python/python-docs-tr', branch='3.12', completion=4.693811801442344, change=0.0, translators=TranslatorsData(number=30, link='https://github.com/python/python-docs-tr/blob/3.12/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://github.com/python/python-docs-tr/blob/3.12/README.md#%C3%A7eviriye-katk%C4%B1da-bulunmak'), LanguageProjectData(language=Language(code='uk', name='Ukrainian'), repository='python/python-docs-uk', branch='3.13', completion=49.25280662189289, change=0.0, translators=TranslatorsData(number=13, link=False), built=True, in_switcher=False, uses_platform=True, contribution_link='https://explore.transifex.com/python-doc/python-newest/')] + #counts = get_counts(Path('clones', 'cpython', 'Doc', 'build', 'gettext')) + counts = 11, 22 + + env = Environment(loader=FileSystemLoader("templates")) + index = env.get_template('index.html.jinja').render( + completion_progress=completion_progress, + generation_time=generation_time, + duration=(datetime.now(timezone.utc) - generation_time).seconds, + counts=counts, + ) + + chart = env.get_template('chart.html.jinja').render( + completion_progress=completion_progress, generation_time=generation_time, duration=(datetime.now(timezone.utc) - generation_time).seconds, - counts=get_counts(Path('clones', 'cpython', 'Doc', 'build', 'gettext')), + counts=counts, ) - Path('build/style.css').write_bytes(Path('style.css').read_bytes()) - Path('build/logo.png').write_bytes(Path('logo.png').read_bytes()) - Path('build/index.html').write_text(output) + + lang_template = env.get_template('language.html.jinja') + for language_data in completion_progress: + language = language_data.language + code = language.code + + html = lang_template.render( + language=language_data, + ) + + Path(f'build/{code}.html').write_text(html) + + Path('build/style.css').write_bytes(Path('src/style.css').read_bytes()) + Path('build/logo.png').write_bytes(Path('src/logo.png').read_bytes()) + Path('build/index.html').write_text(index) + Path('build/chart.html').write_text(chart) Path('build/index.json').write_text( json.dumps(completion_progress, indent=2, default=asdict) ) diff --git a/generate_metadata.py b/generate_metadata.py index 310d1a960..6ac64dafd 100644 --- a/generate_metadata.py +++ b/generate_metadata.py @@ -55,7 +55,7 @@ def get_language_repo_and_completion( if __name__ == '__main__': logging.basicConfig(level=logging.INFO) logging.info(f'starting at {generation_time}') - template = Template(Path('metadata.html.jinja').read_text()) + template = Template(Path('templates/metadata.html.jinja').read_text()) if (index_path := Path('index.json')).exists(): index_json = loads(Path('index.json').read_text()) else: diff --git a/index.html.jinja b/index.html.jinja deleted file mode 100644 index 1a1f76b67..000000000 --- a/index.html.jinja +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - Python Docs Translation Dashboard - - - - - - - - -
- -
- -
-
-
-
- {% for project in completion_progress | sort(attribute='completion,translators.number') | reverse %} - -
-
{{ project.language.name }} ({{ project.language.code }})
- -
Completion: {{ '{:.2f}%'.format(project.completion) }}
-
Translators: {{ project.translators.number }}
-
-
- {% endfor %} -
-
-
- - -
-
-
- - - diff --git a/logo.png b/src/logo.png similarity index 100% rename from logo.png rename to src/logo.png diff --git a/src/style.css b/src/style.css new file mode 100644 index 000000000..3186ed91c --- /dev/null +++ b/src/style.css @@ -0,0 +1,174 @@ +/* GLOBAL STYLES +-------------------------------------------------- */ +/* Padding below the footer and lighter body text */ + +body { + padding-top: 4.5rem; + padding-left: .5rem; + padding-right: .5rem; + padding-bottom: 3rem; + color: #5a5a5a; + background-color: rgb(245, 245, 245); + overflow-x: hidden; /* Risky, this need testing but I find scroll bar annoying */ +} + +a { + color: #0d0d0d; +} + +a:hover { + color: #fe6615; +} + +/* NAVAR + * ----------------------------------------*/ + +.navbar { + background-color: rgb(245, 245, 245); + border-bottom: 0.25px solid #999; +} + +.navbar li { + transition: 0.3s background-color; + text-align: center; + background-color: transparent; + padding: 0rem 1rem; + text-decoration: none; + border-radius: 0.3rem; +} + +.navbar li:hover { + background-color: #d0cccd; +} + +.navbar li .nav-link { + color: #0d0d0d; +} + +/* Cards and card columns +----------------------------- */ + +.row > [class^="col-"] { + display: flex; +} + +.card { + flex: 1; +} + +.card:hover { + background: linear-gradient(90deg, #cc9add 8.06%, #ebad98 106.93%); + text-decoration: none; + transform: scale(1.05); + transition: all 0.3s ease-in-out; +} + +.card:hover .card-title, +.card:hover .card-subtitle, +.card:hover .card-text { + color: white; +} + +.card:hover .card-link { + color: rgb(231, 231, 231); +} + +@media (min-width: 768px) { + .card { + flex-basis: calc(33.33% - 30px); + } +} + +/* -------------------------- OLD STUFF ------------------------------------ */ + +table { + border-collapse: collapse; +} +th, td { + border: 1px solid #ddd; + padding: 8px 12px; + text-align: left; + white-space: nowrap; +} +th { + background-color: #f4f4f4; +} +hr { + color: #f4f4f4; +} +.progress-bar { + display: inline-block; + color: white; + height: 20px; + line-height: 20px; + text-align: center; + overflow: hidden; + white-space: nowrap; + box-sizing: border-box; +} +.progress-bar-outer-label { + display: none; + padding-left: .5em; + height: 20px; + line-height: 20px; + overflow: hidden; +} +.progress-bar.low { + color: transparent; + user-select: none; +} +.progress-bar.low + .progress-bar-outer-label { + display: inline-block; +} +td[data-label="translators"], td[data-label="warnings"], td[data-label="lint"] { + text-align: right; +} +td[data-label="completion"] { + width: 100%; + line-height: 0; +} +.switchpages{ + position: absolute; + top: 10px; + right: 10px; + } + +@media screen and (max-width: 675px) { + .switchpages{ + all: unset; + } +} + +@media screen and (max-width: 600px) { + table, thead, tbody, th, td, tr { + display: block; + } + th { + position: absolute; + top: -9999px; + left: -9999px; + } + tr { + border: 1px solid #ccc; + margin-bottom: 5px; + } + td { + border: none; + border-bottom: 1px solid #eee; + padding-left: 50%; + position: relative; + } + td:before { + content: attr(data-label); + font-weight: bold; + left: 10px; + position: absolute; + } + td[data-label="completion"] { + width: inherit; + } + .progress-bar { + min-width: 0; + width: 100% !important; + } +} diff --git a/style.css b/style.css deleted file mode 100644 index 5dbd94d72..000000000 --- a/style.css +++ /dev/null @@ -1,80 +0,0 @@ -/* GLOBAL STYLES --------------------------------------------------- */ -/* Padding below the footer and lighter body text */ - -body { - padding-top: 4.5rem; - padding-left: .5rem; - padding-right: .5rem; - padding-bottom: 3rem; - color: #5a5a5a; - background-color: rgb(245, 245, 245); - overflow-x: hidden; /* Risky, this need testing but I find scroll bar annoying */ -} - -a { - color: #0d0d0d; -} - -a:hover { - color: #fe6615; -} - -/* NAVAR - * ----------------------------------------*/ - -.navbar { - background-color: rgb(245, 245, 245); - border-bottom: 0.25px solid #999; -} - -.navbar li { - transition: 0.3s background-color; - text-align: center; - background-color: transparent; - padding: 0rem 1rem; - text-decoration: none; - border-radius: 0.3rem; -} - -.navbar li:hover { - background-color: #d0cccd; -} - -.navbar li .nav-link { - color: #0d0d0d; -} - -/* Cards and card columns ------------------------------ */ - -.card-container { - margin: 0 50px; -} - -.card-columns { - flex-wrap: wrap; -} - -.card:hover { - background: linear-gradient(90deg, #cc9add 8.06%, #ebad98 106.93%); - text-decoration: none; - transform: scale(1.05); - transition: all 0.3s ease-in-out; -} - -.card:hover .card-title, -.card:hover .card-subtitle, -.card:hover .card-text { - color: white; -} - -.card:hover .card-link { - color: rgb(231, 231, 231); -} - -@media (min-width: 768px) { - .card { - flex-basis: calc(33.33% - 30px); - } -} diff --git a/templates/base.html.jinja b/templates/base.html.jinja new file mode 100644 index 000000000..3f20c380b --- /dev/null +++ b/templates/base.html.jinja @@ -0,0 +1,51 @@ + + + + + +{# #} + + + + Python Docs Translation Dashboard + + + + + + +
+ +
+ +
+ {% block main %} + {% endblock %} +
+ + + + + + diff --git a/template.html.jinja b/templates/chart.html.jinja similarity index 61% rename from template.html.jinja rename to templates/chart.html.jinja index f19b4e166..6190b4372 100644 --- a/template.html.jinja +++ b/templates/chart.html.jinja @@ -1,22 +1,10 @@ - - - Python Docs Translation Dashboard - - - - - - -

Python Docs Translation Dashboard

- +{% extends "base.html.jinja" %} + +{% block main %} - - @@ -30,18 +18,6 @@ main | meta {{ project.language.name }} ({{ project.language.code }}) {% endif %} - -
languageswitchertranslators completion*
- {% if project.in_switcher %} - - {% elif project.built %} - - {% endif %} - - {% if project.translators.link %}{% endif %} - {{ project.translators.number }} - {% if project.translators.link %}{% endif %} -
meta {% endfor %}
-

* the number in parentheses shows change in the last 30 days, included in the total completion

-

-Currently being translated into {{ completion_progress|length }} languages. -The documentation has a total string count of {{ '{:,}'.format(counts[0]) }} ({{ '{:,}'.format(counts[1]) }} words). -For more information about translations, see the Python Developer’s Guide. -

+

You can download the data on this page in JSON format.

You can also find the scripts used to generate these pages here.

Last updated at {{ generation_time.strftime('%A, %-d %B %Y, %-H:%M:%S %Z') }} (in {{ duration // 60 }}:{{ "{:02}".format(duration % 60) }} minutes).

- + - +{% endblock %} diff --git a/templates/index.html.jinja b/templates/index.html.jinja new file mode 100644 index 000000000..1be039804 --- /dev/null +++ b/templates/index.html.jinja @@ -0,0 +1,19 @@ +{% extends "base.html.jinja" %} + +{% block main %} +
+
+ {% for project in completion_progress | sort(attribute='completion,translators.number') | reverse %} + + {% endfor %} +
+
+{% endblock %} diff --git a/templates/language.html.jinja b/templates/language.html.jinja new file mode 100644 index 000000000..42ed26b1a --- /dev/null +++ b/templates/language.html.jinja @@ -0,0 +1,5 @@ +{% extends "base.html.jinja" %} + +{% block main %} +

{{ language.name }}

+{% endblock %} diff --git a/metadata.html.jinja b/templates/metadata.html.jinja similarity index 92% rename from metadata.html.jinja rename to templates/metadata.html.jinja index a23b40f86..b79b33670 100644 --- a/metadata.html.jinja +++ b/templates/metadata.html.jinja @@ -1,14 +1,14 @@ Python Docs Translation Dashboard - +

Python Docs Translation Dashboard

From 5bf5310df3e7b574e34c8acf68ee4e2e3e3f7fb6 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych Date: Fri, 25 Jul 2025 14:26:51 +0200 Subject: [PATCH 03/26] Remove testing stuff --- .github/workflows/update.yml | 1 - generate.py | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index ce293fd88..e22c7acfb 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -21,7 +21,6 @@ jobs: - run: sudo apt-get install -y gettext - run: pip install -r requirements.txt - run: uv run generate.py # generates index.html and index.json - # - run: mkdir -p build && cp index.* style.css build - name: Deploy 🚀 if: github.event_name != 'pull_request' uses: JamesIves/github-pages-deploy-action@v4 diff --git a/generate.py b/generate.py index bddf9b209..c111d23c7 100644 --- a/generate.py +++ b/generate.py @@ -95,10 +95,8 @@ class LanguageProjectData: logging.info(f'starting at {generation_time}') Path('build').mkdir(parents=True, exist_ok=True) - #completion_progress = list(get_completion_progress()) - completion_progress = [LanguageProjectData(language=Language(code='ar', name='Arabic'), repository='Abdur-rahmaanJ/python-docs-ar', branch='master', completion=0.013630393298803004, change=0.0, translators=TranslatorsData(number=3, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/Abdur-rahmaanJ/python-docs-ar'), LanguageProjectData(language=Language(code='bn-in', name='Bengali'), repository='python/python-docs-bn-in', branch='3.14', completion=0.10904314639042403, change=0.0, translators=TranslatorsData(number=1, link=False), built=True, in_switcher=False, uses_platform=False, contribution_link='https://github.com/python/python-docs-bn-in'), LanguageProjectData(language=Language(code='fr', name='French'), repository='python/python-docs-fr', branch='3.13', completion=32.880226016703425, change=0.0, translators=TranslatorsData(number=241, link='https://github.com/python/python-docs-fr/blob/3.13/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://git.afpy.org/AFPy/python-docs-fr/src/branch/3.13/CONTRIBUTING.rst'), LanguageProjectData(language=Language(code='el', name='Greek'), repository='python/python-docs-el', branch='3.14', completion=7.6354985006567375, change=0.29367301925602884, translators=TranslatorsData(number=15, link='https://github.com/python/python-docs-el/blob/3.14/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://github.com/python/python-docs-el'), LanguageProjectData(language=Language(code='hi-in', name='Hindi'), repository='CuriousLearner/python-docs-hi-in', branch='master', completion=0.004956506654110183, change=0.0, translators=TranslatorsData(number=1, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/CuriousLearner/python-docs-hi-in'), LanguageProjectData(language=Language(code='hu', name='Hungarian'), repository='python/python-docs-hu', branch='master', completion=0.0, change=0.0, translators=TranslatorsData(number=1, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/python/python-docs-hu'), LanguageProjectData(language=Language(code='id', name='Indonesian'), repository='python/python-docs-id', branch='3.14', completion=0.0, change=0.0, translators=TranslatorsData(number=25, link='https://github.com/python/python-docs-id/blob/3.14/TRANSLATORS'), built=True, in_switcher=False, uses_platform=False, contribution_link='https://github.com/python/python-docs-id/blob/master/README.md#berkontribusi-untuk-menerjemahkan'), LanguageProjectData(language=Language(code='it', name='Italian'), repository='python/python-docs-it', branch='3.13', completion=3.351837624842011, change=0.0, translators=TranslatorsData(number=3, link='https://github.com/python/python-docs-it/blob/3.13/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://github.com/python/python-docs-it'), LanguageProjectData(language=Language(code='ja', name='Japanese'), repository='python/python-docs-ja', branch='3.14', completion=49.79430497385443, change=0.04336943322346798, translators=TranslatorsData(number=13, link=False), built=True, in_switcher=True, uses_platform=True, contribution_link='https://explore.transifex.com/python-doc/python-newest/'), LanguageProjectData(language=Language(code='ko', name='Korean'), repository='python/python-docs-ko', branch='3.13', completion=45.986468736834276, change=0.2478253327055029, translators=TranslatorsData(number=23, link='https://github.com/python/python-docs-ko/blob/3.13/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://www.flowdas.com/pages/python-docs-ko.html'), LanguageProjectData(language=Language(code='mr', name='Marathi'), repository='sanketgarade/python-doc-mr', branch='3.9', completion=0.0, change=0.0, translators=TranslatorsData(number=1, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/sanketgarade/python-doc-mr'), LanguageProjectData(language=Language(code='lt', name='Lithuanian'), repository=None, branch='', completion=0.0, change=0.0, translators=TranslatorsData(number=0, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link=None), LanguageProjectData(language=Language(code='fa', name='Persian'), repository='revisto/python-docs-fa', branch='3.13', completion=0.0, change=0.0, translators=TranslatorsData(number=9, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/revisto/python-docs-fa'), LanguageProjectData(language=Language(code='pl', name='Polish'), repository='python/python-docs-pl', branch='3.14', completion=40.93083194964189, change=29.423062625461576, translators=TranslatorsData(number=9, link=False), built=True, in_switcher=True, uses_platform=True, contribution_link='https://explore.transifex.com/python-doc/python-newest/'), LanguageProjectData(language=Language(code='pt', name='Portuguese'), repository=None, branch='', completion=0.0, change=0.0, translators=TranslatorsData(number=0, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link=None), LanguageProjectData(language=Language(code='pt-br', name='Brazilian Portuguese'), repository='python/python-docs-pt-br', branch='3.14', completion=62.121137022626456, change=1.494386756214226, translators=TranslatorsData(number=3, link=False), built=True, in_switcher=True, uses_platform=True, contribution_link='https://explore.transifex.com/python-doc/python-newest/'), LanguageProjectData(language=Language(code='ro', name='Romanian'), repository='python/python-docs-ro', branch='main', completion=1.192039850313499, change=0.49317241208396323, translators=TranslatorsData(number=1, link='https://github.com/python/python-docs-ro/blob/main/TRANSLATORS'), built=True, in_switcher=False, uses_platform=False, contribution_link='https://github.com/python/python-docs-ro'), LanguageProjectData(language=Language(code='ru', name='Russian'), repository='MLGRussianXP/python-docs-ru', branch='3.14', completion=0.19578201283735222, change=0.008673886644692819, translators=TranslatorsData(number=3, link=False), built=False, in_switcher=None, uses_platform=False, contribution_link='https://github.com/MLGRussianXP/python-docs-ru'), LanguageProjectData(language=Language(code='zh-cn', name='Simplified Chinese'), repository='python/python-docs-zh-cn', branch='3.14', completion=96.77950980149191, change=20.155634308939057, translators=TranslatorsData(number=224, link=False), built=True, in_switcher=True, uses_platform=True, contribution_link='https://explore.transifex.com/python-doc/python-newest/'), LanguageProjectData(language=Language(code='es', name='Spanish'), repository='python/python-docs-es', branch='3.13', completion=57.77551981363535, change=0.026021659934073682, translators=TranslatorsData(number=314, link='https://github.com/python/python-docs-es/blob/3.13/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://python-docs-es.readthedocs.io/page/CONTRIBUTING.html'), LanguageProjectData(language=Language(code='zh-tw', name='Traditional Chinese'), repository='python/python-docs-zh-tw', branch='3.13', completion=37.15273475254641, change=1.7174295556491828, translators=TranslatorsData(number=124, link='https://github.com/python/python-docs-zh-tw/blob/3.13/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://github.com/python/python-docs-zh-tw/blob/3.13/README.rst#%E5%8F%83%E8%88%87%E7%BF%BB%E8%AD%AF'), LanguageProjectData(language=Language(code='tr', name='Turkish'), repository='python/python-docs-tr', branch='3.12', completion=4.693811801442344, change=0.0, translators=TranslatorsData(number=30, link='https://github.com/python/python-docs-tr/blob/3.12/TRANSLATORS'), built=True, in_switcher=True, uses_platform=False, contribution_link='https://github.com/python/python-docs-tr/blob/3.12/README.md#%C3%A7eviriye-katk%C4%B1da-bulunmak'), LanguageProjectData(language=Language(code='uk', name='Ukrainian'), repository='python/python-docs-uk', branch='3.13', completion=49.25280662189289, change=0.0, translators=TranslatorsData(number=13, link=False), built=True, in_switcher=False, uses_platform=True, contribution_link='https://explore.transifex.com/python-doc/python-newest/')] - #counts = get_counts(Path('clones', 'cpython', 'Doc', 'build', 'gettext')) - counts = 11, 22 + completion_progress = list(get_completion_progress()) + counts = get_counts(Path('clones', 'cpython', 'Doc', 'build', 'gettext')) env = Environment(loader=FileSystemLoader("templates")) index = env.get_template('index.html.jinja').render( From aa30c9fbb43c495ccfd406166d02024cbed2662a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 25 Jul 2025 12:28:22 +0000 Subject: [PATCH 04/26] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- generate.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/generate.py b/generate.py index c111d23c7..bb63f0372 100644 --- a/generate.py +++ b/generate.py @@ -9,7 +9,7 @@ from pathlib import Path from git import Repo -from jinja2 import Environment, FileSystemLoader, Template +from jinja2 import Environment, FileSystemLoader from urllib3 import PoolManager import build_status @@ -98,7 +98,7 @@ class LanguageProjectData: completion_progress = list(get_completion_progress()) counts = get_counts(Path('clones', 'cpython', 'Doc', 'build', 'gettext')) - env = Environment(loader=FileSystemLoader("templates")) + env = Environment(loader=FileSystemLoader('templates')) index = env.get_template('index.html.jinja').render( completion_progress=completion_progress, generation_time=generation_time, @@ -118,9 +118,7 @@ class LanguageProjectData: language = language_data.language code = language.code - html = lang_template.render( - language=language_data, - ) + html = lang_template.render(language=language_data) Path(f'build/{code}.html').write_text(html) From eaf4773d217f8c0d714b731cd7e2e6c8f57155f5 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych Date: Fri, 25 Jul 2025 15:00:44 +0200 Subject: [PATCH 05/26] Clean up --- .github/workflows/update.yml | 4 ++-- generate.py | 10 +++------- templates/base.html.jinja | 6 +++--- templates/index.html.jinja | 2 +- templates/language.html.jinja | 6 +++++- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index e22c7acfb..227c0468a 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -54,8 +54,8 @@ jobs: if: github.event_name == 'pull_request' run: | curl -Lo index.html-public https://github.com/python-docs-translations/dashboard/raw/refs/heads/gh-pages/index.html - diff --color=always -u index.html-public index.html || : - cat index.html + diff --color=always -u index.html-public build/index.html || : + cat build/index.html - run: uv run generate_metadata.py # generates metadata.html - run: cp metadata.html warnings* build - name: Deploy metadata view 🚀 diff --git a/generate.py b/generate.py index bb63f0372..99b84e3c0 100644 --- a/generate.py +++ b/generate.py @@ -15,7 +15,6 @@ import build_status import contribute from completion import branches_from_devguide, get_completion, TranslatorsData -from counts import get_counts from repositories import Language, get_languages_and_repos generation_time = datetime.now(timezone.utc) @@ -114,12 +113,9 @@ class LanguageProjectData: ) lang_template = env.get_template('language.html.jinja') - for language_data in completion_progress: - language = language_data.language - code = language.code - - html = lang_template.render(language=language_data) - + for project in completion_progress: + code = project.language.code + html = lang_template.render(project=project) Path(f'build/{code}.html').write_text(html) Path('build/style.css').write_bytes(Path('src/style.css').read_bytes()) diff --git a/templates/base.html.jinja b/templates/base.html.jinja index 3f20c380b..09c15b679 100644 --- a/templates/base.html.jinja +++ b/templates/base.html.jinja @@ -3,7 +3,7 @@ -{# #} + @@ -29,10 +29,10 @@ Translating diff --git a/templates/index.html.jinja b/templates/index.html.jinja index 1be039804..4a437f211 100644 --- a/templates/index.html.jinja +++ b/templates/index.html.jinja @@ -5,7 +5,7 @@
{% for project in completion_progress | sort(attribute='completion,translators.number') | reverse %}
- +
{{ project.language.name }} ({{ project.language.code }})
Completion: {{ '{:.2f}%'.format(project.completion) }}
diff --git a/templates/language.html.jinja b/templates/language.html.jinja index 42ed26b1a..5c9e9d903 100644 --- a/templates/language.html.jinja +++ b/templates/language.html.jinja @@ -1,5 +1,9 @@ {% extends "base.html.jinja" %} {% block main %} -

{{ language.name }}

+ {% if project.built %} +

{{ project.language.name }}

+ {% else %} +

{{ project.language.name }}

+ {% endif %} {% endblock %} From 14040d8f863734f2d70e2126f43d1d015fc79130 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych Date: Fri, 25 Jul 2025 15:04:28 +0200 Subject: [PATCH 06/26] !fixup Cleanup --- generate.py | 1 + 1 file changed, 1 insertion(+) diff --git a/generate.py b/generate.py index 99b84e3c0..de4339cf8 100644 --- a/generate.py +++ b/generate.py @@ -15,6 +15,7 @@ import build_status import contribute from completion import branches_from_devguide, get_completion, TranslatorsData +from counts import get_counts from repositories import Language, get_languages_and_repos generation_time = datetime.now(timezone.utc) From d6640d59a126786b55e269f3328ea2219f412826 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych Date: Fri, 25 Jul 2025 15:06:59 +0200 Subject: [PATCH 07/26] refactoring --- templates/chart.html.jinja | 7 ++++++- templates/metadata.html.jinja | 18 ++++-------------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/templates/chart.html.jinja b/templates/chart.html.jinja index 6190b4372..40ca75804 100644 --- a/templates/chart.html.jinja +++ b/templates/chart.html.jinja @@ -32,7 +32,12 @@ {% endfor %}
- +

* the number in parentheses shows change in the last 30 days, included in the total completion

+

+Currently being translated into {{ completion_progress|length }} languages. +The documentation has a total string count of {{ '{:,}'.format(counts[0]) }} ({{ '{:,}'.format(counts[1]) }} words). +For more information about translations, see the Python Developer’s Guide. +


You can download the data on this page in JSON format.

You can also find the scripts used to generate these pages here.

diff --git a/templates/metadata.html.jinja b/templates/metadata.html.jinja index b79b33670..9633586ec 100644 --- a/templates/metadata.html.jinja +++ b/templates/metadata.html.jinja @@ -1,15 +1,6 @@ - - - Python Docs Translation Dashboard - - - - - -

Python Docs Translation Dashboard

- +{% extends "base.html.jinja" %} + +{% block main %} @@ -38,5 +29,4 @@

* number of Sphinx build process warnings

Last updated at {{ generation_time.strftime('%A, %-d %B %Y, %-H:%M:%S %Z') }} (in {{ duration // 60 }}:{{ "{:02}".format(duration % 60) }} minutes).

- - +{% endblock %} From f260ff51e53f31a75f73dd00268f4dbee22401f4 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych Date: Fri, 25 Jul 2025 15:20:30 +0200 Subject: [PATCH 08/26] Little fixes --- generate_metadata.py | 4 ++-- templates/base.html.jinja | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/generate_metadata.py b/generate_metadata.py index 6ac64dafd..4b921842d 100644 --- a/generate_metadata.py +++ b/generate_metadata.py @@ -56,8 +56,8 @@ def get_language_repo_and_completion( logging.basicConfig(level=logging.INFO) logging.info(f'starting at {generation_time}') template = Template(Path('templates/metadata.html.jinja').read_text()) - if (index_path := Path('index.json')).exists(): - index_json = loads(Path('index.json').read_text()) + if (index_path := Path('build/index.json')).exists(): + index_json = loads(Path('build/index.json').read_text()) else: index_json = request('GET', argv[1]).json() diff --git a/templates/base.html.jinja b/templates/base.html.jinja index 09c15b679..e4b7eefe5 100644 --- a/templates/base.html.jinja +++ b/templates/base.html.jinja @@ -17,7 +17,7 @@