Getting started
Installation
A translate script is provided to facilitate working with pandoc and deepl translation services.
-
To install development version use:
-
Install script requirements, and check it runs:
-
This script requires pandoc be installed:
Ubuntu:
macOS:
Reference
Project setup
-
A working example is provided to be adapted for your project.
-
Create requirements.txt with mkdocs plugins required.
-
Create mkdocs.yml, the navigation tree is initially empty.
# Project information site_name: MkDocs Translate site_description: Example sphinx-build documentation project for use with mkdocs_translate script. site_dir: build/html site_url: http://jodygarnett.github.io/translate # Repository repo_name: translate repo_url: https://github.com/jodygarnett/translate edit_uri: edit/main/example/docs # Copyright copyright: Copyright © 2024 Open Source Geospatial Foundation extra_css: - assets/stylesheets/extra.css # Configuration theme: name: material language: en custom_dir: overrides # logo: assets/images/geoserver_mark.png # favicon: assets/images/geoserver_mark.png icon: repo: fontawesome/brands/github palette: # Palette toggle for light mode - media: "(prefers-color-scheme: light)" scheme: default primary: blue toggle: icon: material/weather-night name: Switch to dark mode # Palette toggle for dark mode - media: "(prefers-color-scheme: dark)" scheme: slate toggle: icon: material/weather-sunny name: Switch to light mode features: - content.action.view - content.action.edit - content.code.copy - content.tabs.link - navigation.tracking - navigation.prune - navigation.indexes - toc.follow - navigation.top - navigation.footer - announce.dismiss # Plugins - install using: pip3 install -r requirements.txt plugins: - exclude: glob: - '**/download/download.txt' - include-markdown: preserve_includer_indent: true dedent: true comments: false - macros: render_by_default: false on_error_fail: true on_undefined: strict j2_block_start_string: '[[%' j2_block_end_string: '%]]' - search # Customizations hooks: - download.py extra: homepage: http://jodygarnett.github.io/translate social: - icon: fontawesome/brands/github link: ttps://github.com/jodygarnett/translate version: '0.9' release: '0.9.5' # Extensions # - These are carefully chosen to work with pandoc markdown support for whole document translation markdown_extensions: - admonition - attr_list - def_list - pymdownx.details - pymdownx.emoji: emoji_index: !!python/name:material.extensions.emoji.twemoji emoji_generator: !!python/name:material.extensions.emoji.to_svg options: custom_icons: - overrides/.icons - pymdownx.highlight: anchor_linenums: true line_spans: __span pygments_lang_class: true - pymdownx.inlinehilite - pymdownx.keys - pymdownx.smartsymbols - pymdownx.superfences: - pymdownx.tabbed: alternate_style: true - tables - md_in_html # Validation validation: nav: omitted_files: info not_found: warn absolute_links: info links: not_found: warn absolute_links: info unrecognized_links: info not_in_nav: | **/download/*.md # Page tree nav: - Home: index.md -
Create
build/folder for temporary files during migration.Note
If converting a maven project use of the existing
target/folder can be configured below. -
Define
.gitingoreto avoid adding generated artifacts to version control. -
The resulting directory structure is:
docs/ source/ .gitignore download.py mkdocs.yml requirements.txt
Download Hook
Optional: If your content uses download directive to include external content, there is a mkdocs hook for processing of download.txt files.
-
Create download.py.
import glob import logging import mkdocs.plugins import os import shutil log = logging.getLogger('mkdocs') @mkdocs.plugins.event_priority(-50) def on_pre_build(config, **kwargs): docs_dir = config['docs_dir'] # print(docs_dir) pattern = os.path.normpath(os.path.join(docs_dir, '**', 'download', 'download.txt')) for download_txt in glob.glob(pattern, recursive=True): download_folder = os.path.dirname(download_txt) donload_txt_path = os.path.relpath(download_txt,docs_dir) log.debug(f"Download {donload_txt_path} ...") with open(download_txt, 'r') as file: path_list = file.read() downloads=['download.txt','.gitignore'] for path in path_list.splitlines(): if len(path.strip()) == 0 or path.startswith('#'): continue resolved = os.path.normpath(os.path.join(download_folder, path)) if os.path.exists(resolved): dest = os.path.normpath(os.path.join(download_folder, os.path.basename(path))) if not os.path.exists(dest) or (os.stat(resolved).st_mtime - os.stat(dest).st_mtime > 1): log.info(f"Download '{dest}' updated") shutil.copyfile(resolved, dest, follow_symlinks=True) else: log.info(f"Download '{resolved}' up to date") downloads.append(os.path.basename(dest)) else: log.warning(f"Download '{resolved}' not found") for file in os.listdir(download_folder): if os.path.basename(file) not in downloads: log.warning(f"Download '{os.path.basename(file)}' removed") os.remove(file) -
Register hook with
mkdocs.yml:Note
See writing guide Download of external file for example on how to use this hook.
-
The resulting directory structure is:
docs/ source/ download.py mkdocs.yml requirements.txt
Configuration
For simple python sphinx-build setup and directory structure no configuration is required.
Optional: To provide configuration for your project:
-
Create a translate.yml to configure script for your project.
# translate script configuration python project project_folder: "." docs_folder: "docs" build_folder: "build" # mkdocs migration rst_folder: "source" anchor_file: 'anchors.txt' convert_folder: "migrate" substitutions: project: MkDocs Translation Example author: Open Source Geospatial Foundation copyright: 2024, Open Source Geospatial Foundation project_copyright: 2024, Open Source Geospatial Foundation extlinks: github: https://github.com/jodygarnett/translate/blob/main/%s release: https://github.com/jodygarnett/translate/releases/tag/{{ release }}|Release {{ release }} squidfunk: https://squidfunk.github.io/mkdocs-material/%s macro_ignore: - setup/index.md nav: index.md: Home 'translate/index.md': Translate 'translate/migrate.md': Migrate guide/index.md: Guide # markdown internationalization deepl_base_url: "https://api-free.deepl.com" upload_folder: "upload" download_folder: "download"Note
The example above is for the example project, with
projectandauthorsubstitutions. This project also hasextlinksdefined that need to be known upfront during migration. -
Optional: Maven project translate.yml configuration recommendations.
# translate script configuration maven project project_folder: "." docs_folder: "docs" build_folder: "target" # mkdocs migration rst_folder: "source" anchor_file: 'anchors.txt' convert_folder: "migrate" # markdown internationalization deepl_base_url: "https://api-free.deepl.com" upload_folder: "translate" download_folder: "translate" -
The resulting directory structure is:
docs/ source/ .gitignore translate.yml mkdocs.yml requirements.txt
The configuration settings are:
project_folder:.-
Default assumes you are running from the current directory.
docs_folder:docs-
mkdocs convention.
build_folder:build-
The use of
buildfollows sphinx-build and mkdocs convention, maven projects may wish to usetarget. rst_folder:source-
Location of sphinx-build documentation to migrate to mkdocs.
anchor_file:anchors.txt-
Name of index file used to lookup anchor and title information during migration.
convert_folder:migrate-
Combined with
build_folderfor rst conversion temporary files (example:build/migrate). Temporary files are required for use by pandoc. upload_folder:upload-
Combined with
build_folderto stage html files for internationalization (example:build/upload) deepl_base_url:https://api-free.deepl.com-
Customize if you have a subscription to deepl.
download_folder:download-
Combined with
build_folderto retrieve internationalization results (example:build/download) Temporary files are required for use by pandoc. substitutions:-
dictionary of
|substitutions|to use when converting config.py rst_epilog common substitutions.project: GeoServer author: Open Source Geospatial Foundation copyright: 2023, Open Source Geospatial Foundation project_copyright: 2023, Open Source Geospatial FoundationThe built-in substitutions for
{{ version }}and{{ release }}are changed to{{ version }}and{{ release }}variables for use withmkdocs-macros-pluginvariable substitution:Use
mkdocs.ymlto define these variable substitutions: extlinks:-
dictionary of config.py extlinks substitutions taking the form:
extlinks: wiki: https://github.com/geoserver/geoserver/wiki/%s user: https://docs.geoserver.org/{{ branch }}/en/user/%s geos: https://osgeo-org.atlassian.net/browse/GEOS-%s|GEOS-%s download_release: https://sourceforge.net/projects/geoserver/files/GeoServer/{{ release }}/geoserver-{{ release }}-%s.zip|geoserver-{{ release }}-%s.zipNote
Use of
mkdocs-macros-pluginfor variable substitution ofreleaseabove.Use of
|GEOS-%sto override default link text%s.This handles the sphinx-build
config.pyextlinks during migration:extlinks = { 'wiki': ('https://github.com/geoserver/geoserver/wiki/%s', '%s'), 'user': ('https://docs.geoserver.org/'+branch+'/en/user/%s', '%s'), 'geos': ('https://osgeo-org.atlassian.net/browse/GEOS-%s','GEOS-%s'), 'download_release': ('https://sourceforge.net/projects/geoserver/files/GeoServer/' + release + '/geoserver-' + release + '-%s.zip', 'geoserver-' + release + '-%s.zip ) } macro_ignore:-
Use of
mkdocs-macros-plugincan conflict with code examples.This script adds the YAML header to enable macros to better support the use
{{ version }}and{{ release }}. If you find this accidentially is triggered by code examples you can add an ignore. nav:-
Provide simplified title for navigation, incase
toctreetitle is too long. Most often used to override top-levelindex.rsttitle as "Home".